Программа подбрасывания монет в C / Else vs Else, если получены значения от rand () - PullRequest
0 голосов
/ 12 января 2019

Я написал эту простую программу для симуляции бросания монет. Кажется, что он работает нормально, но когда «else» заменяется на «else if», программа не дает ожидаемых результатов.

«Остальное» охватывает все возможные сценарии, когда не выполняются первые условия «ЕСЛИ» и программа выполняется нормально. Когда я пытаюсь использовать «else if (flip ())» вместо «else», отображаются не все результаты. Я хотел бы ожидать снизу, что всякий раз, когда функция - «flip ()» не возвращает 0, она возвращает 1, поэтому условие «else if (flip ())» становится истинным, и количество «голов» увеличивается. Но что на самом деле происходит - количество «голов» уменьшается как минимум в два раза (по сравнению с использованием «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 голосов
/ 13 января 2019

По сути, ветвь if ( flip() == 0) оператора if и ветвь else if ( flip() ) будут выполнять flip() отдельно. Это означает, что те крайние случаи, когда программа действует неожиданно, вызваны тем, что две ветви возвращают разные числа.

Однако, если вы настаиваете на добавлении другой ветви или для любого другого, кто может столкнуться с этим ответом с той же проблемой, самое простое решение, о котором я могу подумать, будет:

Сохранить возвращаемое значение в переменной

Простого определения переменной в начале цикла for для хранения результата этой итерации flip() и проверки этого будет достаточно для того, что вы пытаетесь выполнить.

В частности, я бы объявил переменную перед началом цикла (int result;) и переопределил ее в начале каждой итерации цикла, чтобы каждый раз вызывать функцию. (result = flip(); до рассматриваемого оператора if)

Другое решение было бы:

Использовать оператор смены

Операторы 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;
}

Хотя это может показаться слишком сложным, если вы решите отказаться от переменного маршрута, я думаю, что операторы переключателя утилиты могут добавить в ваши программы, что того стоит. (особенно если их много)

TLDR: flip() вызывается дважды, см. Под заголовками решения и выше для объяснения.

0 голосов
/ 12 января 2019
else if ( flip () )

звонит flip() во второй раз. Таким образом, ваши хвосты будут увеличиваться с вероятностью 50%, а ваши головы - только с вероятностью 25%.

Вы можете подражать ей с настоящей монетой: она поднимает головы, не подсчитывает это, подбрасывает снова, и подсчитывает только головы, если это головы снова .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...