Проблемы с программой роликового штампа

Я написал эту программу, которая бросает пару кубиков 20000 раз. Правила следующие:

  • Если выпадает 7 или 11, то игрок выигрывает.
  • Если выпадает 2, 3 или 12, игрок проигрывает.
  • Если ничего из вышеперечисленного не выпадает, сумма сохраняется, и кубик бросается снова.

Правила второго броска:

  • Если выпала 7, то игрок выигрывает.
  • Если выпадает та же сумма, что и раньше, то игрок проигрывает.
  • Если нет, игрок снова бросает кубик, пока не будет выполнено одно из этих двух условий.

В конце он подсчитывает процент выигранных игр. Моя проблема в том, что, по словам моих коллег, процент выигранных игр должен составлять около 39% -60%, но каждый раз, когда я запускаю программу, я получаю около 20%, и я не понимаю, почему. Я делаю что-то неправильно? Может кто-то помочь мне, пожалуйста?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{   
int dieOne, dieTwo, keyValue, value, wins = 0, firstWins = 0, subWins = 0, loss = 0, count=0;
double percentWin, percentFirstWins, percentSubWins;
srand(time(NULL));

do{
dieOne = rand() % 6 + 1;
dieTwo = rand() % 6 + 1;
value = dieOne + dieTwo;
count++;


if (value==7||value==11) {
    firstWins++;
    wins++;
}

else if (value== 2||value==3||value==12) {
    loss++;
}

else {
    do{ 
    keyValue = value;

    dieOne = rand() % 6 + 1;
    dieTwo = rand() % 6 + 1;
    value = dieOne + dieTwo;
    count++;

    if (value==7) {
    subWins++;
    wins++;
    }

    else if (value = keyValue) { 
        loss++;
    }

    } while ( value != 7 && value != keyValue );
}
} while (count <= 20000);

    percentWin = (double) wins/count * 100;
    percentFirstWins = (double) firstWins/count * 100;
    percentSubWins = (double) subWins/count * 100;
    printf("You won %.1lf percent of your games! \nYou won %.1lf percent of games on the first roll.\nYou won %.1lf percent of games on the second roll.\n", percentWin, percentFirstWins, percentSubWins );

    system("pause");
}

Есть 6 возможных способов выбросить 7 и два возможных способа выбросить 11.
Всего 8 возможных способов выиграть при первом броске.
Существует 36 (6 ^ 2) возможных способов выпадения. кости. Это означает, что у вас есть 8 из 36 шансов на победу при первом броске или примерно в 22% случаев.

Более того, у нас есть 2 возможных способа выпадения 2, 2 возможных способа выпадения 3 и 2 возможных способа выпадения 12. Таким образом, это означает, что есть шанс 1 из 6 (6/36) проиграть в первом случае. ролл, или примерно в 17% случаев.

Таким образом, оставшийся 61% выигрышей и проигрышей приходится на второй бросок. Как бы то ни было, моя программа приносит очень много неудач, в то время как программы моих коллег приносят 40-60 процентов от общего числа побед. Где я ошибаюсь?


person user1695758    schedule 24.09.2012    source источник
comment
Есть только один способ выбросить 2. То же самое и с 12.   -  person Cody    schedule 25.09.2012
comment
Ой. Итак, вероятность проигрыша составляет около 11%. Проведя немного дополнительных исследований, я обнаружил, что процентное соотношение должно быть ближе к 49%. В любом случае это не объясняет, почему моя программа не дает мне такой процент. Оооо, надеюсь, кто-нибудь может мне помочь ...   -  person user1695758    schedule 25.09.2012
comment
Помимо логических ошибок в коде, обратите внимание, что rand ()% 6 не будет идеально однородным, хотя это, вероятно, недостаточно большой фактор, чтобы объяснить наблюдаемое вами несоответствие.   -  person twalberg    schedule 26.09.2012


Ответы (1)


Это может быть причиной вашей проблемы:

else if (value = keyValue) {

Вы назначаете, а не сравниваете. Это всегда будет соответствовать истине, что приведет к искусственному завышению ваших убытков. Здесь вы должны использовать == вместо =.

Кроме того, для бросков, которые не являются ни выигрышем, ни проигрышем, вы не увеличиваете счетчик wins или loss для любого из них, но вы добавляете к count. Таким образом, вы столкнетесь с ситуацией, когда wins + loss != count. Когда вы рассчитываете процент выигрыша, попробуйте рассчитать его как wins / (loss + wins).

person Cody    schedule 24.09.2012
comment
Спасибо. Исправлено это сейчас, но по-прежнему дает тот же результат. - person user1695758; 25.09.2012
comment
У вас также есть ошибка в том, как вы отслеживаете подсчет выигрышей и проигрышей. Смотрите мое дополнение к моему ответу выше. - person Cody; 25.09.2012
comment
Спасибо! Именно в этом и была проблема! Я просто избавился от операторов count ++ и просто преобразовал все это в цикл for, чтобы вместо этого подсчитать, сколько раз он запускался. Ооочень большое спасибо! - person user1695758; 25.09.2012