C++ rand和srand在不同的机器上获得不同的输出

Pro*_*sam 4 c++ random multiplatform

我想生成一个随机整数,所以我使用了C++ rand(void)和srand(int)函数:

int main(){
     srand(1);
     cout << rand() << endl;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

好的,它符合我的需要.每次执行它我得到相同的结果,我喜欢它!
但有一个问题.当我在计算机上执行它时,我输出了16807.但是当我在另一台机器上执行时,我得到了1804289383.

我知道rand()和srand(int)有一个类似于这个的简单实现:

static unsigned long int next = 1;

int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

void srand(unsigned int seed)
{
    next = seed;
}
Run Code Online (Sandbox Code Playgroud)

所以为什么?是否有可能rand()在多台机器上有不同的实现?我该怎么办?

我想以这样的方式修改另一台机器,我也从那台机器上获得16807.
请注意,我喜欢计算机上的rand实现.请告诉我其他机器与我的相同结果.

提前致谢.

Kei*_*son 8

是的,rand()有不同的实现; 没有要求他们是完全相同的.

如果您希望跨实现和平台执行一致的序列,则可以从C标准部分7.20.2中复制示例实现.请务必重命名rand,srand因此它们不会与标准库的版本发生冲突.您可能需要调整代码以使这个类型具有跨实现相同的大小和范围(例如,使用uint32_t来自<stdint.h>而非unsigned int).

编辑:鉴于评论中的新信息,看起来要求与我们的想法不同(我仍然没有100%明确它们是什么).

您希望在两个系统上生成与您在一个系统上生成的存储文件一致的随机数,但由于网络问题(文件大约为1 GB),您无法将其传输到另一个系统.(将其刻录成DVD,或将其分割并刻录成2张CD,不是一种选择吗?)

建议的解决方案:

编写一个自定义生成器,在两个系统上生成一致的结果(即使它们与之前得到的结果不同).完成后,使用它在两个系统上重新生成一个新的1 GB数据文件.现有文件变得不必要,您无需传输大量数据.