JS 生成一组不重复的随机数

随机产生一组介于指定范围不重复的随机数。

1.主要实现

/// <summary>
/// 生成一个指定范围的随机数
/// </summary>
/// <param name="start">起始值</param>
/// <param name="end">终止值</param>
function newNumber(start,end){
    return Math.round(Math.random()*(end-start)+start);//生成在[start,end]范围内的随机数值,只支持不小于0的合法范围
}
/// <summary>
/// 目标数字是否已经存在于现有数字集合中
/// </summary>
/// <param name="para">现有数字集合</param>
/// <param name="num">目标数字</param>
function isHaveThisNumber(para,num){
    //拒绝无效的数组
    if(typeof(para) == "object")
    {
        if(para.length==0)
        {
            NGLogger.Info("数组为空");
            return false;
        }
    }
    for(var i=0;i<para.length;i++){
        if(para[i]==num){
            NGLogger.Info("与第【"+(i+1)+"】个元素重复,正在重新生成...");
            return true;//与目标数组有重复
        }
    }
    return false;
}
/// <summary>
/// 生成一个不重复的随机数数组
/// </summary>
/// <param name="start">起始值</param>
/// <param name="end">终止值</param>
/// <param name="size">随机数大小</param>
function newRandomNumbersWithNoRepeat(start,end,size){
    var para=new Array();//目标随机数组
    var rnum;//当前随机数
    var currentIndex=0;//当前随机数组的索引
    if(start>end||start<0||end<0||size<0){
        NGLogger.Info("无效参数");
        return;
    }
    if(end-start+1<size){//验证随机数个数是否超出随机数范围
        NGLogger.Info("随机数范围大于随机区间");
        return;
    }
    for(var i=0;i<size;i++){//生成 size 个不重复的随机数
        rnum=newNumber(start,end);//获取随机数
        if(isHaveThisNumber(para,rnum)){//是否已经存在
            while(isHaveThisNumber(para,rnum)){//获取新的随机数 直到不重复
                rnum=newNumber(start,end);//重新获取随机数
                NGLogger.Info("发现新的随机数:"+rnum);
            }
        }
        para[currentIndex++]=rnum;//添加到现有数字集合中
    }
    return para;
}

2.测试一下:

function AppMain(){
    var para=newRandomNumbersWithNoRepeat(1,2000,1000);//生成1到2000范围内
    NGLogger.Info("已经生成"+para.length+"个随机数。\n随机序列为:"+para.toString());
}

3.运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值