Dee*_*ter 5 javascript random hash prng node.js
我需要在给定初始种子的情况下生成确定性(即可重复)伪随机数序列,并从该序列中选择第 n 个项目。
如果 JavaScript 的随机函数是可播种的,我可以这样做:
function randomNth(seed, seq)
{
var r;
Math.randomSeed(seed);
for (var i = 0; i++ < seq; i++)
{
r = Math.random();
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
然而,事实并非如此,替代性的可种子 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()
其他需求:
本页上有一些很好的 int -> int 哈希函数,您可以使用其中之一。
function hash(a)
{
a = (a+0x7ed55d16) + (a<<12);
a = (a^0xc761c23c) ^ (a>>19);
a = (a+0x165667b1) + (a<<5);
a = (a+0xd3a2646c) ^ (a<<9);
a = (a+0xfd7046c5) + (a<<3);
a = (a^0xb55a4f09) ^ (a>>16);
if( a < 0 ) a = 0xffffffff + a;
return a;
}
var seed = 26254;
var index = 250;
alert( hash( seed + index ) );
Run Code Online (Sandbox Code Playgroud)