为什么rand()会产生相差3或4的整数?

时间:2018-10-05 02:38:59

标签: c random c99

我读到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,依此类推?。

2 个答案:

答案 0 :(得分:2)

在计算机系统中没有真正的随机性,rand()函数将基于一些数学公式创建一个伪随机数,这些数学公式使用种子初始值,然后使用每个后续{{ 1}}通话。

您只需播种一次(在整个程序中只需调用rand()一次即可。)

话虽这么说,srand()将基于给定的种子生成相同的结果序列。如果每次给它相同的种子,它将每次都产生相同的序列。

为使其正常运行,每次运行该程序时都需要使用其他种子。使用rand()作为种子是一种普遍的选择。

答案 1 :(得分:1)

rand因在某些C实现中没有很好地实现而臭名昭著。可以想象,生成器对种子所做的工作很少,无法产生下一个值rand()

您应该查看每个序列的第二个数字,看看它们是否具有相似的模式。如果是这样,则该实现可能正在使用linear congruential generator

您可能想避免使用内置的srandrand,而寻找诸如Unix'srandomrandom之类的替代方法。