python如何从正态分布中生成随机数?

时间:2017-06-15 21:19:36

标签: python random sampling normal-distribution

我知道random.normal()会给我一个正态分布的随机数。但它是如何实际产生的呢?我知道random.random()是由种子生成或使用系统随机性生成的。 random.normal()也是同样生成的吗?还是 rejection sampling 技术?

2 个答案:

答案 0 :(得分:3)

source code表示random.normalvariate()生成如下:

# Uses Kinderman and Monahan method. Reference: Kinderman,
# A.J. and Monahan, J.F., "Computer generation of random
# variables using the ratio of uniform deviates", ACM Trans
# Math Software, 3, (1977), pp257-260.

random = self.random
while 1:
    u1 = random()
    u2 = 1.0 - random()
    z = NV_MAGICCONST*(u1-0.5)/u2
    zz = z*z/4.0
    if zz <= -_log(u2):
        break
return mu + z*sigma

原始论文可用here,但需要付出一些努力才能遵循它。

显然,这是拒绝抽样的一种形式。

如果您设置种子,则会指定由random.random()random.normalvariate()生成的随机数序列。如果您没有设置种子,则从机器中抽取随机性。也就是说,你无法比较random.normalvariate和种子的操作:它们是两种不同的操作,其中一种操作支持另一种操作。

答案 1 :(得分:-1)

从文档here开始,随机正态分布是在random()函数上生成的,它在[0,1]中给出了一个统一的浮点数,正如文档所说&#34;使用 Mersenne Twiste 作为核心发电机。它产生53位精度浮点数,周期为2 ** 19937-1&#34;

我不知道Mersenne Twister是什么,但希望信息有所帮助。