我不太确定如何表达这个问题,但我找不到任何其他人喜欢它。
说我有这个代码:
srand(1);
srand(SOME_DEFINED_CONST_INT);
如果我在许多不同的物理机器上运行这个可执行文件,rand()
它们之间的顺序是否保证是一致的?即,如果我1, 4, 6, 3, 4
在一台机器上,我总是会在其他机器上得到相同的序列吗?
如果是,如何证明?它是标准的一部分吗?
如果没有,我能做些什么来做到这一点?
不,标准保证没有这样的事情。但是,生成随机数的逻辑在 C 标准库中。因此,如果您使用相同版本的库构建应用程序,则顺序应该相同。我的回答的第二部分只是一个猜测,但标准绝对没有给出任何保证。
正如阿门所说,这是非标准的。但是,如果您查看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;
}
正如 Mat 所说,自己实现随机数生成器总是一个好主意。最好以面向对象的方式。作为一个很好的副作用,除了跨平台的一致性之外,您还可以获得线程安全和可能的速度。线性同余生成器http://en.wikipedia.org/wiki/Linear_congruential_generator或 mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister会让你走得更远。
我要补充一点,如果您在 Windows 下工作,如果您使用 exe 并在机器之间移动,srand 将生成相同的数字,因为 srand 的实现是特定于实现者的,但您将始终使用相同的实现者(因此,如果您使用 Microsoft C++,您将使用 Microsoft 的 srand,而 MS 今天或明天可能不会更改其 srand 的实现)。Linux 也是如此。您的 srand 将永远是 glibc 之一。除非他们在 glibc 中更改它,否则数字将是相同的。