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