【问题标题】:Smart way to generate a random order for a large range of integers?为大量整数生成随机顺序的聪明方法?
【发布时间】:2014-04-30 18:17:23
【问题描述】:

我想为 0 到 256^3 之间的整数生成一个随机顺序(以随机获取所有颜色),所以我现在使用这种方式:

var c = [],
    j = 0;

//enum
for (;j<16777216;j++)   c[j] = j;

//calculate random elements faster
for(;c.length;c.splice(j,1)) {
    j = Math.floor(Math.random() * c.length);
    //every j is a random number between 0 and 256^3
}

生成所有数字需要很长时间...您知道一种时间性能更好的方法来解决这个问题吗?

【问题讨论】:

  • 你想要惰性评估。在 ES6 中(如果您在这种情况下使用 Node),您可以使用 yield 以简短的语法编写它。由于它还不能在浏览器中真正工作,您可以使用闭包来模拟状态。绝对不要提前评估所有数字。
  • 也许这会有所帮助:stackoverflow.com/q/2450954/1169798

标签: javascript random colors


【解决方案1】:

您现在使用的代码有几个问题。

  1. 它不是对数组中的值进行重新排序,而是根据数组大小的变化生成随机值。这并不能保证生成的序列中不会有重复值。 (事实上​​,除了最小的数组大小之外,你肯定会有重复。)

  2. 这不是随机的。随着数组大小的缩小,序列末尾生成的值也会缩小。 (在第 0 次迭代之后,您不能再生成值 16777216。每次迭代都会消除一个新值。)

  3. 正如您已经指出的,它很慢。您花费大量时间从 splice 函数返回新的数组值,而您只是在每次迭代时将其丢弃。你最好使用How to randomize (shuffle) a javascript array?中给出的方法在数组c中就地打乱值。

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多