是否可以创建可重复的随机数流?

时间:2013-08-14 14:40:23

标签: python

Per How to generate a repeatable random number sequence?可以设置随机模块的状态,以便您可以期望后续调用randint返回相同的数字。

我看到这种方法的一个限制是状态设置在模块级别(本质上是一个全局变量)所以似乎不可能创建几个可重复的随机数流/迭代器(但是流的调用可以任意交织)与当前机制。是否有任何变通方法/替代库可以实现这一目标?

2 个答案:

答案 0 :(得分:8)

它不必在模块级别维护状态 - 请参阅random module的文档:

  

该模块提供的函数实际上是a的绑定方法   隐藏random.Random类的实例。你可以实例化你的   拥有Random的实例来获取不共享状态的生成器。这个   对于多线程程序特别有用,创建一个不同的程序   每个线程的Random实例,并使用jumpahead()方法   使得每个线程可能看到生成的序列   不要重叠。

答案 1 :(得分:5)

random.Random()正是您要找的。

http://hg.python.org/cpython/file/2.7/Lib/random.py#l72

所有random.*模块级函数都只是位于Random()的共享random._inst实例的代理。

http://hg.python.org/cpython/file/2.7/Lib/random.py#l879

根据您的情况,您所做的只是实例化N random.Random()个实例;它们将具有独立的内部RNG状态,可以播种/消费而不会相互影响。

事实上,我认为最好的做法是为非平凡的应用程序创建自己的Random()实例,特别是如果存在依赖于状态的错误等,它可以很容易地重复。特别是在测试套件中,这可能是非常宝贵的。