代码之家  ›  专栏  ›  技术社区  ›  Frank

如何消除随机性的所有来源,使程序总是给出相同的答案?

  •  2
  • Frank  · 技术社区  · 14 年前

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

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

    4 回复  |  直到 14 年前
        1
  •  8
  •   Community SushiHangover    7 年前

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

        2
  •  3
  •   Tyler McHenry    14 年前

    如果在不同的机器上用不同的 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;
     }
    
        3
  •  0
  •   Oliver Charlesworth    14 年前

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

        4
  •  0
  •   Community SushiHangover    7 年前

    退房 implementation of rand() 并使用其中的一个随机数生成器——这可以确保重复性,无论您在哪个平台上运行。