Python 用Box-Muller法从正态分布生成值
我正在编写一个小函数,使用Box-Muller方法从正态分布生成值,但得到的是负值 这是我的源代码Python 用Box-Muller法从正态分布生成值,python,math,probability,Python,Math,Probability,我正在编写一个小函数,使用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 +
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
我遗漏了什么?我在x1
和x2
中都得到了负值。例如:
mu: 400
sigma: 150
u: 7.27333176449e-05
v: 0.642384573173
z1: -3.40497345242
x1: -110.746017863
以及:
这个单位以零为中心,两边有小尾巴,直到正负无穷远。将在三个标准偏差范围内,其他0.3%不会
在本例中,平均值为400,标准偏差为150,99.7%的值将落在平均值的三个标准偏差范围内-区间[-50850],其中包括负数。所以一开始就预计会出现负数
至于其他0.3%的值,记住这是你的数字的3/1000——这一点都不少见
如果您想要有限支撑的“钟形曲线”分布,请尝试
最后,除非这是一个学术性的练习,否则你没有必要把你自己的等价物卷起来。这个单位以零为中心,两边都有小尾巴,直到正负无穷大。将在三个标准偏差范围内,其他0.3%不会
在本例中,平均值为400,标准偏差为150,99.7%的值将落在平均值的三个标准偏差范围内-区间[-50850],其中包括负数。所以一开始就预计会出现负数
至于其他0.3%的值,记住这是你的数字的3/1000——这一点都不少见
如果您想要有限支撑的“钟形曲线”分布,请尝试
最后,除非这是一个学术性的练习,否则没有必要使用您自己的等价物。当随机生成的值非常接近零时,Box-Muller变换存在稳定性问题。我建议用高斯分布代替random.random(),并用平均值和标准偏差来影响 Box-Muller变换在随机生成值非常接近零时存在稳定性问题。我建议用高斯分布代替random.random(),并用平均值和标准偏差来影响 太好了。我不知道我怎么会错过它。我只是专注于这个问题,我完全忘记了N(0,1)
:)
的那个非常著名的图形。非常感谢你!我们都有自己的小过失也就是说,您不使用numpy.random.normal()
?OP根本不一定使用numpy,但标准库提供了random.gauss
(更快但不是线程安全)或random.normalvariate
。也就是说,IIRC给定的方法容易出现数值不稳定性(最好选择单位平方内的随机坐标,如果它们在单位平方外则拒绝它们,而不是选择加权的随机半径和随机角度),并且会丢弃一半的有效结果(x1
与x2
一样随机且独立;最好记住此值并每隔一次返回一次,或者使用生成器并在循环中生成这两个值)@KarlKnechtel我正是这样做的。我使用收益率
,这样我可以返回x1
,x2
,然后生成两个新的,并重复这个过程。@Li aungYip我正在为学术目的开发一个机场模拟,其想法是从头开始实现使用的分布(正态分布、泊松分布和指数分布)。非常感谢!太好了。我不知道我怎么会错过它。我只是专注于这个问题,我完全忘记了N(0,1):)
的那个非常著名的图形。非常感谢你!我们都有自己的小过失也就是说,您不使用numpy.random.normal()
?OP根本不一定使用numpy,但标准库提供了random.gauss
(更快但不是线程安全)或random.normalvariate
。也就是说,IIRC给定的方法容易出现数值不稳定性(最好选择单位平方内的随机坐标,如果它们在单位平方外则拒绝它们,而不是选择加权的随机半径和随机角度),并且会丢弃一半的有效结果(x1
与x2
一样随机且独立;最好记住此值并每隔一次返回一次,或者使用生成器并在循环中生成这两个值)@KarlKnechtel我正是这样做的。我使用收益率
,这样我可以返回x1
,x2
,然后生成两个新的,并重复这个过程。@Li aungYip我正在为学术目的开发一个机场模拟,其想法是从头开始实现使用的分布(正态分布、泊松分布和指数分布).非常感谢!
x2: -9.79324023117