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