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

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


在项目开发中我们经常需要获取一些不重复的数字,为此我写了一个通用的方法。思路是建立一个数组,每随机产生一个新的数字就查询一遍数组,如果该数字存在于数组中则跳过,重新产生新的随机数,如果不存在则往数组中存入生成的数字,如此循环N(你所要获取的个数)遍。最后返回生成好的数组(可选择是否对数组排序)。
代码如下:
-------------------------------------------------------------
javascript版本:
[html]
<script language="JavaScript">
/*
          +---------------------------------------------------------------------------------------+
          | Project...........: 获取指定范围内N个不重复的随机数                          |
          | Version..........: 1.0                                                                                    |
          | Last Modified..: 2006-11-16                                                                        |
          | Author...........: Flyingfish                                 |
          | Homepage.....: http://www.csdn.net                                            |
          | 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.csdn.net                                                |
          | 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));
其他版本的代码只要按照上面的思路书写即可 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值