我注意到,标准的rand()函数在Windows和Linux上提供了不同的结果。当然,我使用了相同的种子数(1234)。以下是几个初步结果:
赢:4068 213 12761 8758LIN:479142414 465566339 961126155 1057886067
我的应用程序要求两个平台产生相同的输出。 我有什么选择?是否有符合我要求的rand()的替代品?
感谢
PS。我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2
答案 0 :(得分:19)
Boost有一个wide range of RNGs,可能是跨平台可重现的行为。
答案 1 :(得分:7)
答案 2 :(得分:6)
如果您对标准rand
实现感到满意并且只需要可重现性,那么您可以轻松编写自己的linear congruential generator(适应C接口,可能不是一个好选择! - 而是使用类代替):
namespace myown {
static int state;
void srand(int seed) {
state = seed;
}
int rand() {
int const a = 1103515245;
int const c = 12345;
state = a * state + c;
return (state >> 16) & 0x7FFF;
}
}
这使用维基百科文章中的常量(ANSI C:Watcom)。
那就是说,我宁愿选择其他人提出的Boost的读取实现。
答案 3 :(得分:4)
由于两个平台上的功能实现不同,您将得不到相同的结果。
答案 4 :(得分:3)
我认为您甚至会发现不同的Linux版本返回不同的值,以及返回不同值的不同Windows版本。
例如,您可以使用glibc one来统一随机生成器。
另一个选择是编写自己的功能但执行仅,如果您100%确定不需要使用随机进行加密使用或任何其他用途要求物品具有不可预测性或均匀性或其他随机属性。
答案 5 :(得分:1)
此rand()实现与Windows中的rand()得到相似的结果。 我们可以使用下面的代码在linux中复制Windows rand()。
srand(seed) {
random_seed = seed;
}
rand() {
random_seed = (random_seed * 214013 + 2531011) & 0xFFFFFFFF;
return (random_seed >> 16) & 0x7FFF;
}
答案 6 :(得分:-4)
您可以尝试srand(int),它会根据种子(输入)生成随机数
- 干杯