在Javascript中播种随机数发生器

是否有可能在Javascript中播种随机数发生器(Math.random)?


不,它不是,但编写自己的发电机相当容易,或者更好地使用现有的发电机。 退房:这个相关的问题。

此外,请参阅David Bau的博客,了解有关播种的更多信息。


我的另一个答案代表了一个更传统的算法,但我发现Dave Scotese对这个答案的评论是一个更有说服力的评论。 不幸的是,由于字符串操作,它非常慢。

这个版本的速度要快20倍左右,而且要更精确一些。

var seed = 1;
function random() {
    var x = Math.sin(seed++) * 10000;
    return x - Math.floor(x);
}

您可以将seed设置为任意数字,避免零(或Math.PI的任何倍数)。

在我看来,这种解决方案的优雅来自于缺乏任何“魔术”数字(除了10000之外,它代表了为避免奇怪模式而必须丢弃的最小数字量 - 参见值为10,100,1000的结果)。 简洁也很好。

它比Math.random()慢2到3倍,但我相信它和使用JavaScript编写的任何其他解决方案一样快。


不,但这是一个简单的伪随机生成器,我从Wikipedia改编而来:

var m_w = 123456789;
var m_z = 987654321;
var mask = 0xffffffff;

// Takes any integer
function seed(i) {
    m_w = i;
    m_z = 987654321;
}

// Returns number between 0 (inclusive) and 1.0 (exclusive),
// just like Math.random().
function random()
{
    m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
    m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
    var result = ((m_z << 16) + m_w) & mask;
    result /= 4294967296;
    return result + 0.5;
}

编辑:通过重置m_z来修复种子功能

链接地址: http://www.djcxy.com/p/17725.html

上一篇: Seeding the random number generator in Javascript

下一篇: Generating random numbers in Objective