JavaScript:从0到20中生成5个不重复的随机整数

5

如何从0到20中生成5个随机且不重复的整数,最佳方法是什么?

我的想法是使用Math.random和floor函数进行循环5次并检查是否有重复,如果有,则再次随机。

你有什么更好的方法吗?


好的,那就是这样 :) - S L
1
另一种方法是将所有可能的值放入一个数组中,对其进行洗牌并取前5个。 - Joachim Sauer
同样的结果出现5次也是随机的。你不相信宇宙吗? ;) - Caspar Kleijne
可能是Unique random numbers in O(1)?的重复问题。 - T.J. Crowder
3个回答

7
您可以生成从0到20的数字数组,打乱顺序并取结果数组的前5个元素。

1
对于如此有限的范围,这是非常合理的。对于更大的范围,显然不太适用,但考虑到0..20..., - T.J. Crowder

3

虽然我回答晚了,但还是想说:

var a=[];
while(a.length <3) {
  var n = Math.round(Math.random() * 20);
  if (a.indexOf(n)==-1) a.push(n);
}

=> [14, 17, 19]


0

编辑:一个比这里或其他所有发布的更好的解决方案可以在2008年这个问题提出时的这个答案中找到。总结一下:生成一个数组(如Darin在下面的回答中建议),并使用Knuth-Yates-Fisher shuffle来对其进行洗牌。不要使用朴素的洗牌算法,而是使用已知具有良好结果的算法。


这大概就是我会做的方式,是的。我可能会使用一个对象来跟踪我已经有的整数,因为这很方便。例如:

var ints = {};

然后,一旦您创建了一个新的随机数,请检查它并可能保留它:

if (!ints[number]) {
    // It's a keeper
    ints[number] = true;
    results.push(number);
}

我不确定为什么之前的人会点踩,但我要点踩是因为这是一个理论上永无止境的算法。换句话说,随机生成器可能会一遍又一遍地生成相同的值,导致您的循环永远不会结束。虽然只有五个值,这几乎是不可能的,但当您需要5000个项目时会发生什么?同样,在实践中,它不会是无限的,但所需的时间是不确定的。还有其他算法(例如Darin的算法),可以产生确定性结果。我建议使用其中之一。 - Brian Genisio
@BrianGenisio:也许吧。但是使用Darin指出的洗牌方法不会产生好的随机结果。请参考这个答案,了解为什么需要更复杂的方法。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接