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

What is the difference between random.normalvariate() and random.gauss() in python?

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

它们采用相同的参数和 return 相同的值,执行基本相同的功能。

我从 previous answer that random.gauss() is not thread safe 中了解到,但这在这种情况下是什么意思?为什么程序员要关心这个?或者,为什么 Python 的 'random'?

中同时包含线程安全和非线程安全版本

我不完全确定这一点,但 Python 文档说 random.gauss 稍微快一点,所以如果您对非线程安全没问题,那么您可以更快一点。

在多线程系统中,连续快速调用两次 random.normalvariate 将导致 random.normalvariate 的内部代码为 运行 两次,可能在第一次调用之前有机会return。函数的内部变量可能在秒之前没有被重置,这可能会导致函数输出错误。

random.gauss 的连续调用必须等待之前对 return 的调用才能被调用。

因此 random.normalvariate 的优点是速度更快,但可能会产生错误的输出。

线程安全的代码段必须考虑到可能的 race conditions during execution. This introduces overhead as a result of synchronization schemes,例如互斥锁、信号量等

但是,如果您正在编写不可重入代码,通常不会出现竞争条件,这实际上意味着您可以编写执行速度更快的代码。我想这就是引入 random.gauss() 的原因,因为 python 文档说它比线程安全版本更快。

这是一个有趣的问题。一般来说,了解两个 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.