Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript伪随机序列生成器_Javascript_Node.js_Random_Hash_Prng - Fatal编程技术网

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(

我需要在给定初始种子的情况下生成一个确定性(即可重复的)数字序列,并从该序列中选择第n项

如果JavaScript的随机函数是可种子的,我可以:

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次?:)只是你的链接似乎被破坏了。破坏的链接。想知道更多关于正在使用的算法。