Python随机种子不使用遗传编程示例代码

Mar*_*vre 5 python

我试图通过Toby Segaran的"编程集体智慧"第11章中的遗传编程代码获得可重现的结果.但是,简单地设置种子"random.seed(55)"似乎不起作用,将原始代码"从随机导入...."改为"导入随机"没有帮助,也没有改变Random().这些似乎都做了大致相同的事情,树木开始构建相同,然后发散.

在阅读关于随机行为的各种条目时,鉴于他的GP代码,我找不到为什么会发生这种分歧的原因.除了调用random之外,代码中似乎没有任何内容,它具有可解释此行为的任何可变性.我的理解是调用random.seed()应该正确设置所有调用,因为代码根本没有线程,我不确定分歧是如何或为什么发生的.

是否有人修改此代码以表现可重复?是否有某种形式的调用random.seed()可以更好地工作?

我为没有发布示例而道歉,但代码显然不是我的(我只添加对种子的调用并改变代码中调用random的方式)这似乎不是随机的简单问题(我我已经在这里随机阅读了Python上的所有条目,并在网上阅读了很多条目.

谢谢.马克L.

tre*_*mby 5

我刚才有一些完全不相关的代码遇到了同样的问题。我相信我的解决方案类似于 eryksun 的答案,尽管我没有任何树。我确实有一些集合,我正在random.choice(list(set))从它们中挑选值。有时,即使每次使用相同的种子,我的结果(选择的项目)也会出现分歧,我几乎要拔掉头发了。在这里看到 eryksun 的回答后,我尝试了random.choice(sorted(set)),问题似乎已经消失了。我对 Python 的内部工作原理知之甚少,无法解释它。

  • 啊,我错过了一个关键点。内部散列函数不是数据的真正“散列”(就像您对 sha256 或 md5 所期望的那样)。相反,它派生自 `id` 函数,它基本上是对象的内存地址。所以每次都会不一样。你可以看到。创建两个字符串对象,并通过`id`和`hash`函数传递它们,它们将是相似的。这也可能是关于它们为何不同的兴趣:http://stackoverflow.com/a/17192858/4293417 (2认同)

Tho*_*s K 3

这可能有助于创建一个不会受到其他地方干扰的随机对象:

from random import Random
random = Random(55)
# random can be used like the plain module
Run Code Online (Sandbox Code Playgroud)

如果其他库出于任何原因进行调用random.seed,它们不会影响您为程序创建的随机对象。