我正在编写一个简单的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%尾部.
我错过了什么吗?谢谢!
您每次在外观周围使用相同的种子为伪随机数生成器播种.只需将呼叫移至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次%的尾数的情况下,这将是在循环了足够长的时间,拥有先进的.