我读到rand()
在没有种子时会生成相同的数字。因此,我添加了srand()
,并用单位间距整数填充了它。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
for(i = 0 ; i < 10 ; i++)
{
srand(i);
printf("%d ",rand());
}
return 0;
}
但是结果是可以预见的。
38 41 45 48 51 54 58 61 64 68
结果相差3或4。我对间隔-9 to 0
进行了相同的尝试。结果再次可以预测。.
9 12 15 19 22 25 28 32 35 38
为什么rand()
会生成这样的数字??
为什么srand(0)
总是导致38
,而srand(1)
总是导致41
,依此类推?。
答案 0 :(得分:2)
在计算机系统中没有真正的随机性,rand()
函数将基于一些数学公式创建一个伪随机数,这些数学公式使用种子初始值,然后使用每个后续{{ 1}}通话。
您只需播种一次(在整个程序中只需调用rand()
一次即可。)
话虽这么说,srand()
将基于给定的种子生成相同的结果序列。如果每次给它相同的种子,它将每次都产生相同的序列。
为使其正常运行,每次运行该程序时都需要使用其他种子。使用rand()
作为种子是一种普遍的选择。
答案 1 :(得分:1)
rand
因在某些C实现中没有很好地实现而臭名昭著。可以想象,生成器对种子所做的工作很少,无法产生下一个值rand()
。
您应该查看每个序列的第二个数字,看看它们是否具有相似的模式。如果是这样,则该实现可能正在使用linear congruential generator。
您可能想避免使用内置的srand
和rand
,而寻找诸如Unix'srandom
和random
之类的替代方法。