Python中numpy.random和random.random的区别

我有一个Python脚本。 我启发了自己在其他人的代码,所以我最终使用numpy.random模块的一些东西(例如创build一个从二项分布采取的随机数组),在其他地方,我使用模块random.random

有人能告诉我两者之间的主要区别吗? 看看这两个文档的网页,在我看来, numpy.random只是有更多的方法,但我不清楚随机数的产生是不同的。

我所要问的原因是因为我需要将我的主程序播种以进行debugging。 但是,除非我在我导入的所有模块中使用相同的随机数字生成器,否则这是行不通的,这是正确的吗?

另外,我在另一篇文章中阅读了关于不使用numpy.random.seed()的讨论,但是我不明白为什么这是一个糟糕的主意。 我真的很感激,如果有人解释我为什么是这样的话。

你已经做了很多正确的观察!

除非你想种下两个随机发生器,否则从长远来看,select一个发生器或另一个发生器可能会更简单。

对于numpy.random.seed() ,主要的难点在于它不是线程安全的 – 也就是说,如果你有很多不同的执行线程是不安全的,因为如果两个不同的线程正在执行该function在同一时间。 如果你不使用线程,并且如果你可以合理地预期你将不需要以这种方式重写你的程序, numpy.random.seed()应该没问题。 如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照build议进行操作并创buildnumpy.random.Random类的本地实例会更安全。 据我所知, random.random.seed()是线程安全的(或至less,我没有find任何相反的证据)。

numpy.random库包含了科学研究中常用的一些额外的概率分布,以及生成随机数据arrays的一些便利函数。 random.random库稍微random.random ,如果你不做科学研究或其他统计工作,应该没问题。

否则,他们都使用Mersenne twister序列来产生它们的随机数,而且它们都是完全确定性的 – 也就是说,如果您知道一些关键信息位,就可以绝对确定地预测下一个数字 。 出于这个原因,既不适用于任何严重的encryption使用(你可能会想看看像Crypto.Random,或者,从Python 3.6,而不是秘密模块)。 但是因为序列非常长,所以在日常的程序中都可以生成随机数。 这也是产生随机值的必要性的原因 – 如果你每次都在同一个地方开始,你总会得到相同的随机数序列!

如果你正在寻找密码随机性,os.urandom()的种子将从设备chatter(即以太网或磁盘)几乎真正的随机字节(即/ dev / random在BSD上)

这将避免你给一个种子,从而产生决定性的随机数。 然而,随机的电话,然后让你把数字适合分布(我称之为科学随机性 – 最终所有你想要的是一个随机数的钟形曲线分布,numpy是最好的在这一点上。

所以,坚持一个发电机,但决定什么随机你想要 – 随机,但从distrubtuion曲线defitniely,或随机的,你可以得到没有量子设备。

从Python for Data Analysis开始 ,模块numpy.random使用函数来补充Python random ,以便从多种概率分布中高效地生成整个样本值数组。

相比之下,Python的内置random模块一次仅采样一个值,而numpy.random可以更快地生成非常大的采样。 使用IPython magic函数%timeit可以看到哪个模块执行得更快:

 In [1]: from random import normalvariate In [2]: N = 1000000 In [3]: %timeit samples = [normalvariate(0, 1) for _ in xrange(N)] 1 loop, best of 3: 963 ms per loop In [4]: %timeit np.random.normal(size=N) 10 loops, best of 3: 38.5 ms per loop