创建一个非重复随机数生成器

时间:2015-08-26 02:17:09

标签: javascript

我正在创建一个随机数生成器。我得到了数字,但有时会重复。这是我的代码

var myRandom

function randomNumGen(max, min) {
var randomNum = [];

for (var i = 0; i < 6; i++) {
    randomNum[i] = Math.random() * (max - min +1) + min ;
    randomNum[i] = Math.round(randomNum[i]);
}
return randomNum;
}
myRandom = randomNumGen(1, 53);
console.log(" Here are your numbers." + myRandom);

为了使数字不重复,我缺少什么?

4 个答案:

答案 0 :(得分:1)

我看到实现这一点的方法是检查生成的每个随机数与数组中已有的数字。如果有一个重复的数字,你会生成另一个随机数并再次检查,直到你找到一个唯一的数字。

答案 1 :(得分:1)

也许是这样的:

function range(start, stop) {
  var array = [];

  for (var i = start; i <= stop; i += 1) {
     array.push(i);
  }

  return array; 
}

var nums = range(1, 53).sort(function () { 
   return (Math.random() < 0.5) ? 1 : -1; 
}).slice(0, 6);

上面的代码片段会生成一定范围内的数字序列,将它们混洗,然后提取前n个数字。此方法保证提取的数字是唯一的,因为它们的生成方式。如果范围很大,它可能不是最佳解决方案,但对于小间隔,它可以做得很好。

答案 2 :(得分:0)

避免重复的第一种方法是在生成新数字时存储所有找到的数字,并丢弃已经生成的任何数字。您可以在数组中搜索indexOf的数字。只需在for循环结束时添加:

if(randomNum.indexOf(randomNum[i]) < i) --i;

如果该数字已经在数组中,它将基本上为同一个数组单元运行循环。这种方法存在一个危险:如果传递的最小值和最大值不超过6个,则会产生无限循环。

另一种方法是首先生成所有可能的数字,然后从列表中选择一些,然后删除它们。老实说,当你有一小部分值和多个数字可供选择时,这个解决方案更合适,而你选择的数量非常少。

PS,不要使用math.round因为它为边缘情况提供了不平等的机会。例如,对于从0到<0.5的任何随机值,0到2之间的随机数将舍入为0,但对于从0.5到<1.5的任何值,舍入为1(为了更均匀分布,请使用math.floor并在结果中加1 - 但你已经做到了。

答案 3 :(得分:0)

这样做的一种方法是构建一个'采用数字数组'并检查该数组是否与生成的随机数匹配。如果它不存在,请继续添加。

var takenNumbers = [];
$('#btnGo').on('click', function () {
    var theRandomNumbersArray = randomNumGen(50, 0);
});

function randomNumGen(max, min) {
    var counter = 0;
    var returnArray = [];
    while (counter < 6) {
        var randomNumber = Math.random() * (max - min + 1) + min;
        var randomNumberRounded = Math.round(randomNumber);

        if (takenNumbers.indexOf(randomNumberRounded.toString()) == -1) {
            takenNumbers.push(randomNumberRounded);
            returnArray.push(randomNumberRounded);
            counter += 1;
        }
    }
    return returnArray;
}

注意:此处有一个您需要考虑的错误。如果使用while循环,如果获取所有数字,它可能会旋转到无限循环。您可能还想检查数组是否具有最大数量的长度或影响的内容。