如何消除所有随机源,以便程序始终给出相同的答案?

时间:2010-08-08 18:51:28

标签: c++ random srand

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

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

4 个答案:

答案 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(),并使用其中一个随机数生成器 - 无论您运行什么平台,都可确保重复性。