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

本文介绍了一种在指定范围内生成N个不重复随机数的方法,并提供了JavaScript和ActionScript两种实现方式。

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

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


在项目开发中我们经常需要获取一些不重复的数字,为此我写了一个通用的方法。思路是建立一个数组,每随机产生一个新的数字就查询一遍数组,如果该数字存在于数组中则跳过,重新产生新的随机数,如果不存在则往数组中存入生成的数字,如此循环N(你所要获取的个数)遍。最后返回生成好的数组(可选择是否对数组排序)。
代码如下:
-------------------------------------------------------------
javascript版本:
[html]
<script language="JavaScript">
/*
          +---------------------------------------------------------------------------------------+
          | Project...........: 获取指定范围内N个不重复的随机数                          |
          | Version..........: 1.0                                                                                    |
          | Last Modified..: 2006-11-16                                                                        |
          | Author...........: Flyingfish                                 |
          | Homepage.....: http://www.youkuaiyun.com                                            |
          | Support.........: penglongxiang##gmail.com (将##替换成@)                 |
          | Copyright (C) 2006 Flyingfish                                                                      |
          | 转载请注明作者,出处.基本版权,谢谢!!!                                      |
          +---------------------------------------------------------------------------------------+
*/
function getRndNum(minInt,maxInt,num,order) {
        //随机产生num个minInt-maxInt之间的不重复数
        var num = parseInt(num);
    if (num>maxInt-1)
    {
        alert("超出获取上限!最多获取"+(maxInt-minInt-1)+"个不重复随机数字。")
        return false;
    }
        //建立长度为num的数组
        var numArr = new Array(num);
        //当前已有个数
        var tempnum = 1;
        //初始化数组数据
        numArr[tempnum-1] = Math.floor(Math.random()*(maxInt-minInt))+minInt;
    if(num>1){
        do {
            //新产生的数字
            var newInt = Math.floor(Math.random()*(maxInt-minInt))+minInt;
            //代表是否重复,0不重复,1重复
            var isRepeat = false;
            //开始遍历已有数组中数字,与新产生的数字比较是否存在,如存在则为1
            for (i=0; i<tempnum; i++) {
                if (newInt == numArr) {
                    isRepeat = true;
                    break;
                }
            }
            //如果不重复则加入数组
            if (!isRepeat) {
                //个数加1
                tempnum++;
                //往数组中存入数据
                numArr[tempnum-1] = newInt;
            }
        } while (tempnum<num);
        //排序,如果order=-1,则按从小到大排列,如果order为1则按从大到小排列,其他不改变顺序
        if (order == -1) {
            numArr.sort(new Function("a","b","return a-b;"));
        }
        if (order == 1) {
            numArr.sort(new Function("a","b","return b-a;"));
        } 
    }
        return numArr;
}

//测试
//document.write("35选7:<font color='red'>"+getRndNum(1, 35, 5.5,-1)+"</font><br />")
//document.write("双色球:<font color='red'>"+getRndNum(1, 33, 6,-1)+"</font>  <font color='blue'>"+getRndNum(1, 16,1)+"</font>")
</script>
[/html]
--------------------------------------------------
ActionScript版本:
/*
          +---------------------------------------------------------------------------------------+
          | Project...........: 获取指定范围内N个不重复的随机数                          |
          | Version..........: 1.0                                                                                    |
          | Last Modified..: 2006-11-16                                                                        |
          | Author...........: Flyingfish                                 |
          | Homepage.....: http://www.youkuaiyun.com                                                |
          | Support.........: penglongxiang##gmail.com (将##替换成@)                 |
          | Copyright (C) 2006 Flyingfish                                                                      |
          | 转载请注明作者,出处.基本版权,谢谢!!!                                      |
          +---------------------------------------------------------------------------------------+
*/

function getRndNum(minInt:Number, maxInt:Number, num:Number, order:Number) {
        //随机产生num个minInt-maxInt之间的不重复数
        var num = num;
        if (num>maxInt-1) {
                trace("超出获取上限!最多获取"+(maxInt-minInt-1)+"个不重复随机数字。");
                return false;
        }
        //建立长度为num的数组
        var numArr:Array = new Array(num);
        //当前已有个数
        var tempnum = 1;
        //初始化数组数据
        numArr[tempnum-1] = random(maxInt-minInt)+minInt;
        if (num>1) {
                do {
                        //新产生的数字
                        var newInt:Number = random(maxInt-minInt)+minInt;
                        //代表是否重复,0不重复,1重复
                        var isRepeat:Boolean = false;
                        //开始遍历已有数组中数字,与新产生的数字比较是否存在,如存在则为1
                        for (i=0; i<tempnum; i++) {
                                if (newInt == numArr) {
                                        isRepeat = true;
                                        break;
                                }
                        }
                        //如果不重复则加入数组
                        if (!isRepeat) {
                                //个数加1
                                tempnum++;
                                //往数组中存入数据
                                numArr[tempnum-1] = newInt;
                        }
                } while (tempnum<num);
                //trace("数组:"+numArr);
                //排序,如果order=-1,则按从小到大排列,如果order为1则按从大到小排列,其他不改变顺序
                if (order == 1) {
                        numArr.sort(Array.DESCENDING);
                }
                if (order == -1) {
                        numArr.sort(Array.NUMERIC);
                }
        }
        return numArr;
}
//测试
//trace(getRndNum(32, 85, 32, -1));
其他版本的代码只要按照上面的思路书写即可 

<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)。 --- 通过上述方法,你可以灵活生成任意范围的随机整数或浮点数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值