Windows和Linux上的不同rand()结果

mic*_*hal 10 c++ random

我注意到,标准的rand()函数在Windows和Linux上给出了不同的结果.当然,我使用了相同的种子数(1234).以下是几个初步结果:

WIN:4068 213 12761 8758

LIN:479142414 465566339 961126155 1057886067

我的应用程序要求两个平台产生相同的输出.我有什么选择?是否有符合我要求的兰德()的良好替代品?

谢谢

PS.我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2

Mar*_*tos 19

Boost具有广泛的RNG,可能具有跨平台的可重现行为.


Oli*_*rth 7

  • 不推荐使用,因为实现的正确性难以测试,并且任何错误都不会立即显现,但可能会在应用程序执行期间导致问题.还有,为什么重新发明轮子? (5认同)
  • 为什么“不推荐”?LCG 是一个简单的单行代码,维基百科文章提供了一系列常用常量,这些常量或多或少会产生良好的行为(与 C 标准库实现相同)。 (2认同)

Kon*_*lph 6

如果您对标准rand实现感到满意并且只需要可重现性,那么您可以轻松编写自己的线性同余生成器(适应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;
}

}
Run Code Online (Sandbox Code Playgroud)

这使用了维基百科文章中的常量(ANSI C:Watcom).

也就是说,我宁愿选择其他人提出的Boost读取实现.