我的问题与What is the scope of a random seed in Python?有关。
在上述问题的情况下,澄清了在random
的模块中存在一个(隐藏的)全局Random()
实例。在
1)我想澄清一下,在一个模块中设置随机种子是否会导致它成为其他模块中的随机种子,以及是否有某些事情需要注意。在
例如: 鉴于:模数a.py, 模块B.py在
在模数a.py以下内容:
import random
import moduleB
random.seed(my_seed)
moduleB.randomfct()
在模块B.py以下内容:
^{pr2}$moduleB是否也使用my_seed
,还是必须将种子传递给模块B.py再来一次?在
2)设置随机种子/导入的顺序是否起作用?在
例如moduleA.py
:
import random
random.seed(my_seed)
import moduleB
3)这也是设置numpy随机种子的情况吗,例如np.random.seed(42)
?在
在jupyter笔记本里,随机.seed好像有细胞镜。 例如,随机.seed(1) 需要在两个连续的单元格中指定,才能使用以下代码获得相同的结果:
单元格1:
单元格2:
^{pr2}$为了回答你的第一个问题:
是的,例如,它运行了以下内容:
模数A:
模数B
^{pr2}$这将始终打印3,因为种子已设置。 一般规则是,必须运行的主python模块应该调用随机.seed()函数,这将创建在所有导入模块之间共享的种子。 只有在显式调用随机.seed又是从其他模块来的。在
对于问题2:
不,它不是。除非你在设置种子之前调用随机函数。在
对于问题3:
所以,使用np.随机.种子()是因为它们不是线程安全的,所以它们的行为不相似。更多详情请访问: This Stackoverflow answer
CPython
random.py
实现非常可读。我建议你看看:https://github.com/python/cpython/blob/3.6/Lib/random.py无论如何,该版本的python创建了一个全局
random.Random()
对象,并将其直接分配给random
模块。此对象包含一个seed(a)
方法,当您调用random.seed(a)
时,acts as a module function。因此,种子状态将在整个程序中共享。在1)是的。}使用相同的种子。导入
moduleA
和{moduleA
中的random
将创建全局random.Random()
对象。在moduleB
中重新导入它只会给您相同的模块并维护最初创建的random.Random()
对象。在2)不。在你举的例子中没有,但总的来说是的,这很重要。在
moduleA
中设置种子之前,可以使用moduleB
,这样就不会设置种子。在3)难说。更复杂的代码库。也就是说,我认为它的工作原理是一样的。numpy的作者真的需要尝试使其以不同于python实现的方式工作。在
一般来说,如果您担心种子状态,我建议您创建自己的随机对象并将它们传递给生成随机数。在
相关问题 更多 >
编程相关推荐