首页 > 解决方案 > (numpy)随机种子有范围吗?

问题描述

我的问题与Python 中随机种子的范围是什么有关?. 在上述问题的情况下,已澄清Random()模块中有一个(隐藏的)全局实例random

1)我想澄清在一个模块中设置随机种子是否会导致它成为其他模块中的随机种子,以及是否有某些事情需要注意。

例如:给定:moduleA.py,moduleB.py

模块A.py:

import random 
import moduleB
random.seed(my_seed)
moduleB.randomfct()

模块B.py:

import random 
def randomfct():
    #do_things_using_random

moduleB 是否也使用my_seed,还是我必须将种子传递给 moduleB.py 并再次设置?

2)设置随机种子/导入的顺序有什么作用吗?

例如在moduleA.py

import random 
random.seed(my_seed)
import moduleB

3)这也是设置numpy随机种子的情况吗,例如np.random.seed(42)

标签: pythonnumpyrandomscope

解决方案


CPythonrandom.py实现非常易读。我建议看看:https ://github.com/python/cpython/blob/3.6/Lib/random.py

无论如何,该版本的 python 创建一个全局random.Random()对象并将其直接分配给random模块。该对象包含一个方法seed(a),当您调用. 因此,种子状态在整个程序中共享。random.seed(a)

1) 是的。moduleAmoduleB使用相同的种子。导入创建全局对象random。重新导入它只会为您提供相同的模块并维护最初创建的对象。moduleArandom.Random()moduleBrandom.Random()

2)不。不是在你给出的例子中,但总的来说是的,这很重要。您可以moduleB在设置种子之前使用,moduleA因此您的种子没有设置。

3)很难说。更复杂的代码库。也就是说,我认为它的工作方式相同。numpy 的作者真的必须尝试让它以不同于它在 python 实现中的工作方式工作。

一般来说,如果您担心种子状态,我建议您创建自己的随机对象并将它们传递给生成随机数。


推荐阅读