【发布时间】:2016-09-20 06:40:17
【问题描述】:
我只是想知道rand (http://www.cplusplus.com/reference/cstdlib/rand/) 函数在不同上运行时是否会生成相同的随机数序列,同时使用相同的种子 > libc 实现,甚至不同的编译器和操作系统(win、linux)。
我使用各种编译器(g++4.8、g++5.1 和 clang)做了一些测试,似乎答案是肯定的,但是我没有找到任何“官方”提及C的随机数生成中使用的PRNG算法(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),或者这些是否应该在标准中提及......
【问题讨论】:
-
来自您发布的链接 (posix):
If srand() is then called with the same seed value, the sequence of pseudo-random numbers shall be repeated.。 C11, §7.22.2.2 有相同的措辞。 -
我怀疑你已经比较了同一个生成器的三个实现,其中两个(g++ 的)是相同的。
-
@Lundin 这两个讨论了如何跨平台获得一致的结果,但没有直接讨论
rand是否有标准实现。 -
@pjs 这不是一回事吗?后者导致前者。
-
@P.P.这只是说单个 libc 实现必须在对
seed的调用之间保持一致,而不是不同的实现必须都产生相同的序列。此外,如果这是这个意思,那么标准还必须提供精确的算法来生成“标准序列”,以便人们可以编写符合要求的实现,否则请求是不合理的。