C ++中的跨操作系统分布式计算,rand()问题

时间:2011-06-10 16:09:30

标签: c++ random distributed-computing srand

我正在开发一个小型分布式计算项目。服务器无法在不破坏Apache的情况下处理计算,因此我将这些计算提供给用户。

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

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

我的问题是:这确实是我在寻找什么,你是否有一个好的推荐,或者我应该以不同的方式做到这一点?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

自己写。它出人意料地直截了当。

“C中的数字配方 - 科学计算的艺术”有几种算法,我只能给你一个(Park和Miller的“Minimal”随机数发生器):

#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;

答案 2 :(得分:0)

增强随机数库非常好 - 这里有一个使用它的例子Boost random number generator。据我所知,它的实现产生了跨平台的相同结果,但我从未测试过这个。