【问题标题】:Trouble with Die Roll Program掷骰子程序有问题
【发布时间】: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' 不会完全一致,尽管这可能不足以解释您所看到的差异。

标签: c loops dice


【解决方案1】:

这可能是导致您的问题的原因:

else if (value = keyValue) {

你是在分配,而不是比较。这将始终评估为真,从而人为地夸大您的损失。你应该在这里使用== 而不是=

此外,对于既不是赢也不是输的掷骰,您不会为其中任何一个增加 winsloss 计数器,而是添加到 count。所以你最终会遇到wins + loss != count 的情况。计算胜率时,请尝试将其计算为wins / (loss + wins)

【讨论】:

  • 谢谢。现在修复了这个问题,但它仍然给我同样的结果。
  • 您在跟踪输赢计数的方式上也存在错误。请参阅我对上面答案的补充。
  • 谢谢!这正是问题所在!我刚刚摆脱了 count++ 语句,只是将整个事情转换为一个 for 循环来计算它运行的次数。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多