Javascript随机排序与种子

Har*_*rry 6 javascript random

我想随机洗牌4个项目的列表但是有种子,这样只要你有相同的种子,你就可以获得相同的项目顺序.

["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

我想我可以用Math.random获得种子,我不需要非常精确的东西.我如何根据种子排序?

Ulf*_*lak 10

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

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);
}
Run Code Online (Sandbox Code Playgroud)

*该random功能取自this SO answer。这是一个黑客攻击,而不是完全随机的,最重要的是不是加密安全的这是样本的直方图(也在该响应的评论中,需要一段时间才能运行)。最后,您应该只在这些事情并不重要时才使用它。或者,random用更好的可种子随机数生成器替换该函数。

  • 仅供参考,该函数返回一个数组,但这不是必需的。输入数组本身被更改。如果您仍然需要访问旧的数组顺序,那么您需要先制作一个副本,或者进行其他操作。 (2认同)

Tra*_*s J -1

jsFiddle Demo

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

for( var i = 0; i < length; i++ ){
    seed.push(Math.random());
}
Run Code Online (Sandbox Code Playgroud)

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

    var randomIndex = parseInt(seed[i] * (len - i));
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容

种子函数将存储种子数组

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 = []; 
  }
 };
}
Run Code Online (Sandbox Code Playgroud)

一个非常基本的随机播放

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;
}
Run Code Online (Sandbox Code Playgroud)

正在使用

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()));
Run Code Online (Sandbox Code Playgroud)