JavaScript伪随机序列生成器
我需要在给定初始种子的情况下生成一个确定性(即可重复的)数字序列,并从该序列中选择第n项 如果JavaScript的随机函数是可种子的,我可以:JavaScript伪随机序列生成器,javascript,node.js,random,hash,prng,Javascript,Node.js,Random,Hash,Prng,我需要在给定初始种子的情况下生成一个确定性(即可重复的)数字序列,并从该序列中选择第n项 如果JavaScript的随机函数是可种子的,我可以: function randomNth(seed, seq) { var r; Math.randomSeed(seed); for (var i = 0; i++ < seq; i++) { r = Math.random(); } return r; } 函数randomNth(
function randomNth(seed, seq)
{
var r;
Math.randomSeed(seed);
for (var i = 0; i++ < seq; i++)
{
r = Math.random();
}
return r;
}
函数randomNth(seed,seq)
{
var-r;
随机种子(seed);
对于(变量i=0;i++
然而,事实并非如此,可供选择的可种子PRNG看起来有点慢;要第250个号码会很贵
我认为散列就是我在这里想要的,可能类似于md5(seed+seq)%max
但是JavaScript没有md5(),如果我在代码中这样做,可能有更好的散列选择
我想要一个函数,其中
x=randomNth(seed,seq,maxVal)//x为int&&x>=0&&x
或者,理想情况下
x=randomNth(seed,seq)//x>=0&&x<1,与Math.random()相同
其他要求:
- 必须在node.js和浏览器中运行
- 数字在统计上应该是随机的(或者足够接近,因为周期很小)
- 应为O(1)且性能合理
Donald Knuth可能会有所帮助:使用它。上有一些很好的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 ) );
函数散列(a)
{
a=(a+0x7ed55d16)+(a19);
a=(a+0x165667b1)+(a最后,我使用了一位(非SO)朋友的建议。我使用了CRC32(),因为它速度非常快,并且给出了相当随机的值
返回crc32(seq+seed)%maxVal;
800万次运行产生了以下maxVal=8的分布:
0999998
199999 8
二,
100007
三,
1000003
四,
1000001
五,
1000003
六,
99992
七,
999998
我还运行了Hans提到的Donald Knuth页面中提到的“”,结果如下:。简短的版本是它失败得很惨(对于如此少量的测试数据),但它仍然足以满足我的需要,因为它生成的数字范围很小。但是如何获得第250个数字?种子并运行250次?:)只是你的链接似乎被破坏了。破坏的链接。想知道更多关于正在使用的算法。