Python中random.normalvariate()和random.gauss()有什么区别?

33

random.normalvariate()random.gauss()有什么区别?

它们使用相同的参数并返回相同的值,实际上执行相同的功能。

我从previous answer了解到random.gauss()不是thread safe,但在这种情况下这意味着什么?为什么程序员应该关心这个问题?或者说,为什么Python的“random”中包含了一个线程安全和一个非线程安全的版本?

4个回答

24

这是一个有趣的问题。一般来说,了解两个Python实现之间的区别最好的方法是自己检查代码

import inspect, random
str_gauss = inspect.getsource(random.gauss)
str_nv=inspect.getsource(random.normalvariate)

然后您可以打印每个字符串以查看这些源之间的差异。快速查看代码表明,它们不仅在多线程方面表现不同,而且算法也不相同;例如,normalvariate 使用称为 Kinderman 和 Monahan 方法,在str_nv中有如下注释:

# 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.

2
很遗憾,在所谓的文档中找不到这种类型的文档。有什么见解为什么会这样? - hkBst

11

编写线程安全的代码必须考虑在执行期间可能出现的竞争条件。这会引入额外的开销,因为需要使用同步方案,如互斥锁、信号量等。

然而,如果您编写的代码不是可重入的,则通常不会出现竞争条件,这意味着您可以编写执行速度更快的代码。我猜这就是为什么引入了random.gauss(),因为Python文档称它比线程安全版本更快。


0

我不是完全确定,但Python文档说random.gauss稍微快一些,所以如果你可以接受非线程安全,那么你可以更快一点。


-2
在多线程系统中,快速连续调用 random.normalvariate 两次将导致 random.normalvariate 的内部代码在第一次调用返回之前可能会被运行两次。在第二次调用之前,函数的内部变量可能不会被重置,这可能会导致函数输出错误。
相反,对 random.gauss 的连续调用必须等待早期调用返回后再进行调用。
因此,random.normalvariate 的优点是更快,但可能会产生错误的输出。

7
有点令人困惑。你是不是把 random.gauss 和 random.normalvariate 的线程安全性搞混了? - Charles Merriam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接