从1个值播种N个独立随机数生成器的最佳方法


10

在我的程序中,我需要运行N个单独的线程,每个线程都有自己的RNG,该RNG用于采样大型数据集。我需要能够使用单个值为整个过程设定种子,以便能够重现结果。

仅按顺序增加每个索引的种子就足够了吗?

目前,我使用numpy的是RandomState使用Mersenne Twister伪随机数生成器的。

下面的代码片段:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

本质上,我从用户输入的种子(如果存在)开始,然后针对每个实例/线程,依次添加正在运行的实例的索引(从0到N-1)。我不知道这是个好习惯还是有更好的方法来做到这一点。


1
您是否预先知道每个线程将使用多少个伪随机值?或者至少您可以获得良好的上限估计?
ub

不,我不能。它对区域求和,直到达到阈值为止。区域的大小可能会有很大差异。
EricR

Answers:


9

当然,这不是一个好习惯。例如,考虑当您用根种子12345和12346进行两次运行时会发生什么。每次运行都将具有N-1共同的流。

Mersenne Twister实现(包括numpy.randomrandom)通常使用不同的PRNG将整数种子扩展为MT使用的大型状态向量(624个32位整数);这是的数组RandomState.get_state()。执行所需操作的一个好方法是运行该PRNG,并使用输入整数作为种子一次,然后从中获取N*62432位整数。将该流分成N状态向量,并用于RandomState.set_state()显式初始化每个RandomState实例。您可能必须查阅标准库的C源代码numpy.random_random从标准库的C源代码获得PRNG(它们相同)。我不确定是否有人为Python实现了PRNG的独立版本。


我认为这可能是我到目前为止所听到的最好的解决方案。对于正确分割流,我认为这并不重要。无论如何从初始PRNG和种子中选取实例,在实例之间的624个32位整数上都存在重复序列的可能性似乎很小。
EricR

1
实际上,我会稍微退一步。对我来说还不清楚初始化器PRNG的设计是否可以从中提取任意多个值。考虑使用另一种质量PRNG(最好与MT不相关)来生成状态流。可以相对简单地仅使用标准库来实现HMAC-DRBG(使用HMAC作为加密原语的PRNG)。密码安全性不成问题;只是易于实现和比特流的质量。您将需要确保不会产生全零向量,而这种情况非常罕见。
罗伯特·肯恩

或者只使用RandomState开发中的一种较新的实现,该实现使用具有可设置流的算法。也就是说,您可以RandomState使用相同的种子和不同的流ID 初始化每个实例(只需增加一个就可以),并且可以确保获得独立的流。pypi.python.org/pypi/randomstate
罗伯特·肯恩

4

Φüüñ

  1. ΦüΦñüΦ2ñü
  2. Φ2üΦ1个+ñüΦ1个+2ñü
  3. ...
  4. Φñ-1个üΦñ-1个+ñüΦñ-1个+2ñü

Φñü=ΦΦñ-1个ü


2

现在有一个名为RandomGen的Python程序包,它具有实现此目的的方法。

支持从单个种子创建的独立流,以及用于较早的随机数生成器(例如MT19937)的跳跃协议。


0

有人声称顺序种子产生的随机数存在相关性。/programming/10900852/near-seeds-in-random-number-generation-may-give-like-random-numbers我不确定这是多么真实。

如果您对此感到担心,为什么不使用单个随机数生成器为所有其他生成器选择种子呢?


仅仅是因为我不想为1个以上的生成器随机生成同一种子的机会。当然,我可以做一些编程工作来防止这种情况的发生,但是我不知道这比首先顺序地采种更好。
EricR '16

1
显然,相关性是可能的顺序种子......然而,当文章从约翰·d库克的博客显示,答案链接,使用一个RNG产生种子其他发电机是远远更糟,因为你碰上生日问题!它说随机生成1000个16位无符号种子有99.95%的重叠机会!
Praveen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.