Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用Box-Muller法从正态分布生成值_Python_Math_Probability - Fatal编程技术网

Python 用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 +

我正在编写一个小函数,使用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
我遗漏了什么?我在
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