我的C ++代码严重依赖于采样(使用rand()),但我希望它是可重现的。所以在开始时,我用随机种子初始化srand()并打印出种子。我希望其他人能够再次运行相同的代码,但使用相同的种子初始化srand()并得到与我完全相同的答案。
但在什么情况下保证?我想只有在同一系统上使用相同的编译器编译二进制文件时才有效?可能使得答案与我最初的答案不同的其他因素是什么?
答案 0 :(得分:8)
解决方案是在所有情况下使用相同的代码 - Boost随机数库比任何C ++标准库实现都要好得多,并且您可以在所有平台上使用相同的代码。请查看this question作为其使用示例和图书馆文档的链接。
答案 1 :(得分:3)
如果在具有不同rand
实现的不同计算机上编译,则序列可能不同,这是正确的。解决这个问题的最佳方法是编写自己的PRNG。 srand
的Linux手册页给出了以下简单示例(引自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;
}
答案 2 :(得分:0)
要避免此类问题,请编写自己的rand()
实现!我不是随机数生成算法的专家,所以我只会说...
答案 3 :(得分:0)
查看implementation of rand(),并使用其中一个随机数生成器 - 无论您运行什么平台,都可确保重复性。