是否存在随机种子的范围?

2024-06-02 07:31:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题与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)?在


Tags: 模块ofthepyimportismy情况
3条回答

在jupyter笔记本里,随机.seed好像有细胞镜。 例如,随机.seed(1) 需要在两个连续的单元格中指定,才能使用以下代码获得相同的结果:

单元格1:

np.random.seed(1)
np.random.random_sample(4)

单元格2:

^{pr2}$

为了回答你的第一个问题:

Does moduleB also use my_seed, or do I have to pass the seed to moduleB.py and set it again?

是的,例如,它运行了以下内容:

模数A:

import moduleb
import random 
random.seed(0)
my_random()

模数B

^{pr2}$

这将始终打印3,因为种子已设置。 一般规则是,必须运行的主python模块应该调用随机.seed()函数,这将创建在所有导入模块之间共享的种子。 只有在显式调用随机.seed又是从其他模块来的。在

对于问题2:

Does the order of setting the random seed / importing play any role?

不,它不是。除非你在设置种子之前调用随机函数。在

对于问题3:

Is this also the case for setting numpy random seeds, e.g. np.random.seed(42)?

所以,使用np.随机.种子()是因为它们不是线程安全的,所以它们的行为不相似。更多详情请访问: This Stackoverflow answer

CPythonrandom.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实现的方式工作。在

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

相关问题 更多 >