我只是想知道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),或者是否应在标准中提及这些算法......
答案 0 :(得分:35)
标准中不保证会产生什么:
来自标准:
无法保证随机序列的质量 已知并且已知一些实现产生序列 令人沮丧的非随机低阶位。具体应用 要求应使用已知足以满足的发电机 他们的需求。
答案 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,答案是否定的。不同的实施方式无法保证。