首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript伪随机序列发生器

JavaScript伪随机序列发生器
EN

Stack Overflow用户
提问于 2011-08-25 09:51:54
回答 4查看 9.1K关注 0票数 5

我需要生成一个给定初始种子的确定性(即可重复的) 伪随机数序列,并从该序列中选择第n项。

如果JavaScript的随机函数是可移植的,我可以这样做:

代码语言: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)并有合理的表现
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-25 10:57:00

在->上有一些很好的int、int、散列函数,您可以使用其中之一。

代码语言:javascript
复制
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 ) );
票数 3
EN

Stack Overflow用户

发布于 2011-08-25 13:58:58

最后,我用了一个朋友的建议。我使用了CRC32(),因为它非常快,并且给出了很好的随机值。

return crc32(seq + seed) % maxVal;

800万次运行为maxVal =8生成了以下发行版:

999998 1 999998 2 1000007 3 1000003 4 1000001 5 1000003 6 9992 7 999998

我还运行了Donald页面中提到的"Marsaglia著名的“硬死”测试电池“,其结果如下:随机数的CRC32()。简短的版本是,它不幸地失败了(对于如此少量的测试数据),但它仍然足够满足我的需求,因为它在一个很小的范围内生成数字。

票数 3
EN

Stack Overflow用户

发布于 2011-08-25 09:56:14

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7188310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档