1

私はサイコロを 20000 回振るこのプログラムを書きました。ルールは次のとおりです。

  • 7 または 11 が出た場合、プレーヤーの勝ちです。
  • 2、3、または 12 が出た場合、プレーヤーは負けます。
  • 上記のいずれもロールされない場合、合計が保存され、サイコロが再度ロールされます。

セカンドロールのルール:

  • 7が出ればプレイヤーの勝ち
  • 前と同じ合計がロールされた場合、プレーヤーは負けます
  • そうでない場合、プレーヤーは、これら 2 つの条件のいずれかが満たされるまで、再びロールします。

最後に、勝ったゲームのパーセンテージを計算します。私の問題は、同僚によると、ゲームの勝率が約 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");
}

7 を出す方法は 6 通りあり、11 を出す方法は 2 通りあります
。最初のロールで勝つ方法は全部で 8 通りあります。
サイコロを振る方法は 36 (6^2) 通りあります。これは、最初のロールで勝つチャンスが 36 分の 8、つまり約 22% の確率であることを意味します。

さらに、2 の場合は 2 通り、3 の場合は 2 通り、12 の場合は 2 通りあります。つまり、最初に負ける確率は 6/36 です。ロール、または時間の約 17% です。

したがって、勝敗の残りの 61% は 2 番目のロールから発生する必要があります。いずれにせよ、私のプログラムは連敗率が非常に高いのに対し、同僚のプログラムは総勝利数の 40 ~ 60% を生み出しているようです。どこが間違っていますか?

4

1 に答える 1

1

これが問題の原因である可能性があります:

else if (value = keyValue) {

比較するのではなく、割り当てています。これは常に true と評価されるため、人為的に損失が膨らみます。==の代わりにここを使用する必要があり=ます。

また、勝ちでも負けでもないロールの場合、それらのいずれかのwinsまたはlossカウンターをインクリメントしていませんが、 に追加していますcount。したがって、次のような状況になりwins + loss != countます。勝率を計算するときは、 として計算してみてくださいwins / (loss + wins)

于 2012-09-24T23:11:56.017 に答える