如果从rand()接收到值,则用C / Else vs Else进行投币程序

时间:2019-01-12 16:05:04

标签: c

我编写了这个简单的程序来模拟抛硬币。看来工作正常,但是当“ else”替换为“ else if”程序时,没有产生预期的结果。

“ Else”涵盖了不满足第一个“ IF”条件并且程序可以正常执行的所有可能情况。 当我尝试使用“ else if(flip())”代替“ else”时,不是所有结果都被显示。从下面我希望,每当函数-“ flip()”不返回0时,它都将返回1,因此“ else if(flip())”条件变为true,并且“ heads”计数增加。但是实际发生的情况-“头”计数至少减少了两倍(与使用“ else”相比),即“ else if(flip())”未捕获所有返回值,而flip()返回0以外的任何值。 我知道,这里并不需要真正使用“ 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;
}

2 个答案:

答案 0 :(得分:1)

基本上,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;
}

尽管如果您决定放弃可变路由,可能看起来过于复杂,但我认为实用程序switch语句可以添加到您的程序中非常值得。 (尤其是分支机构很多的情况下)

TLDR: flip()被调用了两次,有关解决方案,请参见标题下方和上方的说明。

答案 1 :(得分:0)

else if ( flip () )

第二次拨打flip()。因此,您的尾巴将以50%的几率增加,但您的头将只有25%的几率。

您可以用一个真实的硬币来模拟它:正面朝上,不要相符,再次折腾,并且如果正面再次 ,则仅相正面。