根据这个堆栈溢出线程 https://stackoverflow.com/questions/10361466/what-algorithm-does-math-random-useJavaScript 中的 Math.random() 取决于浏览器或操作系统。基本上,这意味着 JavaScript 没有用于生成统一随机变量的标准算法。这个线程 https://stackoverflow.com/questions/9550796/why-is-google-chromes-math-random-number-generator-not-that-random似乎表明Chrome的统一随机数算法特别糟糕。
在我的程序中,我尝试根据一些信息和随机噪声来了解用户的行为。我对 Math.random() 生成的数字使用 Box-Muller 变换来生成高斯随机数。这是否意味着使用一种浏览器的用户会遇到与其他浏览器不同类型的噪音?请注意,我使用 Box Muller 是因为我不关心速度,但我知道它对伪随机数的生成方式特别敏感。似乎有很多关于为什么 Math.random() 不好的线程,但在实际使用什么的线程中却没有那么多。最佳实践是什么?因为我使用 Box-Muller 转换为高斯数,所以有什么我应该特别注意的吗?
有一个基于异或移位的 RNGhttp://en.wikipedia.org/wiki/Xorshift http://en.wikipedia.org/wiki/Xorshift具有良好的随机性属性,应该很容易移植到 JavaScript:
EDIT done:
(function () {
var x = 123456789;
var y = 362436069;
var z = 521288629;
var w = 88675123;
var f = Math.pow(2, -32);
Object.defineProperty(Math, 'xor128', {
value: function () {
var t = x ^ (x << 11);
x = y;
y = z;
z = w;
w = w ^ (w >>> 19) ^ (t ^ (t >>> 8));
return (w >>> 0) * f; // convert to floating point
}
});
})();
注意:这仅使用生成的 128 位中的 32 位来产生浮点结果。理论上,您可以组合其他状态变量之一的另外 20 位来生成 52 位结果。
我看到的最重要的问题是它不支持播种 - 它总是生成相同的序列。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)