使用Box-Muller方法从正态分布生成值

时间:2012-03-31 00:18:42

标签: python math probability

我正在编写一个小函数,使用Box-Muller方法从Normal分布生成值,但我得到负值。

这是我的源代码

import random

def generate_normal(mu, sigma):
    u = random.random()
    v = random.random()

    z1 = sqrt(-2 * log(u)) * sin(2 * pi * v)
    z2 = sqrt(-2 * log(u)) * cos(2 * pi * v)

    x1 = mu + z1 * sigma
    x2 = mu + z2 * sigma

    return x2

我错过了什么?我在x1x2都得到负值。例如:

mu: 400
sigma: 150
u: 7.27333176449e-05
v: 0.642384573173
z1: -3.40497345242
x1: -110.746017863

x2: -9.79324023117

2 个答案:

答案 0 :(得分:7)

单位normal distribution以零为中心,双向以小尾巴为正负无穷大。 99.7% of your values将在三个标准差内,另一个0.3%不在。

enter image description here

在此示例中,平均值为400且标准差为150,您的值的99.7%将落在均值的三个标准偏差内 - 间隔[-50,850],其中包括负数。所以期待负面的数字。

至于其他0.3%的数值,请记住你的数字为3/1000 - 并非罕见。

如果你想要一个有限支持的“钟形”分布,试试beta distribution

最后,除非这是学术练习,否则无需将自己的等效内容推到numpy.random.normal()

答案 1 :(得分:0)

当随机生成的值非常接近零时,Box-Muller变换具有稳定性问题。我建议用gaussinan分布替换random.random(),并用你的均值和标准差来影响。