<p>你已经提出了许多正确的意见!</p>
<p>除非您希望同时为两个随机生成器设置种子,否则从长远来看,选择一个生成器或另一个生成器可能更简单。</p>
<p>对于<code>numpy.random.seed()</code>,主要的困难在于它不是线程安全的——也就是说,如果您有<a href="http://www.prasannatech.net/2008/08/introduction-to-thread-programming.html" rel="noreferrer">many different threads of execution</a>,那么使用它是不安全的,因为如果两个不同的线程同时执行函数,那么它就不能保证工作。如果您不使用线程,并且可以合理地预期将来不需要这样重写程序,<code>numpy.random.seed()</code>应该没问题。如果有任何理由怀疑将来可能需要线程,那么从长远来看,按照建议执行和<a href="https://stackoverflow.com/questions/5836335/consistenly-create-same-random-numpy-array/5837352#5837352">make a local instance of the ^{<cd3>} class</a>会更安全。据我所知,<code>random.random.seed()</code>是线程安全的(或者至少,我没有发现任何相反的证据)。</p>
<p><code>numpy.random</code>库包含一些在科学研究中常用的额外概率分布,以及一些用于生成随机数据数组的方便函数。这个<code>random.random</code>库稍微轻一点,如果你不做科学研究或其他类型的统计工作,应该没问题。</p>
<p>否则,它们都使用<a href="http://en.wikipedia.org/wiki/Mersenne_twister" rel="noreferrer">Mersenne twister sequence</a>来生成随机数,而且它们都是完全确定的——也就是说,如果你知道一些关键信息位,就有可能绝对确定地预测<a href="https://jazzy.id.au/2010/09/22/cracking_random_number_generators_part_3.html" rel="noreferrer">what number will come next</a>。因此,numpy.random和random.random都不适合任何<a href="https://www.bishopfox.com/blog/2014/08/untwisting-mersenne-twister-killed-prng/" rel="noreferrer">serious cryptographic uses</a>。但由于序列非常长,在您不担心有人试图对您的数据进行反向工程的情况下,这两种方法都可以生成随机数。这也是需要为随机值设定种子的原因——如果每次都从同一个地方开始,那么您将始终获得相同的随机数序列!</p>
<p>顺便说一下,如果您需要加密级别的随机性,那么应该使用<a href="https://docs.python.org/3/library/secrets.html" rel="noreferrer">secrets</a>模块,如果您使用的是Python 3.6之前的Python版本,则应该使用<a href="https://www.dlitz.net/software/pycrypto/api/current/Crypto.Random.random-module.html" rel="noreferrer">Crypto.Random</a>之类的模块。</p>