【问题标题】:javascript 5 random non duplicating integers from 0 - 20javascript 5个从0到20的随机非重复整数
【发布时间】:2011-08-10 02:05:32
【问题描述】:

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

我在想,将 Math.random 与 floor 一起使用,循环 5 次,检查是否重复,如果重复,再次随机。

你的方法是什么?

【问题讨论】:

  • 嗯,就是这样:)
  • 另一种方法是将所有可能的值放入一个数组中,将其打乱并取前 5 个。
  • 5 次相同的结果也是随机的。还是你不相信宇宙? ;)

标签: javascript random


【解决方案1】:

您可以生成一个从 0 到 20 的数字数组shuffle it,并获取结果数组的前 5 个元素。

【讨论】:

  • 对于如此有限的范围,非常有意义。对于更大的范围,显然,不是那么多,但给定 0..20...
【解决方案2】:

我知道迟到的答案,但是:

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

=> [14, 17, 19]

【讨论】:

    【解决方案3】:

    编辑:可以在in this answer 找到此问题或在此处发布的其他人在 2008 年被问到的更好的解决方案。总结:生成一个数组(正如达林在他的在下面回答)并使用Knuth-Yates-Fisher shuffle 随机播放。 不要使用幼稚的随机播放,使用已知会产生良好效果的随机播放。


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

    var ints = {};
    

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

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

    【讨论】:

    • 我不确定前一个人为什么投反对票,但我投反对票是因为理论上这是一个永无止境的算法。换句话说,随机生成器可能可以一遍又一遍地生成相同的值,从而导致您的循环永远不会结束。只有五个值,这实际上是不可能的,但是当您需要 5000 个项目时会发生什么?同样,在实践中,它不会是永无止境的,但它所花费的时间是不确定的。还有其他算法(如达林的)会产生确定性的结果。我会选择其中一个。
    • @BrianGenisio:也许吧。但是使用 Darin 指出的 shuffle 不会产生好的随机结果。请参阅this answer,了解为什么您需要更复杂的东西。
    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多