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

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

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

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

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

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

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

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

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

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

作为旁注,如果您确实需要加密级别的随机性,那么您应该使用secrets模块,或者如果您使用的是早于Python 3.6的Python版本,则应该使用Crypto.Random之类的模块

发表评论