获取指定范围内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));其他版本的代码只要按照上面的思路书写即可