根据此Stack Overflow线程,JavaScript中的Math.random()取决于浏览器或操作系统.基本上,它意味着JavaScript没有用于生成均匀随机变量的标准算法.这个帖子似乎暗示Chrome的统一随机数算法特别糟糕.
在我的程序中,我尝试了解用户基于某些信息加上随机噪声的行为.我对Math.random()生成的数字使用Box-Muller变换来生成高斯随机数.这是否意味着使用一个浏览器的用户将遇到不同类型的噪音?注意我使用Box Muller因为我不关心速度,但我知道它对伪随机数的生成方式特别敏感.似乎有很多线程关于为什么Math.random()是坏的,但在线程中并没有太多关于实际使用的内容.什么是最佳做法?有什么东西我应该特别注意,因为我使用Box-Muller转换为高斯数字?
http://en.wikipedia.org/wiki/Xorshift上有一个基于 xor-shift 的 RNG,具有良好的随机性属性,应该很容易移植到 JavaScript:
编辑完成:
(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
}
});
})();
Run Code Online (Sandbox Code Playgroud)
注意:这仅使用生成的 128 位中的 32 位来产生浮点结果。理论上,您可以组合其他状态变量之一的另外 20 位来生成 52 位结果。
我看到的最重要的问题是它不支持播种 - 它总是生成相同的序列。
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |