我需要做一个抛硬币模拟器。这是我已经完成的代码但它给出的结果多于和少于2000.即使我增加了循环次数,它也接近数字但不准确。每次结果发生变化且没有特定模式。你有什么不对的帮助我?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int rand_coin();
int main (void) {
int heads = 0;
int tails = 0;
srand(time(NULL));
heads = rand_coin();
tails = rand_coin();
printf("Heads = %d, Tails = %d\n", heads, tails);
return 0;
} /* end main */
/* implement rand_coin() below: */
int rand_coin() {
int value;
int i; //
int tails = 0;
int heads = 0;
for(i=0; i < 2000; i++) {
value = rand() % 2;
if (value == 1) {
heads++;
}
else {
tails++;
}
}
return heads;
}
答案 0 :(得分:6)
您的rand_coin()
功能会翻转2000个硬币并返回显示的头数。您的main
函数会独立调用两次。没有理由认为结果将是2000年。
你只需要调用一次rand_coin()
函数来获取头数,然后从2000减去得到尾数。
heads = rand_coin();
tails = 2000 - heads;
printf("Heads = %d, Tails = %d\n", heads, tails);
答案 1 :(得分:5)
tails = rand_coin();
从算法的角度来看,是错误的。你只需要使用:
tails = 2000 - heads;
我建议进行以下改进:
rand_coin
,以便数字2000不会在多个位置进行硬编码。tails
。这是您发布的代码的更新版本。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int rand_coin(int num_tosses);
int main (void) {
int heads = 0;
int tails = 0;
srand(time(NULL));
int num_tosses = 2000;
heads = rand_coin(num_tosses);
tails = num_tosses - heads;
printf("Heads = %d, Tails = %d\n", heads, tails);
return 0;
} /* end main */
/* implement rand_coin() below: */
int rand_coin(int num_tosses) {
int value;
int i; //
int heads = 0;
for(i=0; i < num_tosses; i++){
value = rand() % 2;
if (value == 1) {
heads++;
}
}
return heads;
}
答案 2 :(得分:1)
参考您在评论中提供的示例:
如果你将硬币翻转10次,你会得到10个结果,无论是头还是尾。例如,我得到964头951尾巴。小于2000.如果你掷硬币x次,你可以获得x结果。
如果您参考该示例阅读了您的代码,则会发生以下情况:
你翻了2000次硬币,获得了964个头和1036个尾巴,共计2000个;但是你只能通过从功能中返回来使964头可见 然后你再次掷硬币2000次,获得951个头,而不是尾巴和1049个尾巴,共计2000个结果。
计算总数为1915个头和2085个尾巴,共计4000个,相当于2 * 2000个。这两个调用中的每一个都生成了2000个结果,并且只将其中的一部分正确地报告为头部。