基于Box-Muller法的正态分布值生成

2024-05-11 08:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个小函数,用Box-Muller方法从正态分布中生成值,但是我得到的是负值。

这是我的源代码

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

Tags: 方法函数boxlogpirandomsqrtsigma
2条回答

当随机生成值非常接近于零时,Box-Muller变换存在稳定性问题。我建议用高斯分布代替random.random(),并用平均值和标准偏差来影响。

单位normal distribution以零为中心,两边有小尾巴,到正负无穷远。99.7% of your values将在三个标准偏差内,其他0.3%不在

enter image description here

在这个例子中,如果平均值为400,标准差为150,那么99.7%的值将落在平均值的三个标准差内,即区间[-50850],其中包括负数。所以我们马上就可以期待负数了。

至于其他0.3%的数值,记住这是你的数字的3/1000,这一点也不少见。

如果您想要一个有限支持的“bell curvey”分布,请尝试beta distribution

最后,除非这是一个学术性的练习,否则没有必要把你自己的练习变成^{}

相关问题 更多 >