Set random seed temporarily, like “new Random()”
在Python中,使用某个种子而不重新输入全局状态来生成某个随机数的最佳方法是什么?在爪哇,你可以简单地写:
1 2
| Random r = new Random(seed);
r.nextDouble(); |
标准的Math.random()不会受到影响。在Python中,我能看到的最佳解决方案是:
1 2 3 4
| old_state = random.getstate()
random.seed(seed)
random.random()
random.setstate(old_state) |
这是惯用的Python吗?它似乎比不需要"恢复"旧种子的Java解决方案干净得多。我很想知道有没有更好的方法。
您可以实例化自己的Random对象。
1
| myrandom = random.Random(myseed) |
Random模块管理自己的Random实例,该实例不受对myrandom所做更改的影响。
- 哎呀,不知怎么的,我错过了对随机文档的评论:"你可以实例化你自己的随机实例来获取不共享状态的生成器。"谢谢!
- @本阿尔伯特,是的,我去复查的时候也去了。但我知道我以前在dir(random)里见过Random,当我看的时候,它就在源头上。不知道为什么Random类本身在文档中没有自己的列表。
- 当有人仅仅因为指出文档中的内容而获得了大量的赞成票时,我总是感到惊奇…包括我自己。同样的问题也可以通过阅读来回答…
- @马蒂诺,我大体上同意;但公平地说,在这个特殊的情况下,信息是相当隐蔽的。此外,尽管文档确实提到了Random,但它们没有说明其构造函数采用的参数,并且这些信息与问题直接相关。我承认,我为自己记住使用这个来源而感到骄傲,卢克。
- @马蒂诺:相比之下,我最乐观的答案是:stackoverflow.com/questions/1020568/…。:我喜欢检查库源的pypy源,但通常我会避开cpython的源。
- @senderle:嗯,是的,在这个例子中,在第4段中它是"向下"的,到源代码的链接是在最上面的。我想很多人不会费心检查文档,因为他们认为文档很糟糕,而软件就是这样。虽然不完美,但python的相当不错,而且很糟糕的是,在提问之前,更多的人甚至连前三段都不看一眼。
- @本·阿尔珀特:事实上,Pypy源可以用于这个和其他目的——我自己也用过它。然而,在这种情况下,标准库模块显然也是用python编写的,这一点可以从Random模块的联机文档中的代码链接中得到证明。
- @马蒂诺:我读到"如果你想使用你自己设计的一个不同的基本生成器,类随机也可以被子类化",以及seed、getstate、setstate和jumpahead的文档。很抱歉,遗漏了一个提到可以手动实例化random的句子。
- @本·阿尔珀特:说到点子上——这么说的确让它听起来像一个模糊的点子。我怀疑您一定读过文档中第3段以外的内容,因为很明显,您知道下面提到的模块中使用频率较低的一些函数。对任何冒犯感到抱歉。