我正在开发一个小型分布式计算项目。服务器无法在不破坏Apache的情况下处理计算,因此我将这些计算提供给用户。
基本思想是我运行3次计算,结果需要完全相同。但是,该应用程序需要在Mac,Linux和Windows上运行。基本上这意味着我不能使用rand()。
我可能正在寻找一个替代生成器,它接受种子值(由服务器提供)并在每个平台上提供相同的结果。
我的问题是:这确实是我在寻找什么,你是否有一个好的推荐,或者我应该以不同的方式做到这一点?
答案 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。据我所知,它的实现产生了跨平台的相同结果,但我从未测试过这个。