私はサイコロを 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% を生み出しているようです。どこが間違っていますか?