Math.random和JavaScript中的Web编程

Wet*_*ent 8 javascript random

根据此Stack Overflow线程,JavaScript中的Math.random()取决于浏览器或操作系统.基本上,它意味着JavaScript没有用于生成均匀随机变量的标准算法.这个帖子似乎暗示Chrome的统一随机数算法特别糟糕.

在我的程序中,我尝试了解用户基于某些信息加上随机噪声的行为.我对Math.random()生成的数字使用Box-Muller变换来生成高斯随机数.这是否意味着使用一个浏览器的用户将遇到不同类型的噪音?注意我使用Box Muller因为我不关心速度,但我知道它对伪随机数的生成方式特别敏感.似乎有很多线程关于为什么Math.random()是坏的,但在线程中并没有太多关于实际使用的内容.什么是最佳做法?有什么东西我应该特别注意,因为我使用Box-Muller转换为高斯数字?

Aln*_*tak 2

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 位结果。

我看到的最重要的问题是它不支持播种 - 它总是生成相同的序列。