Heim  >  Fragen und Antworten  >  Hauptteil

javascript – So generieren Sie einen Satz sich nicht wiederholender sechsstelliger Zufallszahlen

Es ist erforderlich, ein Array mit sechs Zufallszahlen zu generieren, und diese Zufallszahlen können nicht wiederholt werden.
(Das Array enthält mehrere Zufallszahlen, jede Zufallszahl besteht aus sechs Ziffern und die Zufallszahlen im Array werden nicht wiederholt)

Sie können sich auf die folgenden beiden Codes beziehen und diese kombinieren.

//随机六位数
function MathRand()
{
    var Num="";
    for(var i=0;i<6;i++)
    {
        Num+=Math.floor(Math.random()*10);
    }
}
//不重复随机数组
/*  num 要产生多少个随机数
    from 产生随机数的最小值
    to 产生随机数的最大值   */
function createRandom(num ,from ,to )
{
    var arr=[];
    for(var i=from;i<=to;i++)
        arr.push(i);
    arr.sort(function(){
        return 0.5-Math.random();
    });
    arr.length=num;
    return arr;
}
 
function createRandom2(num , from , to)
{
    var arr=[];
    var json={};
    while(arr.length<num)
    {
        //产生单个随机数
        var ranNum=Math.ceil(Math.random()*(to-from))+from;
        //通过判断json对象的索引值是否存在 来标记 是否重复
        if(!json[ranNum])
        {
            json[ranNum]=1;
            arr.push(ranNum);
        }
         
    }
    return arr;
     
     
}
alert(createRandom2(10,0,50));//生成10个从0-50之间不重复的随机数
过去多啦不再A梦过去多啦不再A梦2710 Tage vor1431

Antworte allen(6)Ich werde antworten

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:41:10

    这个可以通过一个递归来完成。为了演示方便,我改成了生成一组不重复的 10 以内的正整数随机数。
    主要依靠的方法就是 indexOf() 方法,用来找某个值在数组中的索引,如果数组中没有,则返回 -1 。
    代码如下:

    var arr=[];
    function getRandom(){
        var random=Math.floor(Math.random()*1000000);
        console.log(random);
        //判断生成的数在数组中是否存在,判断是否是6位数
        //如果不存在而且是6位数,放入数组
        if(random.toString().length==6&&arr.indexOf(random)==-1){     
            arr.push(random)
        }else{
        //如果存在或者不是6位数,接着调用这个函数,生成满足要求的随机数
            console.log("不符合要求的"+random)
            getRandom();
        }
    }
    for(var i=0;i<6;i++){
        getRandom();
    }
    console.log(arr);

    Antwort
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:41:10

    时间是不会重复的,利用时间戳来生成随机数也不会重复。

    console.log((Math.random() * Date.now()).toFixed(0));
    // 6位的
    console.log((Math.random() * Date.now() / 1000000).toFixed(0));

    并且这个世界上一定意义的说是没有绝对的不重复随机数, 所有的组合都不是无限的, 即使把所有已生成的随机数都储存起来,然后生成的时候进行对比,发现已经存在则生成新的随机数, 当所有的组合都已经尝试完毕的时候,最终也会形成死循环。 更何况才区区6位数, 总共也才472392个组合。

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:41:10

    给你一个简单好用的吧,如上不能保证绝对不重复,如果重复了记得去买彩票。Math.random().toString(36).slice(2,8)

    Antwort
    0
  • 黄舟

    黄舟2017-05-19 10:41:10

    不重复随机数列生成算法
    看到一篇文章挺巧妙的,结果和效率都能保证,用代码+注释实现一下:

    function getRandom(numCount) {
            var numList = [];
            var numMin = 100000;
            var numMax = 999999;
            var listLen = numMax - numMin + 1;
    
            var outPut = [];
    
            // 将所有数顺序装填到数字列表中
            for (var i = numMin; i < numMax + 1; i++) {
                numList.push(i);
            }
    
            var randNum;
            for (var j = 0; j < numCount; j++) {
                // 产生一个小于列表长度的随机数randNum
                randNum = Math.floor(Math.random() * listLen);
                // 将列表的第randNum项输出
                outPut.push(numList[randNum]);
                // 将列表的最后一项替换到刚被取出的数的位置
                numList[randNum] = numList[listLen - 1];
                // 列表长度减一,即列表最后一项不会再被取到;
                listLen--;
            }
    
            return outPut;
        }
        var arr = getRandom(30);
        console.log(arr);

    JS写得不好(逃

    Antwort
    0
  • 黄舟

    黄舟2017-05-19 10:41:10

    写个循环每次产生一个随机数丢进set set够长了就转成数组返回

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-19 10:41:10

    数组里需求的数少的话 可以换用数组的方法判断

    console.time('time:');
    function createRandomArr(l){
        var r = [];
        var o = {};
        var a;
        for (var i = 0;i < l;i++){
            a = Math.random().toString().slice(2,8);
            o[a] ? i-- : (r.push(a),o[a] = true);
        }
        return r;
    }
    var res = createRandomArr(10000);
    console.log(res,res.length);
    console.timeEnd("time:");

    Antwort
    0
  • StornierenAntwort