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); } |
。
*
种子随机播放
在节点和浏览器上工作。
据我所知,您需要为数组中的每个值输入一个随机值。在这方面,您可能需要这样做:
1 2 3 | for( var i = 0; i < length; i++ ){ seed.push(Math.random()); } |
如果你要确保
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方法创建随机数来进行排序。例子。然后用