物理机器之间的种子一致性

时间:2011-03-09 10:37:35

标签: c++ windows random srand

我不太确定如何说出这个问题,但我找不到其他类似的问题。

说我有这段代码:

srand(1);
srand(SOME_DEFINED_CONST_INT);

如果我在许多不同的物理机器上运行此可执行文件,rand()的序列是否保证在它们之间保持一致?即如果我在一台机器上获得1, 4, 6, 3, 4,我是否总能在其他机器上获得相同的序列?

如果,如何证明这一点?它是标准的一部分吗?

如果没有,我有什么办法可以做到这一点吗?

4 个答案:

答案 0 :(得分:3)

不,标准保证没有这样的事情。但是,生成随机数的逻辑在C标准库中。因此,如果使用相同版本的库构建应用程序,则序列应该相同。我的答案的第二部分只是一个猜测,但标准肯定不给予任何保证。

答案 1 :(得分:3)

正如亚美尼亚所说,这是非标准的。但是,如果您查看Linux上srand()的手册页,您会看到一些有趣的内容:

  

POSIX 1003.1-2003给出了以下的实现示例   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 :(得分:1)

正如Mat所说,自己实现随机数生成器总是一个好主意。优选地,以面向对象的方式。作为一个很好的副作用,你可以获得线程安全性,并可能加速跨平台的一致性。线性同余生成器http://en.wikipedia.org/wiki/Linear_congruential_generator或mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister会让你走得更远。

答案 3 :(得分:1)

我要补充一点,如果你在Windows下工作,如果你拿着你的exe并在机器之间移动,srand将生成相同的数字,因为srand的实现是特定于实现者的,但你总是会使用同一个实现者的运行时(所以如果你使用的是Microsoft C ++,你将使用Microsoft的srand,而MS今天或明天可能不会改变它的srand实现)。 Linux也一样。你的srand将永远是glibc之一。除非他们用glibc改变它,否则数字将是相同的。