如何消除随机性的所有来源,使程序总是给出相同的答案? 我有C++代码,它依赖于采样(使用RAND()),但我希望它是可重复的。因此,在开始时,我使用一个随机种子初始化srand(),并打印出该种子。我希望其他人能够再次运行相同的代码,但使用相同的种子初始化srand(),并得到与我完全相同的答案

如何消除随机性的所有来源,使程序总是给出相同的答案? 我有C++代码,它依赖于采样(使用RAND()),但我希望它是可重复的。因此,在开始时,我使用一个随机种子初始化srand(),并打印出该种子。我希望其他人能够再次运行相同的代码,但使用相同的种子初始化srand(),并得到与我完全相同的答案,c++,random,srand,C++,Random,Srand,但在什么情况下才能保证?我想只有在同一个系统上使用同一个编译器编译二进制文件时,这种方法才有效?还有哪些因素可能使答案与我最初得到的答案不同?如果在不同的机器上使用不同的rand实现编译,则序列可能不同,这是正确的。解决这个问题的最好方法是编写自己的PRNG。srand的Linux手册页给出了以下简单示例(引用自POSIX标准): POSIX.1-2001给出了以下内容 rand()的实现示例 和srand(),当 需要两个相同的序列 不同的机器 要避免此类问题,请编写自己的rand()实现!我

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

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

POSIX.1-2001给出了以下内容 rand()的实现示例 和srand(),当 需要两个相同的序列 不同的机器


要避免此类问题,请编写自己的
rand()
实现!我不是随机数生成算法的专家,所以我将不只是说……/P>< P>解决方案是在所有情况下使用相同的代码——Boost随机数库比任何C++标准库实现都要好得多,并且可以在所有平台上使用相同的代码。看一看它的使用和链接到库文档。

< P>检查,并使用其中一个随机数生成器,这确保了可重复性,不管你运行的平台。

编写你自己的RNG是你应该考虑的最后一个可能的选择。可能没有其他功能如此容易出错,测试正确性如此困难。@strager:纯粹性并不重要。这是关于随机数生成器的实现。请注意,如果您的代码是多线程的,那么对随机数生成器进行种子设定不会消除所有的不确定性。其他问题可能是系统内存不足、浮点算术差异、任何涉及获取当前时间或主机名的问题…@Neil Butterworth:如果程序是多线程的,线程交错的顺序(不确定)可能会影响其输出。进程间通信、网络消息传递、共享内存访问也是如此。。。由于调度程序的易变性,两次运行同一个程序可能会产生两种不同的结果,因此一旦使程序并行,程序就不再具有确定性了。@Neil Butterworth:Thread A:
x=1;y=x+1;打印y。螺纹B:
y=1;x=y+1;打印x。这个程序可以产生许多不同的结果,但只由两个确定性线程组成。尼尔:我认为他对多线程程序的关注是很重要的,更重要的是他对不同系统中浮点运算差异的暗示。我特别感兴趣的是这些“其他因素”,它们可以使不同运行的输出不同。我明白了。所以,如果我告诉其他人包括我使用的Boost 1.42随机数生成器,并使用我使用的相同种子进行初始化,那么他们将得到完全相同的结果?即使在其他平台上使用其他编译器?我要补充的是,只有每次都以相同的方式获取数字时,它才是正确的。就像评论中提到的另一个:例如,如果你对多个线程使用相同的数字生成器,结果可能不可复制。是的,只需再次解决数千之前所做的事情。这才是真正的C程序员的方法P
 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;
 }