【问题标题】:Cross-OS distributed computing in C++, rand() issueC++ 中的跨操作系统分布式计算,rand() 问题
【发布时间】:2011-06-10 16:09:29
【问题描述】:

我正在从事一个小型分布式计算项目。服务器无法在处理过程中不使 Apache 崩溃的情况下处理计算,所以我将这些计算提供给用户。

基本思路是我运行了 3 次计算,结果需要完全一样。但是,该应用程序需要在 Mac、Linux 和 Windows 上运行。基本上这意味着我不能使用 rand()。

我可能正在寻找一个替代生成器,它接受种子值(由服务器提供)并在每个平台上给出相同的结果。

我的问题是:这确实是我正在寻找的东西吗?您有什么好的建议吗,还是我应该以不同的方式来做这件事?

【问题讨论】:

    标签: c++ random distributed-computing srand


    【解决方案1】:

    看看Boost.Random 设施。它们为您提供了广泛的算法选择,保证始终提供相同的结果。

    【讨论】:

    • +1 比我快。 ;-) 但是,是的,我相信 Boost.Random 将在不同平台上提供可移植的结果。
    【解决方案2】:

    自己写。它非常简单。

    “C 中的数值配方——科学计算的艺术”有几种算法,我可以只向您介绍一种(Park 和 Miller 的“最小”随机数生成器。):

    #define IA 16807
    #define IM 2147483647
    #define AM (1.0/IM)
    #define IQ 127773
    #define IR 2836
    #define MASK 123459876
    
    
    
    float ran0(long *idum)
    {
     long k;
     float ans;
     *idum ^= MASK;
     k=(*idum)/IQ;
     *idum=IA*(*idum-k*IQ)-IR*k;
     if (*idum < 0) *idum += IM;
      ans=AM*(*idum);
     *idum ^= MASK;
     return ans;
    }
    

    返回 0.0 到 1.0 之间的均匀随机偏差。将 idum 设置或重置为任何整数值(不太可能的值 MASK 除外)以初始化序列; idum 不能在对序列中连续偏差的调用之间更改。

    编辑

    由于您需要 RNG 的良好性能,您可以使用快速而肮脏的算法。这是一个:

    unsigned long idum; // initialize the value to something
    // get a RND
    idum = 1664525L*idum + 1013904223L;
    

    【讨论】:

    • 它既出奇的简单,又出奇的容易出错。
    • 看起来不错,我认为这段代码的性能也很好。但是,老实说,我完全不知道上面的代码会发生什么,在我知道之前我可能会坚持使用 Boost。当然,如果我遇到性能问题,我会确保考虑这段代码 :) +1 向我展示它是多么“简单”。
    • @Tom Off 当然书中还有其他算法,但我怀疑你会遇到 boost 库的性能问题
    • @VJo 我认为超过三分之一的计算与随机数有关。应用程序的实际瓶颈当然是 RAM 的速度,但我想尽可能优化。不过,现在我会尽量简单。
    • @Tom 在这种情况下,你可以快速而肮脏的 RNG
    【解决方案3】:

    boost 随机数库非常好——这里有一个使用示例Boost random number generator。据我所知,它的实现跨平台产生相同的结果,但我从未对此进行过测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2018-03-10
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多