2

我的 C++ 代码严重依赖采样(使用 rand()),但我希望它是可重现的。所以一开始,我用一个随机种子初始化 srand() 并将该种子打印出来。我希望其他人能够再次运行相同的代码,但使用相同的种子初始化 srand() 并得到与我完全相同的答案。

但是在什么情况下可以保证呢?我想只有在同一系统上使用相同的编译器编译二进制文件时才有效?还有哪些其他因素可能使答案与我最初得到的不同?

4

4 回答 4

8

解决方案是在所有情况下都使用相同的代码——Boost 随机数库比任何 C++ 标准库实现都要好得多,并且您可以在所有平台上使用相同的代码。看看这个问题,例如它的使用和图书馆文档的链接。

于 2010-08-08T18:55:33.767 回答
3

如果在具有不同rand实现的不同机器上编译,序列可能会有所不同,这是正确的。解决这个问题的最好方法是编写自己的 PRNG。Linux 手册页srand提供了以下简单示例(引用自 POSIX 标准):

POSIX.1-2001 给出了 rand() 和 srand() 实现的以下示例,当需要在两台不同的机器上使用相同的序列时可能很有用。

 static unsigned long next = 1;

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

 void mysrand(unsigned seed) {
     next = seed;
 }
于 2010-08-08T18:54:42.167 回答
0

为避免此类问题,请编写自己的rand()! 我不是随机数生成算法方面的专家,所以我只会说...

于 2010-08-08T18:54:48.880 回答
0

检查rand() 的实现,并从那里使用其中一个随机数生成器 - 无论您在什么平台上运行,它都能确保可重复性。

于 2010-08-08T18:57:08.857 回答