random.normalvariate()
和random.gauss()
有什么区别?
它们使用相同的参数并返回相同的值,实际上执行相同的功能。
我从previous answer了解到random.gauss()
不是thread safe,但在这种情况下这意味着什么?为什么程序员应该关心这个问题?或者说,为什么Python的“random”中包含了一个线程安全和一个非线程安全的版本?
random.normalvariate()
和random.gauss()
有什么区别?
它们使用相同的参数并返回相同的值,实际上执行相同的功能。
我从previous answer了解到random.gauss()
不是thread safe,但在这种情况下这意味着什么?为什么程序员应该关心这个问题?或者说,为什么Python的“random”中包含了一个线程安全和一个非线程安全的版本?
这是一个有趣的问题。一般来说,了解两个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.
我不是完全确定,但Python文档说random.gauss稍微快一些,所以如果你可以接受非线程安全,那么你可以更快一点。
random.normalvariate
两次将导致 random.normalvariate
的内部代码在第一次调用返回之前可能会被运行两次。在第二次调用之前,函数的内部变量可能不会被重置,这可能会导致函数输出错误。random.gauss
的连续调用必须等待早期调用返回后再进行调用。random.normalvariate
的优点是更快,但可能会产生错误的输出。