随机化正态分布数字的偏差(javascript)

时间:2013-03-07 18:47:10

标签: javascript random numbers generator

我在生成正态分布的随机数时遇到问题(mu = 0 sigma = 1) 使用JavaScript。

我尝试过Box-Muller的方法和ziggurat,但生成的数字序列的平均值为0.0015或-0.0018 - 非常远离零!超过500,000个随机生成的数字这是一个大问题。它应该接近零,类似于0.000000000001。

我无法弄清楚它是否是一个方法问题,或者JavaScript的内置Math.random()是否生成不完全一致的分布数字。

有人发现了类似的问题吗?

在这里你可以找到ziggurat函数:

http://www.filosophy.org/post/35/normaldistributed_random_values_in_javascript_using_the_ziggurat_algorithm/

下面是Box-Muller的代码:

function rnd_bmt() {
    var x = 0, y = 0, rds, c;

    // Get two random numbers from -1 to 1.
    // If the radius is zero or greater than 1, throw them out and pick two
    // new ones. Rejection sampling throws away about 20% of the pairs.
    do {
        x = Math.random()*2-1;
        y = Math.random()*2-1;
        rds = x*x + y*y;
    }
    while (rds === 0 || rds > 1) 

    // This magic is the Box-Muller Transform
    c = Math.sqrt(-2*Math.log(rds)/rds);

    // It always creates a pair of numbers. I'll return them in an array. 
    // This function is quite efficient so don't be afraid to throw one away
    // if you don't need both.
    return [x*c, y*c];
}

1 个答案:

答案 0 :(得分:5)

如果您生成n个独立的正常随机变量,则standard deviation of the mean将为sigma / sqrt(n)

在您的案例中n = 500000sigma = 1,因此平均值的标准误差约为1 / 707 = 0.0014。给定0均值的95%置信区间约为此值的两倍或(-0.0028, 0.0028)。您的样本均在此范围内。

您对获得0.0000000000011e-12)的期望不是数学上的基础。要达到该准确度范围,您需要生成大约10^24个样本。每秒10,000个样本仍然需要3个四分之一年...这正是为什么尽可能避免通过模拟计算事物的原因。

另一方面,您的算法似乎确实正确实现了:)