Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带种子的Javascript随机排序_Javascript_Random - Fatal编程技术网

带种子的Javascript随机排序

带种子的Javascript随机排序,javascript,random,Javascript,Random,我想随机洗牌4个项目的清单,但与种子,以便只要你有相同的种子,你会得到相同的项目顺序 ["a", "b", "c", "d"] 我想我可以通过数学得到种子。随机,我不需要非常精确的东西。如何根据种子进行排序? 据我所知,您需要为数组中的每个值种子一个随机值。在这方面,您可能想做如下操作: for( var i = 0; i < length; i++ ){ seed.push(Math.random()); } 所以这里是它的全部分解 存储种子数组的种子函数 var seede

我想随机洗牌4个项目的清单,但与种子,以便只要你有相同的种子,你会得到相同的项目顺序

["a", "b", "c", "d"]
我想我可以通过数学得到种子。随机,我不需要非常精确的东西。如何根据种子进行排序?

据我所知,您需要为数组中的每个值种子一个随机值。在这方面,您可能想做如下操作:

for( var i = 0; i < length; i++ ){
    seed.push(Math.random());
}
所以这里是它的全部分解

存储种子数组的种子函数

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 = []; 
  }
 };
}

您可以创建随机数来使用XOR Shift方法进行排序。 然后将旧代码中的
Math.random()
替换为
新的Xor128(seed).make(3)[2]/4294967296*2


适用于节点和浏览器。

您只需稍微修改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);
}

函数shuffle(array,seed){//你不想排序,你想洗牌。当你这样做的时候,你会在过程中使用随机数,所以在开始之前先建立种子。哦,等等;你想知道是否有类似
Math.seed()的东西…嗯,只有24种可能的排列,所以您可以将它们存储在一个数组中,只需使用
排列[seed]
,其中seed是介于0和之间的数字23@Harry如果你真的只有4个元素需要担心,那么来自thg435的评论是一个好主意。如果你可能有更多的元素,那么你应该使用一个可播种的随机数例程。@Pointy是正确的。洗牌本身并没有太大问题(只需使用Fisher Yates),但您需要一个可播种的随机生成器,而不是默认的随机播种的
Math.random()
。非常酷,谢谢!让我使用David Bau的seedrandom库找到了这个版本的
random
函数random(seed){const rng=seedrandom(seed);const randomNum=rng();return randomNum;}
FYI,该函数返回一个数组,但这不是必需的。输入数组本身已更改。如果您仍需要访问旧数组顺序,则需要先复制一个数组或其他内容。
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;
}
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()));
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);
}