调用rand()返回非随机结果

Min*_*any 2 c

我正在编写一个简单的C程序,它将硬币投掷100000次并计算使用srand和rand投掷多少个头和多少尾巴.这是我有的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void){

    int i;
    int h=0;
    int t=0;
    int n;

    for(i=0;i<100000;i++){
        srand(time(NULL));
        n=rand()%2;
        if(n==0){
            h++;
        }
        else {   
            t++;
        }
    }

    printf("%d heads\n", h);
    printf("%d tails\n", t);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

然而,在运行程序时,我有时会获得100000个头和0个尾部,有时会有0个头和100000个尾部,有时我会在头部和尾部得到随机数,但不会有任何50%的头部50%尾部.

我错过了什么吗?谢谢!

Dav*_*nan 7

您每次在外观周围使用相同的种子为伪随机数生成器播种.只需将呼叫移至srand循环外部即可.

srand(time(NULL));
for(i=0;i<100000;i++){
    n=rand()%2;
    .....
Run Code Online (Sandbox Code Playgroud)

伪随机数发生器(PRNG)是确定性的.也就是说,给定相同的初始种子,每次调用时它将返回相同的数字序列.在您的代码中,由于每次调用时都会播种rand,因此对于循环的每次迭代,都会获得相同的1个数字序列.现在,程序的不同执行会产生不同的结果,因为time会有所改变.

而在当你没有看到100周%的头或100次%的尾数的情况下,这将是在循环了足够长的时间,拥有先进的.