首頁  >  問答  >  主體

javascript - 如何產生一組不重複的六位數隨機數

要求產生一個數組,裝六位隨機數,而這些隨機數不能重複。
(數組內裝多個隨機數,每個隨機數為六位數,數組內的隨機數不重複)

可以參考下面兩個程式碼,可以把這兩個結合起來。

//随机六位数
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 天前1430

全部回覆(6)我來回復

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新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);

    回覆
    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個組合。

    回覆
    0
  • 仅有的幸福

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

    給你一個簡單好用的吧,如上不能保證絕對不重複,如果重複了記得去買彩券。 Math.random().toString(36).slice(2,8)

    回覆
    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寫得不好(逃

    回覆
    0
  • 黄舟

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

    寫個循環每次產生一個隨機數丟進set set夠長了就轉成數組回傳

    回覆
    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:");

    回覆
    0
  • 取消回覆