由Rnd生成的随机数序列在C中是否保证始终相同,对于同一种子?

Fer*_*eak 26 c random

我只是想知道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),还是这些都应该在标准中提到的...

Ser*_*sen 35

标准中不保证将生成什么:

从标准:

不能保证产生的随机序列的质量,并且已知一些实现产生具有令人沮丧的非随机低阶位的序列.具有特殊要求的应用应使用已知足以满足其需求的发电机.

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


chu*_*ica 22

甚至RAND_MAX没有指定在C实现中具有给定值,除了它必须> = 32767.因此rand()在一个实现上可以返回不同于另一个实现的值范围,从而返回不同的序列.

rand函数计算0到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.