简单的2000抛硬币模拟器显示超过2000个结果

时间:2018-04-09 20:10:06

标签: c

我需要做一个抛硬币模拟器。这是我已经完成的代码但它给出的结果多于和少于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;   
}

3 个答案:

答案 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;

我建议进行以下改进:

  1. 将投掷次数传递给rand_coin,以便数字2000不会在多个位置进行硬编码。
  2. 无需跟踪功能中的tails
  3. 这是您发布的代码的更新版本。

    #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个结果,并且只将其中的一部分正确地报告为头部。