用于集群环境的随机数生成器

如何在集群上生成独立的伪随机数,例如用于蒙特卡罗仿真? 我可以有很多计算节点(例如100),并且我需要在每个节点上生成数百万个数字。 我需要保证一个节点上的PRN序列不会与另一个节点上的PRN序列重叠。

  • 我可以在根节点上生成所有PRN,然后将它们发送到其他节点。 但它会太慢。
  • 我可以在每个节点上跳到序列中的已知距离。 但是,对于Mersenne-Twister或其他任何良好的PRNG,是否存在这样的算法?这可以通过合理的时间和内存来完成?
  • 我可以在每个节点上使用不同的生成器。 但是,像Mersenne-Twister这样的好发电机有可能吗? 它怎么能做到?
  • 还有其他的吗?

  • 您绝不应该使用从相同原始流获取的可能重叠的随机流。 如果你还没有测试结果交错流,你不知道它的统计质量。

    幸运的是, Mersenne Twister(MT)将帮助您完成您的配送任务。 使用其专用算法(称为动态创建器 (以下简称DC)),您可以创建独立的随机数生成器 ,生成高度独立的随机数据流。

    每个流都将在将使用它的节点上创建。 基本上,可以将DC视为面向对象范例中的构造函数,从而创建不同的MT实例。 每个不同的实例被设计为产生高度独立的随机序列。

    你可以在这里找到DC:http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html
    使用起来非常简单,您可以修复不同的参数,例如您想要获取的不同MT实例的数量或这些MT的周期。 取决于其输入参数,DC将会改变运行时间。

    除了随DC一起提供的自述文件之外,还可以查看DC归档文件中的example/new_example2.c文件。 它显示了在给定不同输入标识符的情况下获取独立序列的调用示例,这基本上是您必须确定群集作业的方法。

    最后,如果您打算更多地了解如何在并行或分布式环境中使用PRNG,我建议您阅读这些科学文章:

    随机高性能计算随机流的实际分布 ,David RC Hill,高性能计算和仿真国际会议(HPCS),2010


    好的,回答#2 ;-)

    我要说...保持简单。 只需使用“短”种子来启动MT(想象这种种子因缺乏更好的限制而为232比特)。 这假定短种子生成“充分分布”MT起始状态(例如希望在我的其他答案中的代码中的init_genrand )。 这并不能保证平均分配的开始状态,而是保证“足够好”,见下文。

    每个节点将使用它自己的预先选择的种子序列(发送的随机种子列表或者像number_nodes * node_number * iteration的公式)。 重要的是,最初的“短”种子永远不会在节点间重复使用。

    然后,每个节点将使用一个MT PRNG与该种子初始化n倍其中n <<< MT_period / max_value_of_short_seed (TT800是2800-1和MT19937是219937-1,所以n仍然可以是一个非常大的数字)。 在n次之后,节点移动到所选列表中的下一个种子。

    尽管我没有(也不能)提供一个“保证”,即任何节点都不会在同一时间(或根本不会)有重复的序列,但这里是AMD关于使用不同的分支的说法:(很明显,初始播种算法播放一名角色)。

    在这里描述的创建多个流的四种方法中,这是最不令人满意的 ...例如,如果初始值相距不够远,则从不同起点生成的序列可能会重叠。 如果发生器的使用周期很大,则重叠序列的可能性会降低。 虽然不能保证序列的独立性,但由于其非常大的周期,使用具有随机起始值的Mersenne Twister不太可能导致问题 ,特别是如果所需序列的数量很少的话......

    快乐的编码。


    我可以在每个节点上跳到序列中的已知距离。 但是,对于Mersenne-Twister或其他任何良好的PRNG,是否存在这样的算法?这可以通过合理的时间和内存来完成?

    是的,请参阅http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html。 这是获得独立随机数字流的绝佳解决方案。 通过比每个流所需的随机数的数量更大的跳转来创建每个流的开始,这些流不会重叠。

    链接地址: http://www.djcxy.com/p/37299.html

    上一篇: random number generator for cluster environment

    下一篇: What is a good hashing algorithm for seeding a prng with a string?