python 3: random.seed(): 应该在何处调用?
我需要确保我程序里的所有随机性都是可以完全复制的。我应该在哪里调用 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()