【问题标题】:JavaScript pseudo-random sequence generatorJavaScript 伪随机序列生成器
【发布时间】:2011-11-03 12:53:09
【问题描述】:

在给定初始种子的情况下,我需要生成一个确定的(即可重复的)pseudo-random 数字序列,并从该序列中选择第 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 &amp;&amp; x &gt;= 0 &amp;&amp; x &lt; maxVal

或者,理想情况下

x = randomNth(seed, seq) // x &gt;= 0 &amp;&amp; x &lt; 1, same as Math.random()

其他要求:

  • 必须在 node.js 和浏览器中运行
  • 数字应该在统计上是随机的(或足够接近,因为周期会很小)
  • 应该是 O(1) 并且性能合理

【问题讨论】:

标签: javascript node.js random hash prng


【解决方案1】:

this page 上有一些很好的 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 ) );

【讨论】:

  • 您的链接似乎已损坏。
  • 链接断开。想了解更多关于正在使用的算法。
【解决方案2】:

最后,我使用了一位(非 SO)朋友的建议。我选择了 CRC32(),因为它速度极快,并且提供了相当随机的值。

return crc32(seq + seed) % maxVal;

800 万次运行产生了 maxVal = 8 的以下分布:

0 999998

1 999998

2 1000007

3 1000003

4 1000001

5 1000003

6 999992

7 999998

我还运行了 Hans 提到的 Donald Knuth 页面中提到的“Marsaglia's famous "Die Hard" battery of tests”,其结果在这里:CRC32() for random numbers Diehard results。简短的版本是它惨遭失败(对于如此少量的测试数据),但它仍然足以满足我在小范围内生成数字的需求。

【讨论】:

    【解决方案3】:

    Donald Knuth 可能会有所帮助:http://www-cs-faculty.stanford.edu/~uno/news02.html#rng

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 但是如何获得第 250 个号码?播种并运行 250 次?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2016-10-23
      • 2015-08-07
      • 2012-02-12
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多