Javascript随机排序与种子

Javascript random ordering with seed

我想随机洗一个4个项目的列表,但是用一个种子,这样只要你有相同的种子,你就会得到相同的项目顺序。

1
["a","b","c","d"]

我想我可以通过数学来获得种子。随机的,我不需要非常精确的东西。我怎样根据种子分类?


您可以通过稍微修改Mike Bostock的Fisher–Yates算法实现来实现这一点*:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function shuffle(array, seed) {                // <-- ADDED ARGUMENT
  var m = array.length, t, i;

  // While there remain elements to shuffle…
  while (m) {

    // Pick a remaining element…
    i = Math.floor(random(seed) * m--);        // <-- MODIFIED LINE

    // And swap it with the current element.
    t = array[m];
    array[m] = array[i];
    array[i] = t;
    ++seed                                     // <-- ADDED LINE
  }

  return array;
}

function random(seed) {
  var x = Math.sin(seed++) * 10000;
  return x - Math.floor(x);
}

*random函数取自此答案。它是一个黑客,不是完全随机的,最重要的是不加密安全!这是一个样本的柱状图(同样在该响应的注释中,需要运行一段时间)。最后,您应该只在这些事情并不真正重要时使用它。或者,用更好的可播种随机数生成器替换random函数。


种子随机播放

在节点和浏览器上工作。


jsFiddle Demo

据我所知,您需要为数组中的每个值输入一个随机值。在这方面,您可能需要这样做:

1
2
3
for( var i = 0; i < length; i++ ){
    seed.push(Math.random());
}

如果你要确保length与种子的长度相同。对于您的简单示例,这将是4。完成后,可以将种子传递到shuffle(或sort)函数中,以确保获得相同的结果。洗牌也需要在循环中使用它

1
    var randomIndex = parseInt(seed[i] * (len - i));

所以这就是所有的问题

存储种子数组的种子函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var seeder = function(){
 var seed = [];
 return {
  set:function(length){
    for( var i = 0; i < length; i++ ){
        seed.push(Math.random());
    }
    return seed;
  },
  get: function(){
   return seed;
  },
  clear: function(){
   seed = [];
  }
 };
}

基本的洗牌

1
2
3
4
5
6
7
8
9
10
11
12
13
function randomShuffle(ar,seed){
var numbers = [];
for( var a = 0, max = ar.length; a < max; a++){
    numbers.push(a);
}
var shuffled = [];
for( var i = 0, len = ar.length; i < len; i++ ){
    var r = parseInt(seed[i] * (len - i));
    shuffled.push(ar[numbers[r]]);
    numbers.splice(r,1);
}
return shuffled;
}

正在使用

1
2
3
4
5
6
var arr = ["a","b","c","d"];
var seed = seeder();
seed.set(arr.length);
console.log(randomShuffle(arr,seed.get()));
console.log(randomShuffle(arr,seed.get()));
console.log(randomShuffle(arr,seed.get()));

您可以使用xor-shift方法创建随机数来进行排序。例子。然后用new Xor128(seed).make(3)[2] / 4294967296 * 2替换旧代码中的Math.random()