我可以将一个随机对象复制到每个实验中,而不是提前 50.000 * expid。
大致正确。每个线程都有自己的Random 实例。
将它们全部播种到相同的种子值。使用常量进行测试,“运行记录”时使用/dev/random。
编辑。在 Python 之外和较旧的实现中,使用 jumpahead( 50000 * expid ) 来避免两个生成器以并行的值序列结束的情况。在任何合理的当前(2.3 后)Python 中,jumpahead 不再是线性的,使用expid 足以扰乱状态。
您不能简单地在每个线程中执行jumpahead(1),因为这将确保它们是同步的。使用jumpahead( expid ) 确保每个线程都被明显加扰。
文档表明 jumpahead(1) 已经扰乱了状态,但这是真的吗?
是的,jumpahead 确实“扰乱”了状态。回想一下,对于给定的种子,您会得到一个 - 长 - 但 固定 伪随机数序列。你在这个序列中领先。要通过随机性测试,您必须从这个 one 序列中获取所有值。
编辑。曾几何时, jumpahead(1) 是有限的。现在 jumpahead(1) 确实进行了更大的加扰。然而,加扰是确定性的。你不能简单地在每个线程中做jumpahead(1)。
如果您有多个具有不同种子的生成器,则违反了“一个种子中的一个序列”假设,并且您的数字不会像从单个序列中获取它们一样随机。
如果您只跳头 1,您可能会得到可能相似的并行序列。 [这种相似性可能无法检测到; 理论上,有相似之处。]
当您超过 50,000 时,您确保遵循 1-sequence-1-seed 前提。您还可以确保在两次实验中不会出现相邻的数字序列。
最后,您还具有可重复性。对于给定的种子,您可以获得一致的结果。
同样的跳跃:不好。
>>> y=random.Random( 1 )
>>> z=random.Random( 1 )
>>> y.jumpahead(1)
>>> z.jumpahead(1)
>>> [ y.random() for i in range(5) ]
[0.99510321786951772, 0.92436920169905545, 0.21932404923057958, 0.20867489035315723, 0.91525579001682567]
>>> [ z.random() for i in range(5) ]
[0.99510321786951772, 0.92436920169905545, 0.21932404923057958, 0.20867489035315723, 0.91525579001682567]