我有一个很大的Python脚本。我从其他人的代码中获得灵感,所以我最终使用numpy.random模块来做一些事情(例如,创建一个从二项分布中提取的随机数组),而在其他地方,我使用random.random模块。
有人能告诉我这两者之间的主要区别吗?看一下这两个的文档网页,我觉得numpy.random只是有更多的方法,但我不清楚随机数的生成有什么不同。
我问这个问题的原因是,为了调试的目的,我需要为我的主程序设置种子。但是它不能工作,除非我在我导入的所有模块中使用相同的随机数生成器,这是正确的吗?
此外,我在另一篇文章中读到了一篇关于不使用numpy.random.seed()的讨论,但我真的不明白为什么这是一个如此糟糕的想法。如果有人能给我解释一下为什么会这样,我将不胜感激。
发布于 2011-08-12 01:56:07
你已经做了很多正确的观察了!
除非你想将两个随机生成器都设定为种子,否则从长远来看,选择其中一个生成器可能会更简单。但是如果您确实需要同时使用这两种方法,那么是的,您还需要同时使用这两种方法,因为它们会生成相互独立的随机数。
对于numpy.random.seed(),主要的困难在于它不是线程安全的-也就是说,如果您有many different threads of execution,那么使用它是不安全的,因为如果两个不同的线程同时执行函数,就不能保证它能正常工作。如果您没有使用线程,并且您可以合理地预期将来不需要以这种方式重写程序,那么numpy.random.seed()应该没问题。如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照建议执行并使用make a local instance of the numpy.random.Random class要安全得多。据我所知,random.random.seed()是线程安全的(或者至少,我没有发现任何相反的证据)。
numpy.random库包含一些在科学研究中常用的额外概率分布,以及几个用于生成随机数据数组的方便函数。random.random库稍微轻量级一些,如果您不从事科学研究或其他类型的统计工作,应该可以使用它。
否则,它们都使用Mersenne twister sequence来生成随机数,并且它们都是完全确定的-也就是说,如果你知道一些关键的信息,就有可能绝对确定地预测what number will come next。因此,numpy.random和random.random都不适合任何serious cryptographic uses。但是因为序列非常非常长,所以在您不担心有人试图对您的数据进行反向工程的情况下,这两种方法都可以很好地生成随机数。这也是为什么必须给随机值设定种子的原因--如果你每次都从同一个地方开始,你总是会得到相同的随机数序列!
顺便说一句,如果你确实需要加密级别的随机性,你应该使用secrets模块,或者如果你使用的是早于Python3.6的Python版本,那么你应该使用Crypto.Random模块。
发布于 2017-05-08 09:37:06
在Python for Data Analysis中,numpy.random模块为Python random补充了一些函数,可以有效地从多种概率分布中生成完整的样本值数组。
相比之下,Python的内置random模块一次只对一个值进行采样,而numpy.random可以更快地生成非常大的采样。使用IPython魔术函数%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发布于 2011-08-12 02:25:34
种子的来源和使用的分布配置文件将影响输出-如果你正在寻找加密随机性,从os.urandom()中进行种子将从设备聊天(即以太网或磁盘)获得几乎真实的随机字节(即BSD上的/dev/random )
这将避免你给出一个种子,从而产生确定性随机数。然而,随机呼叫允许你将数字拟合到一个分布中(我称之为科学随机性--最终你想要的是随机数的钟形曲线分布,numpy最擅长于此。
所以,是的,坚持使用一个生成器,但决定你想要的随机-随机,但明确地从分布曲线,或者像你可以得到的没有量子设备的随机。
https://stackoverflow.com/questions/7029993
复制相似问题