【发布时间】:2012-09-16 10:37:08
【问题描述】:
我编写了这个程序,该程序将一对骰子掷了 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");
}
掷出 7 有 6 种可能的方法,掷出 11 有两种可能的方法。
在第一轮中,共有 8 种可能的获胜方式。
掷骰子有 36 (6^2) 种可能的方式。这意味着您有 36 分之 8 的机会在第一次掷骰时获胜,或大约 22% 的时间获胜。
此外,我们有 2 种可能的方式来掷 2,2 种可能的方式来掷 3,以及 2 种可能的方式来掷 12。这意味着有六分之一的机会 (6/36) 输第一卷,或者大约 17% 的时间。
所以剩下的 61% 的胜负必须来自第二轮。无论如何,我的程序产生了非常高的连败,而我同事的程序似乎产生了 40-60% 的总胜率。我哪里错了?
【问题讨论】:
-
只有一种方法可以滚动 2。同样适用于 12。
-
糟糕。好的,所以输的概率大约是 11%。通过更多的研究,我发现这个百分比应该接近 49%。无论哪种方式,这都不能解释为什么我的程序没有给我这个百分比。哦,我希望有人可以帮助我......
-
除了代码中的逻辑错误,请注意 'rand() % 6' 不会完全一致,尽管这可能不足以解释您所看到的差异。