评论

获取不重复的随机数算法

返回不重复的随机数数组。


参数count:获取随机数的个数
参数total:总共的个数
返回值:随机的数组
randomtimu: function (count,total){
var sequence = new Array(total)
var output = new Array(count)

for (let i = 0; i < total; i++)
{
  sequence[i] = i
}
let end = total - 1
for (let i = 0; i < count; i++)
{
  var num = Math.floor(Math.random() * (end + 1))
  output[i] = sequence[num]
  sequence[num] = sequence[end]
  end--
}

return output

},

点赞 1
收藏
评论

3 个评论

  • 酸奶
    酸奶
    2019-05-20

    前几天我也写了一个,其实直接利用数组的去重算法即可,如果想得到一个固定元素数量的数组,再进行补位:

    var sortN = function(a, b) {
        return a-b;
    };
     
    var remDupl = function(nums = []) {
        let res = [];
        let i = 0;
     
        for (let j = i; j < nums.length; j++) {
            if (nums[j] != nums[i]) {
                i++;
                nums[i] = nums[j];
            }
        }
        res = nums.splice(0, i+1);
        return res;
    }
     
    var randomN = function(len, max) {
        let res = [];
     
        while (res.length < len) {
            for (let i = 0; i < (len-res.length); i++) {
                let c = Math.floor(Math.random() * max) + 1;
                res.push(c);
                res.sort(sortN);
                res = remDupl(res);
            }
        }
     
        return res;
    }


    调用函数的时候加上需要的数组长度和随机数范围即可(之前我写这段程序的目的是一个简单的彩票摇号器)

    比如我需要一个5+2的随机数组合数组:

    var res1 = [];
    var res2 = [];
     
    res1 = randomN(5, 50);
    res2 = randomN(2, 12);
    res = res1.concat(res2);
     
    console.log(res);


    望指点

    2019-05-20
    赞同 2
    回复
  • 贾荣涛
    贾荣涛
    2019-05-21

    function randomN(len,max,min=0,step=1){     var arr = Array.apply(null,{length:Math.floor((max-min)/step)}).map((value,index)=>index*step+min)     var returnVal = []     for(let i=0;i<len;i++){         var ran = Math.floor(Math.random()*arr.length)         returnVal.push(arr.splice(ran,1)[0])     }     return returnVal } 弟弟写法留头不留尾望指点

    2019-05-21
    赞同 1
    回复
  • 天道
    天道
    2019-05-22

    用递归没问题吧?如果取得值和之前相同 就在自己调自己(递归) ,不相同取出来。

    2019-05-22
    赞同
    回复
登录 后发表内容