C/Else与Else中的抛硬币程序(如果收到rand()的值)

C/Else与Else中的抛硬币程序(如果收到rand()的值),c,C,我写了这个简单的程序来模拟投币。然而,当“else”替换为“else-if”程序并没有产生预期的结果时,它似乎工作得很好 “Else”涵盖了当第一个“IF”条件未满足且程序执行良好时的所有可能情况。 当我尝试使用“else if(flip())”而不是“else”时,并不是所有结果都显示出来。我从下面可以看到,每当函数“flip()”不返回0时,它都返回1,因此“else if(flip())”条件变为true,“heads”计数增加。但实际情况是,“heads”计数至少减少了两倍(与使用“el

我写了这个简单的程序来模拟投币。然而,当“else”替换为“else-if”程序并没有产生预期的结果时,它似乎工作得很好

“Else”涵盖了当第一个“IF”条件未满足且程序执行良好时的所有可能情况。 当我尝试使用“else if(flip())”而不是“else”时,并不是所有结果都显示出来。我从下面可以看到,每当函数“flip()”不返回0时,它都返回1,因此“else if(flip())”条件变为true,“heads”计数增加。但实际情况是,“heads”计数至少减少了两倍(与使用“else”相比),即当flip()返回除0以外的任何值时,“else if(flip())”未捕获所有返回值。 我理解,这里确实不需要使用“else-if”,但如果有人能解释一下,为什么在这种情况下“else-if”不能产生相同的结果,我将不胜感激。我错过了什么? 非常感谢

int flip ( void);

int main()
{
    srand(time(NULL));
    int tails = 0, heads = 0;
    for ( int i = 1; i <= 100; i++){   // 100 tosses 

    if ( flip() == 0){
        tails++;  // increase tails count
        printf("Tails  ");
        }
    else{         // else if ( flip () ) - replacement for "else"
        heads++;  // increase heads count
        printf("Heads  ");
        }

    if ( i % 10 == 0){
        printf("\n"); 
        }
    }
    printf("\n\nTotal count is:\n%d for Heads\n%d for Tails\n", heads, tails);

    return 0;
}

int flip ( void )
{
    return  rand()%2;
}
int翻转(void);
int main()
{
srand(时间(空));
int尾=0,头=0;
对于(int i=1;i
第二次调用
flip()
。因此,你的尾巴有50%的几率增加,而你的头只有25%的几率增加

你可以用一枚真正的硬币来模拟它:它正面朝上,不理清它,再掷一次,并且只有当它正面朝上时才理清它。本质上,if语句的
if(flip()==0)
分支和
else if(flip())
分支都将执行
flip()
分别。这意味着程序意外动作的边缘情况是由两个分支返回不同的数字引起的

但是,如果您坚持要添加另一个分支,或者对于可能遇到此问题的其他人,我能想到的最简单的解决方案是:

将返回值存储到变量中 只需在for循环的开头定义一个变量来保存迭代的
flip()
结果,并根据该结果进行测试,就足以完成您想要完成的任务

具体来说,我会在循环开始之前声明变量(
int result;
),并在每次循环迭代开始时重新定义它,以便每次都重新调用函数。(
result=flip();
,在有问题的if语句之前)

另一个解决办法是:

使用Switch语句 Switch语句类似于修改后的if/else语句,只是它们在一件事情上测试了许多不同的情况,例如

switch ( flip() ) // test against the result of flip()
{
        // if it happens to be zero
        case 0:
                tails++;
                printf("Tails ");
                break;
                // the break statement tells the program to stop this case
        // if it happens to be one
        case 1:
                heads++;
                printf("Heads ");
                break;
}
虽然如果您决定放弃变量路由可能会显得过于复杂,但我认为实用程序开关语句可以添加到您的程序中,使其非常值得。(特别是如果有许多if分支)


TLDR:the
flip()
被调用了两次,请参见标题下的解决方案和上面的解释。

如果您再次调用,值可能会不同。因为当
else
案例再次抛硬币时,您现在有50/50的机会。这不是相同的抛硬币,而是新的抛硬币。因此
heads
计数大约为一半它应该是什么。
switch ( flip() ) // test against the result of flip()
{
        // if it happens to be zero
        case 0:
                tails++;
                printf("Tails ");
                break;
                // the break statement tells the program to stop this case
        // if it happens to be one
        case 1:
                heads++;
                printf("Heads ");
                break;
}