获取指定范围内的不重复随机数

本博客介绍了一个Java程序,用于生成指定范围内不重复的随机数,并对其进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.wzs;

import java.util.Arrays;
import java.util.Random;

/**
 * 获取指定范围内的不重复随机数
 * 
 * @author wWX154783
 * 
 */
public class Test
{
    public static void main(String[] args)
    {
        int[] arrIntger = rang(2, 50, 48);
        Arrays.sort(arrIntger);// 排序
        System.out.println(Arrays.toString(arrIntger));
    }

    static int[] rang(int startNumber, int endNumber, int count)
    {
        int total = 0;// 已经生成数据量
        boolean flag = false;// 是否重复,true 重复,false 不重复

        int[] intArray = new int[count];
        Random random = new Random();
        int intTemp;// 随机生成的临时数据
        if (count > (endNumber - startNumber))
        {
            System.out.print("生成数据总量不能大于 " + (endNumber - startNumber) + " !");
            System.exit(0);
        }
        while (total < count)
        {
            intTemp = random.nextInt(endNumber - startNumber + 1) + startNumber;
            // 判断是否与生成的数据相等
            for (int j = 0; j < total; j++)
            {
                if (intTemp == intArray[j])
                {
                    flag = true;
                    break;
                }
                else
                {
                    flag = false;
                }
            }
            if (false == flag)
            {
                intArray[total] = intTemp;
                total++;
            }
        }

        return intArray;
    }
}

输出结果:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]



<think>好的,我现在需要帮助用户了解如何在C语言中获取指定范围内随机数。让我先回想一下相关知识,确保自己理解正确。 首先,C语言中生成随机数的函数是rand(),它位于stdlib.h头文件中。但rand()返回的是0到RAND_MAX之间的整数,通常是0到32767。所以用户的问题是如何将这个范围转换到自己需要的区间,比如从min到max。 接下来,我需要考虑如何转换。常见的做法是使用模运算,比如rand() % (max - min + 1) + min。例如,想要1到100的数,就是rand() % 100 +1。过,这里可能存在一个问题,就是模运算可能导致分布均匀,特别是当RAND_MAX+1能被范围大小整除时,某些数的概率会更高。过对于一般应用,这种方法可能已经足够,但如果是高要求的场景,可能需要更精确的方法。 然后,用户可能需要注意,在使用rand()之前需要用srand()来初始化随机数种子,通常用当前时间作为种子,比如srand(time(0))。这样每次程序运行时种子同,生成的序列也会同。 另外,有时候可能需要生成浮点数范围内随机数,比如0到1之间的浮点数,然后再缩放到目标范围。例如:(double)rand() / RAND_MAX * (max - min) + min。这部分是否需要包含?用户的问题是指定范围,可能包括整数和浮点数,但题目中C语言通常处理整数随机数较多,但也可以提及浮点数的情况。 还需要注意rand()函数的伪随机性,以及可能的质量问题。比如,某些实现中的低位可能够随机,所以更推荐使用高位,比如用rand() / (RAND_MAX / (max - min + 1) + 1)的方法,过这可能比较复杂,用户可能需要简单的方法。 现在,我需要组织步骤,从初始化种子开始,到生成特定范围的数。然后给出示例代码,并解释每个部分的作用。同时,提醒用户注意常见问题,比如初始化种子导致每次运行结果相同,或者模运算的分布问题。 可能的错误点:用户可能忘记包含stdlib.h和time.h,或者忘记调用srand(),导致每次生成的随机数序列相同。需要指出这些注意事项。 总结步骤: 1. 包含必要的头文件。 2. 使用srand()初始化种子。 3. 使用rand()生成随机数,并用模和加法调整范围。 4. 处理可能的分布均匀问题(可选)。 5. 给出整数和浮点数的示例代码。 然后,我需要验证这些步骤是否正确。例如,当范围是5到10时,max - min +1等于6,所以rand() %6得到0-5,加上5得到5-10。这正确。浮点数的例子,比如生成0.0到1.0之间的数,再缩放到其他范围,比如5.0到10.0,是否正确? 同时,要提醒用户RAND_MAX的值可能因编译器同而同,但通常足够大。过,在需要更大范围时可能需要其他方法。 现在,把这些内容结构化,用中文清晰地解释每个步骤,并给出代码示例,注意事项等。</think>在C语言中获取指定范围内随机数需要结合`rand()`函数和范围调整计算。以下是详细步骤说明: --- ### 一、基础步骤 1. **包含头文件** ```c #include <stdlib.h> // 提供rand()和srand() #include <time.h> // 提供time() ``` 2. **初始化随机种子** ```c srand(time(0)); // 以当前时间作为种子,确保每次运行结果同 ``` 3. **生成指定范围的随机整数** - **公式**:`随机数 = rand() % (max - min + 1) + min` - **示例**:生成5~10的随机整数 ```c int num = rand() % (10 - 5 + 1) + 5; // rand()%6 +5 → 5~10 ``` --- ### 二、完整代码示例(整数范围) ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); // 初始化随机种子 int min = 5, max = 10; int num = rand() % (max - min + 1) + min; printf("随机数:%d\n", num); return 0; } ``` --- ### 三、生成浮点数范围 若需要生成浮点数(如5.0~10.0): ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); double min = 5.0, max = 10.0; double num = (double)rand() / RAND_MAX * (max - min) + min; printf("随机浮点数:%.2f\n", num); return 0; } ``` --- ### 四、注意事项 1. **种子初始化问题**: - 必须调用`srand()`,否则每次程序运行会生成相同的随机序列。 - 避免在循环中重复初始化种子(例如每次调用`rand()`前都调用`srand()`),这会导致生成重复值。 2. **均匀分布问题**: - `rand() % N`可能略微偏向小数值(当`RAND_MAX % N != 0`时)。 - 对精度要求高的场景,建议使用高位随机比特: ```c int num = (int)((double)rand() / (RAND_MAX + 1.0) * (max - min + 1)) + min; ``` 3. **RAND_MAX的值**: - 标准规定至少为32767,实际值可通过`printf("%d", RAND_MAX);`查看。 --- ### 五、扩展场景 - **排除边界值**:若需要`(min, max)`开区间,调整公式为: ```c int num = rand() % (max - min - 1) + min + 1; // 例如5 < num <10 →6~9 ``` - **自定义分布**:若需要非均匀分布(如正态分布),需使用第三方库(如GSL)。 --- 通过上述方法,你可以灵活生成任意范围的随机整数或浮点数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值