我需要确保程序中的所有随机性都是完全可复制的。我应该在哪里拨打random.seed()?
我认为它应该在我的main.py
模块中,但它会导入其他碰巧使用随机函数的模块。
我可以仔细浏览我的导入,看看哪一个是第一个执行的,但是当我改变我的代码结构时,我将不得不记得再次重做这个分析。
有没有简单安全的解决方案?
答案 0 :(得分:7)
在主模块的“导入部分”中执行代码实际上是安全的,因此如果您不确定导入可能使用或不使用随机模块的其他模块,可能绕过您的种子,您当然可以使用
之类的东西import random
random.seed(seed_value)
import something
import else
if __name__ == "__main__":
main()
答案 1 :(得分:4)
如果您希望随机可复制,最好在您的应用程序中创建random.Random
的实例,在该实例上调用seed()
,并将该实例用于随机数。
random.random()
实际上使用了random.Random
类的单例,以方便那些不关心自己创建类实例的人。但是,该单例可能与其他模块共享,这些模块可能因任何原因要调用random.random()
来生成随机数。这就是为什么在你的情况下你最好实例化你自己的random.Random
实例。
引自the docs:
此模块提供的函数实际上是
random.Random
类的隐藏实例的绑定方法。您可以实例化自己的Random
实例,以获取不共享状态的生成器。
答案 2 :(得分:1)
你可以滚动你自己封装随机的单身。然后,您可以使用Python documentation on random getstate和setstate来更改随机数生成器的状态。这将为您的程序提供两个随机数生成器。