我需要在给定初始种子的情况下生成一个确定的(即可重复的)伪随机数序列,并从该序列中选择第 n 个项目。
如果 JavaScript 的随机函数是可播种的,我可以这样做:
function randomNth(seed, seq)
{
var r;
Math.randomSeed(seed);
for (var i = 0; i++ < seq; i++)
{
r = Math.random();
}
return r;
}
然而,事实并非如此,替代的可播种 PRNG 看起来有点慢。要求第 250 个号码会很昂贵。
我认为哈希是我在这里想要的,可能类似于md5(seed + seq) % max
但 JavaScript 没有 md5() ,如果我在代码中这样做,可能会有更好的哈希选择。
我想要一个函数
x = randomNth(seed, seq, maxVal) // x is int && x >= 0 && x < maxVal
或者,理想情况下
x = randomNth(seed, seq) // x >= 0 && x < 1, same as Math.random()
其他需求:
- 必须在 node.js 和浏览器中运行
- 数字应该在统计上是随机的(或足够接近,因为周期会很小)
- 应该是 O(1) 并且性能合理