DiceSum - 如果骰子总和不是某个数字,如何扩展 if/if-else 语句以重新掷骰子

DiceSum - How to extend if/ if-else statement to reroll dice if dice sum is not a certain number

本文关键字:if 扩展 if-else 掷骰子 语句 何扩展 如果 数字 DiceSum      更新时间:2023-10-16
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
int main()
{
int n;
int win = 0;
int lose = 0;
int dice1;
int dice2;
int diceSum;
srand(time(0));
cout << "How many turns would you like? ";
cin >> n;
for (int i = 1; i <= n; i++)
{
dice1 = rand()%6 + 1;
dice2 = rand()%6 + 1;
diceSum = dice1 + dice2;
if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
win++;
}
else if((diceSum == 7) || (diceSum == 11)){
lose++;
}
else{
}
}
cout << "No. of Wins: " << win << endl;
cout << "No. of Losses: " << lose << endl;
cout<< setprecision(4)<<fixed<<showpoint;
cout << "nThe experimental probability of winning "<< (static_cast<float>(win)/n)*100 <<
"%.n";
return 0;
}

我的作业指出"...可以分析证明,您在PA 8-3中编程的骰子游戏的长期获胜概率为.4929293。扩展您编写的程序以运行大量转弯并计算经验(实验)概率。我的上一个任务是我不得不制作一个程序来掷两个骰子并揭示骰子总和。如果是 2、3 或 12,我赢了;如果是 7 或 11,那就是亏损,否则它会重复滚动。我无法重复滚动,现在对于这项任务,我必须做同样的事情。这是我当前代码的输出

我不想考虑总和不是 2,3,12,7 或 11 的情况,您有很多可能性,例如:

  • 在空else {}中更接近您的代码,i -=1;

    for (int i = 1; i <= n; i++)
    {
    dice1 = rand()%6 + 1;
    dice2 = rand()%6 + 1;
    diceSum = dice1 + dice2;
    if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
    win++;
    }
    else if((diceSum == 7) || (diceSum == 11)){
    lose++;
    }
    else{
    i -= 1;
    }
    }
    
  • 或者仅在您赢或输时递增i,并删除for()中的i++

    for (int i = 1; i <= n;)
    {
    dice1 = rand()%6 + 1;
    dice2 = rand()%6 + 1;
    diceSum = dice1 + dice2;
    if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
    win++;
    i++;
    }
    else if((diceSum == 7) || (diceSum == 11)){
    lose++;
    i++;
    }
    }
    
  • 或变体

    i = n;
    for (;;)
    {
    dice1 = rand()%6 + 1;
    dice2 = rand()%6 + 1;
    diceSum = dice1 + dice2;
    if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
    win++;
    if (!--i)
    break;
    }
    else if((diceSum == 7) || (diceSum == 11)){
    lose++;
    if (!--i)
    break;
    }
    }
    
  • 或删除所有关于I的信息,并在没有最后一个ELSE分支的情况下do { dice1 = ..... } while ((win + lose) != n);替换您的for

    do {
    dice1 = rand()%6 + 1;
    dice2 = rand()%6 + 1;
    diceSum = dice1 + dice2;
    if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
    win++;
    }
    else if((diceSum == 7) || (diceSum == 11)){
    lose++;
    }
    } while ((win + lose) != n);
    
  • 或变体

    for (;;) {
    dice1 = rand()%6 + 1;
    dice2 = rand()%6 + 1;
    diceSum = dice1 + dice2;
    if((diceSum == 2) || (diceSum == 3) || (diceSum == 12)){
    if ((++win + lose) == n)
    break;
    }
    else if((diceSum == 7) || (diceSum == 11)){
    if ((++lose + win) == n)
    break;
    }
    }
    

无论哪种方式执行的示例:

pi@raspberrypi:/tmp $ ./a.out
How many turns would you like? 1000
No. of Wins: 336
No. of Losses: 664
The experimental probability of winning 33.6000%.

这个结果是正常的,即使它看起来与直觉相反,因为制作这些数字的可能性是:

  • 2 : 1+1
  • 3 : 1+2 2+1
  • 12 : 6+6

  • 7: 1+6 6+1 2+5 5+2 3+4 4+3
  • 11 : 5+6 6+5

所以4种获胜的可能性(1/3/12)和8种失败的可能性(7/11),所以输的概率是获胜概率的两倍


我鼓励您始终检查输入,替换

cin >> n;

类似的东西

if (!(cin >> n)) {
cerr << "invalid number" << endl;
return -1;
}