在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