2016-05-23 144 views
26

我只是,想知道如果randhttp://www.cplusplus.com/reference/cstdlib/rand/)函数将生成随机数的相同的序列,而使用相同的种子不同libc实现,甚至不同的编译器和操作系统(赢,linux下运行)。对于相同的种子,由rand生成的随机数序列在C中保证总是相同的?

我没有使用各种编译器的一些测试(G ++ 4.8,G ++ 5.1和铛),它似乎,答案是肯定的,但是我没有发现使用任何“官方”的PRNG算法的提在C的随机数生成(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),还是这些都应该在标准中提到的...

+3

从你发布的链接(posix):'如果srand()然后被调用相同的种子值,则应该重复伪随机数的序列。 C11,§7.22.2.2具有相同的措词。 –

+0

@ P.P。是的,对于我来说,使用不同的编译器,序列在不同的计算机上是否也是相同的。 – fritzone

+1

我怀疑你已经比较了同一个生成器的三个实现,其中两个(g ++的)是相同的。 – molbdnilo

回答

35

中有什么会产生标准不能保证:

从标准:

那里对所产生的随机序列的质量没有保证,并且已知某些实施方式产生令人不安的非随机低位比特的序列。具有特定 要求的应用程序应该使用已知足以满足其需求的发生器。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

23

甚至没有RAND_MAX被指定为具有跨越比其他C实现的给定值必须> = 32767所以rand()在一个实现可以返回不同的范围比在另一个值,并因此不同的序列。

rand函数计算伪随机整数在 范围为0〜RAND_MAX的序列。 C11dr§7.22.2.12

RAND_MAX宏的值至少应为32767 C11dr§7.22.2.15

RAND_MAX它将扩展为一个整数常量表达式,它是由rand函数返回的最大值§7.223

即使是相同的RAND_MAX,注意@Servé Laurijssen回答:值从rand()顺序可能会有所不同。


注:暗示,暗示,RAND_MAX <= INT_MAX

相关问题