每次加载网页时,我都试图按照相同的方式对javascript数组进行预测。
我可以随机地对数组进行随机播放,但每次重新加载页面都会有不同的顺序。
我希望每次页面加载时都以相同的方式对数组进行洗牌。有许多数组,它们是程序生成世界的一部分。
答案 0 :(得分:5)
Chance.js工作得很好。谢谢Billy Moon。
我的例子:
<script type="text/javascript" src="assets/js/chance.js"></script>
var chance1 = new Chance(124); // you can choose a seed here, i chose 124
console.log(chance1.shuffle(['alpha', 'bravo', 'charlie', 'delta', 'echo']));
// Array [ "alpha", "delta", "echo", "charlie", "bravo" ]
只要您使用新机会(xxx)设置种子,每次都会得到相同的结果。
答案 1 :(得分:4)
查看chancejs.com's seed
功能。
答案 2 :(得分:0)
为了以看似随机和预定的方式对数组进行混洗,可以将问题分为两部分。
您可以使用其他PRNG,但是Xorshift非常简单,可以快速初始化和逐步执行,并且分布均匀。
此函数将整数作为种子值,并返回一个随机函数,该函数始终返回0到1范围内的相同浮点值。
const xor = seed => {
const baseSeeds = [123456789, 362436069, 521288629, 88675123]
let [x, y, z, w] = baseSeeds
const random = () => {
const t = x ^ (x << 11)
;[x, y, z] = [y, z, w]
w = w ^ (w >> 19) ^ (t ^ (t >> 8))
return w / 0x7fffffff
}
;[x, y, z, w] = baseSeeds.map(i => i + seed)
;[x, y, z, w] = [0, 0, 0, 0].map(() => Math.round(random() * 1e16))
return random
}
Fisher Yates shuffle是一种高效的随机分布算法,分布均匀。
const shuffle = (array, random = Math.random) => {
let m = array.length
let t
let i
while (m) {
i = Math.floor(random() * m--)
t = array[m]
array[m] = array[i]
array[i] = t
}
return array
}
// sample array
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
// passing an xor with the same seed produces same order of output array
console.log(shuffle(arr, xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]
console.log(shuffle(arr, xor(1))) // [ 3, 4, 2, 6, 7, 1, 8, 9, 5 ]
// changing the seed passed to the xor function changes the output
console.log(shuffle(arr, xor(2))) // [ 4, 2, 6, 9, 7, 3, 8, 1, 5 ]