3

我不太确定如何表达这个问题,但我找不到任何其他人喜欢它。

说我有这个代码:

srand(1);
srand(SOME_DEFINED_CONST_INT);

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

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

如果没有,我能做些什么来做到这一点?

4

4 回答 4

3

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

于 2011-03-09T10:41:44.467 回答
3

正如阿门所说,这是非标准的。但是,如果您查看srand()Linux 的手册页,您会发现一些有趣的东西:

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;
       }
于 2011-03-09T10:54:41.683 回答
1

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

于 2011-03-09T11:01:03.893 回答
1

我要补充一点,如果您在 Windows 下工作,如果您使用 exe 并在机器之间移动,srand 将生成相同的数字,因为 srand 的实现是特定于实现者的,但您将始终使用相同的实现者(因此,如果您使用 Microsoft C++,您将使用 Microsoft 的 srand,而 MS 今天或明天可能不会更改其 srand 的实现)。Linux 也是如此。您的 srand 将永远是 glibc 之一。除非他们在 glibc 中更改它,否则数字将是相同的。

于 2011-03-09T11:01:44.063 回答