【问题标题】:python 3: random.seed(): where to call it?python 3:random.seed():在哪里调用它?
【发布时间】:2011-06-20 08:32:53
【问题描述】:

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

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

我可以仔细浏览我的导入,看看哪个是第一个执行的,但是当我更改我的代码结构时,我将不得不记住重新进行此分析。

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

【问题讨论】:

  • 您是否担心使用随机函数的模块会干扰可复制性?只要他们自己不使用 random.seed() 就可以了。如果这不是你的担心,你为什么担心你的模块会发生什么?
  • 你是说你没有一个顶级的main() 函数来完成应用程序的真正工作吗?为什么不呢?
  • @Josh @S Lott:我有main;首先说:import randomimport anothermodulerandom.random.seed()。只是anothermodule 恰好也有import random 并使用了random 中的函数,因此我的播种来得太晚了。

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


【解决方案1】:

你可以滚动你自己的单例来封装随机。然后您可以使用Python documentation on random getstate 和 setstate 来更改随机数生成器的状态。这会给你的程序提供两个随机数生成器。

【讨论】:

  • 代替 random.random(),考虑制作一个 random.WichmannHill 实例的“单例”,并在需要可重现结果的整个代码中使用它。所有其他调用 random.random() 的模块可以在你不关心或不知道的情况下继续这样做。
【解决方案2】:

在主模块的“导入部分”中执行代码实际上是安全的,因此如果您不确定导入可能会或可能不会使用随机模块的其他模块,可能会绕过您的种子,您当然可以使用像

import random
random.seed(seed_value)

import something
import else

if __name__ == "__main__":
    main()

【讨论】:

    【解决方案3】:

    如果您希望随机数可复制,最好在您的应用程序中创建一个random.Random 的实例,在该实例上调用seed(),并将该实例用作您的随机数。

    random.random() 实际上使用了 random.Random 类的单例,以方便那些不太关心创建自己的类实例的人。但是该单例可能会与其他可能想要调用random.random() 以出于任何原因生成随机数的模块共享。这就是为什么在你的情况下你最好实例化你自己的 random.Random 实例。

    引用the docs:

    此模块提供的函数实际上是random.Random 类的隐藏实例的绑定方法。您可以实例化您自己的 Random 实例以获取不共享状态的生成器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2014-05-03
      相关资源
      最近更新 更多