我知道random.normal()
会给我一个正态分布的随机数。但它是如何实际产生的呢?我知道random.random()
是由种子生成或使用系统随机性生成的。 random.normal()
也是同样生成的吗?还是 rejection sampling 技术?
答案 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是什么,但希望信息有所帮助。