[英]C++ rand and srand gets different output on different machines
我想生成一个随机整数,所以我使用了C ++ rand(void)和srand(int)函数:
int main(){
srand(1);
cout << rand() << endl;
return 0;
}
好的,它符合我的需要。 每次执行它我得到相同的结果,我喜欢它!
但有一个问题。 当我在计算机上执行它时,我输出了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;
}
所以为什么? 是否有可能rand()在多台机器上有不同的实现? 我该怎么办?
我想以这样的方式修改另一台机器,我也从那台机器上获得16807。
请注意,我喜欢计算机上的rand实现。 请告诉我其他机器与我的相同结果。
提前致谢。
是的, rand()
有不同的实现; 没有要求他们是完全相同的。
如果您希望跨实现和平台执行一致的序列,则可以从C标准部分7.20.2中复制示例实现。 务必重命名rand
和srand
以免它们与标准库的版本发生冲突。 您可能需要调整代码,以使类型在实现中具有相同的大小和范围(例如,使用来自<stdint.h>
uint32_t
而不是unsigned int
)。
编辑 :鉴于评论中的新信息,看起来要求与我们的想法不同(我仍然没有100%明确它们是什么)。
您希望在两个系统上生成与您在一个系统上生成的存储文件一致的随机数,但由于网络问题(文件大约为1 GB),您无法将其传输到另一个系统。 (将它刻录成DVD,或将其分割并刻录成2张CD,不是一种选择吗?)
建议的解决方案:
编写一个自定义生成器,在两个系统上生成一致的结果(即使它们与之前得到的结果不同)。 完成后,使用它在两个系统上重新生成一个新的1 GB数据文件。 现有文件变得不必要,您无需传输大量数据。
C和C ++规范没有为rand
或srand
定义特定的实现。 它们可以是任何东西,只要它有点随机。 您不能期望来自不同标准库的一致输出。
rand
实现可以是不同的。 如果您在不同的计算机上需要相同的行为,则需要一个提供该行为的随机数生成器。 你可以自己动手或者使用别人的。
我不确定C ++ 0x库中的随机生成器是否足够。 我想不是。 但阅读那里的标准让我头晕目眩。
同样,我不确定Boost Random库是否足够。 但我认为值得一试。 而且你有源代码,所以最糟糕的是它可以作为你自己的基础。
干杯&hth。,
我认为这是因为你的两个平台上的int / unsigned int是不同的大小。 在您编译的两台机器/操作系统上,ints / unsigned ints的字节数是否相同? 你使用什么平台/编译器?
假设rand / srand实现相同,则需要使用相同精度(或适当的转换)的数据类型来获得相同的结果。 如果您的平台上有stdint.h,请尝试使用它(这样您就可以定义显式大小,例如uint32_t)。
此外,还有不同的伪RNG算法(例如LCG与Mersenne Twister)
http://en.wikipedia.org/wiki/Random_number_generation
第一台机器上的C编译器可能使用一台,第二台机器可能使用另一台机器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.