python 3: random.seed(): 应该在何处调用?

8 投票
3 回答
5871 浏览
提问于 2025-04-16 11:07

我需要确保我程序里的所有随机性都是可以完全复制的。我应该在哪里调用 random.seed() 呢?

我原以为应该放在我的 main.py 模块里,但这个模块还引入了其他一些模块,而那些模块恰好使用了随机函数。

我可以仔细查看我的导入,找出哪个模块是第一个执行的,但一旦我改变了代码结构,就得记得再分析一遍。

有没有什么简单又安全的解决办法呢?

3 个回答

1

你可以自己创建一个单例,这个单例里面包含了随机数的功能。然后你可以使用Python关于随机数的文档中的getstate和setstate方法来改变随机数生成器的状态。这样一来,你的程序就相当于有了两个随机数生成器。

4

如果你想让随机数生成的结果可以重复,最好的办法是在你的程序里创建一个 random.Random 的实例,然后对这个实例调用 seed() 方法,并用这个实例来生成随机数。

random.random() 实际上是使用了一个 random.Random 类的单例,这样做是为了方便那些不想自己创建实例的人。但是这个单例可能会和其他模块共享,这些模块也可能会调用 random.random() 来生成随机数。因此,在你的情况下,最好还是自己创建一个 random.Random 的实例。

引用一下 文档 的内容:

这个模块提供的函数实际上是一个隐藏的 random.Random 类实例的方法。你可以创建自己的 Random 实例,这样可以得到不会共享状态的随机数生成器。

7

在你的主模块的“导入部分”执行代码其实是安全的。所以如果你对导入其他模块有点犹豫,担心它们可能会使用随机模块,可能会绕过你的种子设置,你当然可以使用类似下面的代码:

import random
random.seed(seed_value)

import something
import else

if __name__ == "__main__":
    main()

撰写回答