您已经做出了许多正确的观察!
除非您想为两个随机生成器播种,否则从长远来看,选择一个或另一个生成器可能更简单。但是,如果您确实需要同时使用两者,那么是的,您还需要同时为它们播种,因为它们彼此独立地生成随机数。
对于numpy.random.seed()
,主要的困难是它不是线程安全的——也就是说,如果你有许多不同的执行线程,使用它是不安全的,因为如果两个不同的线程同时执行这个函数,它就不能保证工作。如果您不使用线程,并且您可以合理地预期将来不需要以这种方式重写程序,那numpy.random.seed()
应该没问题。如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照建议进行操作并创建类的本地实例numpy.random.Random
会更安全。据我所知,random.random.seed()
它是线程安全的(或者至少,我没有发现任何相反的证据)。
该numpy.random
库包含一些科学研究中常用的额外概率分布,以及一些用于生成随机数据数组的便利函数。该random.random
库更轻量级,如果您不进行科学研究或其他类型的统计工作,应该没问题。
否则,它们都使用梅森捻线器序列来生成它们的随机数,而且它们都是完全确定的——也就是说,如果你知道一些关键信息,就可以绝对确定地预测接下来会出现什么数字。出于这个原因, numpy.random 和 random.random 都不适合任何严重的加密用途。但是由于序列非常非常长,在您不担心有人试图对您的数据进行逆向工程的情况下,两者都可以生成随机数。这也是需要播种随机值的原因——如果你每次都从同一个地方开始,你总是会得到相同的随机数序列!
附带说明一下,如果您确实需要加密级别的随机性,则应该使用secrets模块,或者如果您使用的是 Python 3.6 之前的 Python 版本,则应该使用Crypto.Random 之类的东西。