我正在做一个小型分布式计算项目。如果不使 Apache 在此过程中崩溃,服务器就无法处理计算,因此我将这些计算提供给用户。
基本思想是我运行了 3 次计算,结果需要完全一样。但是,该应用程序需要在 Mac、Linux 和 Windows 上运行。基本上这意味着我不能使用 rand()。
我可能正在寻找一个替代生成器,它接受一个种子值(由服务器提供)并在每个平台上给出相同的结果。
我的问题是:这确实是我正在寻找的东西吗?您有什么好的建议吗,还是我应该以不同的方式来做这件事?
我正在做一个小型分布式计算项目。如果不使 Apache 在此过程中崩溃,服务器就无法处理计算,因此我将这些计算提供给用户。
基本思想是我运行了 3 次计算,结果需要完全一样。但是,该应用程序需要在 Mac、Linux 和 Windows 上运行。基本上这意味着我不能使用 rand()。
我可能正在寻找一个替代生成器,它接受一个种子值(由服务器提供)并在每个平台上给出相同的结果。
我的问题是:这确实是我正在寻找的东西吗?您有什么好的建议吗,还是我应该以不同的方式来做这件事?
看看Boost.Random设施。它们为您提供了广泛的算法选择,保证始终提供相同的结果。
写你自己的。这出乎意料地简单。
“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 随机数库非常好 - 这里有一个使用示例Boost random number generator。据我所知,它的实现跨平台产生相同的结果,但我从未对此进行过测试。