Javascript 为大范围整数生成随机顺序的智能方法?

Javascript 为大范围整数生成随机顺序的智能方法?,javascript,random,colors,Javascript,Random,Colors,我想为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 ra

我想为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
}
var c=[],
j=0;
//枚举

对于(;j,您现在使用的代码有几个问题

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

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

  • 正如您已经注意到的,它很慢。您需要花费大量时间从函数返回新的数组值,每次迭代时都会丢弃这些值。您最好使用


  • 您需要惰性计算。在ES6中(如果您在本例中使用的是Node),您可以使用
    yield
    以简洁的语法编写它。因为它在浏览器中还不能真正工作,所以您可以使用闭包来模拟状态。绝对不要提前计算所有数字。这可能会有所帮助: