我不太确定如何说出这个问题,但我找不到其他类似的问题。
说我有这段代码:
srand(1);
srand(SOME_DEFINED_CONST_INT);
如果我在许多不同的物理机器上运行此可执行文件,rand()
的序列是否保证在它们之间保持一致?即如果我在一台机器上获得1, 4, 6, 3, 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改变它,否则数字将是相同的。