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

Python中numpy.random和random.random的区别,python,random,random-seed,Python,Random,Random Seed,我有一个Python的大脚本。我从别人的代码中获得了灵感,因此我最终使用了numpy.random模块来处理一些事情(例如,创建一个从二项分布中提取的随机数数组),在其他地方我使用了模块random.random 有人能告诉我这两者的主要区别吗? 在我看来,numpy.random只是有更多的方法,但我不清楚随机数的生成是如何不同的 我之所以问这个问题,是因为我需要为我的主程序设定种子,以便进行调试。但除非我在导入的所有模块中使用相同的随机数生成器,否则它不会工作,对吗 另外,我在这里的另一篇文

我有一个Python的大脚本。我从别人的代码中获得了灵感,因此我最终使用了
numpy.random
模块来处理一些事情(例如,创建一个从二项分布中提取的随机数数组),在其他地方我使用了模块
random.random

有人能告诉我这两者的主要区别吗? 在我看来,
numpy.random
只是有更多的方法,但我不清楚随机数的生成是如何不同的

我之所以问这个问题,是因为我需要为我的主程序设定种子,以便进行调试。但除非我在导入的所有模块中使用相同的随机数生成器,否则它不会工作,对吗


另外,我在这里的另一篇文章中读到了关于不使用
numpy.random.seed()
的讨论,但我真的不明白为什么这是个坏主意。如果有人能告诉我为什么会这样,我将不胜感激。

你已经做了许多正确的观察

除非您想为两个随机生成器都设置种子,否则从长远来看,选择一个生成器或另一个生成器可能更简单。但是如果你确实需要同时使用这两种方法,那么是的,你也需要同时为它们设定种子,因为它们生成的随机数彼此独立

对于
numpy.random.seed()
,主要的困难在于它不是线程安全的——也就是说,如果您有,使用它是不安全的,因为如果两个不同的线程同时执行函数,它就不能保证工作。如果您没有使用线程,并且可以合理预期将来不需要以这种方式重写程序,
numpy.random.seed()
应该可以。如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照建议去做,并且去做会更安全。据我所知,
random.random.seed()
是线程安全的(或者至少,我还没有找到任何相反的证据)

numpy.random
库包含一些在科学研究中常用的额外概率分布,以及两个用于生成随机数据数组的方便函数。random.random库更轻量级,如果您不从事科学研究或其他统计工作,它应该可以使用

否则,它们都使用生成它们的随机数,并且它们都是完全确定的——也就是说,如果你知道一些关键信息,就有可能绝对确定地进行预测。因此,numpy.random和random.random都不适用于任何对象。但由于序列非常长,在您不担心有人试图对数据进行反向工程的情况下,两者都可以生成随机数。这也是有必要对随机值进行种子设定的原因——如果每次都从同一个地方开始,您将始终获得相同的随机数序列


作为旁注,如果您确实需要加密级别的随机性,您应该使用该模块,或者如果您使用的是早于Python 3.6的Python版本。

种子源和使用的分发配置文件将影响输出-如果您正在寻找加密随机性,请从os.Uradom()进行种子设定将从设备聊天(即以太网或磁盘)中获得几乎真实的随机字节(BSD上的ie/dev/random)

这将避免您给出一个种子,从而生成确定性随机数。然而,随机调用允许你将数字拟合到一个分布(我称之为科学随机性——最终你想要的是随机数字的钟形曲线分布,numpy最擅长研究这个

因此,是的,坚持使用一个生成器,但要确定您想要的随机数-随机数,但不依赖于分布曲线,或者在没有量子设备的情况下尽可能随机。

模块
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

令我惊讶的是,
randint(a,b)
方法在
numpy.random
random
中都存在,但它们的上限行为不同


random.randint(a,b)
返回一个随机整数N,因此
a作为一个远亲音符,有时两者都不需要使用,因为Mersenne twister不能产生足够用于加密的随机熵序列(以及一些不寻常的科学)用途。在这些罕见的情况下,您通常需要,它能够使用操作系统特定的熵源来生成非确定性随机序列,其质量远远高于
random.random
单独提供的质量。不过,您通常不需要这些。谢谢Hannnele。您的见解真的非常有用!事实证明,我不能不要只使用一个随机数生成器(需要是numpy,因为随机数不会产生二项式分布),因为我的程序的一部分调用另一个使用随机数的程序。我将不得不为这两个生成器设置种子。“如果你知道现在的数字,就有可能绝对肯定地预测下一个数字。“我认为这句话可能需要澄清。意思是,如果你知道生成器的内部状态,你可以复制序列-这就是你在为生成器种子时所做的。给定生成器输出的单个数字,你不能