python 3:random.seed():在哪里调用它?

时间:2011-02-02 23:41:08

标签: python random coding-style python-3.x

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

我认为它应该在我的main.py模块中,但它会导入其他碰巧使用随机函数的模块。

我可以仔细浏览我的导入,看看哪一个是第一个执行的,但是当我改变我的代码结构时,我将不得不记得再次重做这个分析。

有没有简单安全的解决方案?

3 个答案:

答案 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来更改随机数生成器的状态。这将为您的程序提供两个随机数生成器。