1

我正在做一个小型分布式计算项目。如果不使 Apache 在此过程中崩溃,服务器就无法处理计算,因此我将这些计算提供给用户。

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

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

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

4

3 回答 3

7

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

于 2011-06-10T16:11:28.607 回答
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;
于 2011-06-10T16:24:00.400 回答
0

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

于 2011-06-10T16:14:43.313 回答