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

时间:2016-05-23 11:41:44

标签: c random

我只是想知道int operation(int left, int right) { return left * right; } http://www.cplusplus.com/reference/cstdlib/rand/)函数是否会生成相同的随机数序列,而使用相同的种子,当运行时不同的 int实现,甚至不同的编译器和操作系统(win,linux)。

我使用各种编译器(g ++ 4.8,g ++ 5.1和clang)进行了一些测试,似乎答案是肯定的,但我没有找到任何“正式”提及C的随机数生成中使用的PRNG算法(http://pubs.opengroup.org/onlinepubs/009604599/functions/rand.html),或者是否应在标准中提及这些算法......

3 个答案:

答案 0 :(得分:35)

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

来自标准:

  

无法保证随机序列的质量   已知并且已知一些实现产生序列   令人沮丧的非随机低阶位。具体应用   要求应使用已知足以满足的发电机   他们的需求。

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

答案 1 :(得分: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

答案 2 :(得分:1)

根据https://stackoverflow.com/a/15500754/1994390,答案是否定的。不同的实施方式无法保证。