python - (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)
?
解决方案
CPythonrandom.py
实现非常易读。我建议看看:https ://github.com/python/cpython/blob/3.6/Lib/random.py
无论如何,该版本的 python 创建一个全局random.Random()
对象并将其直接分配给random
模块。该对象包含一个方法seed(a)
,当您调用. 因此,种子状态在整个程序中共享。random.seed(a)
1) 是的。moduleA
并moduleB
使用相同的种子。导入创建全局对象random
。重新导入它只会为您提供相同的模块并维护最初创建的对象。moduleA
random.Random()
moduleB
random.Random()
2)不。不是在你给出的例子中,但总的来说是的,这很重要。您可以moduleB
在设置种子之前使用,moduleA
因此您的种子没有设置。
3)很难说。更复杂的代码库。也就是说,我认为它的工作方式相同。numpy 的作者真的必须尝试让它以不同于它在 python 实现中的工作方式工作。
一般来说,如果您担心种子状态,我建议您创建自己的随机对象并将它们传递给生成随机数。
推荐阅读
- python - Matplotlib 在两边添加空格
- docker - nginx 是否为所有浏览器请求添加路径?
- javascript - 具有自定义导航、页面点和进度条的多个 Flickity 轮播
- c# - 有没有办法使用数据上下文遍历数据库以查找和替换值?
- java - 番石榴 toJavaUtil() 不存在
- android - 更新 RatingBarChangeListener 中的全局变量
- curl - 使用 curl 无法打开网站?
- java - java 进程创建处于已删除状态但增加了 linux VM 中的磁盘利用率的 tmp/tmp* 文件
- jenkins - 詹金斯在奴隶/代理上找不到文件?
- api-platform.com - Request 中的 _route 参数为空,带有自定义操作