DiceSum - 如果骰子总和不是某个数字,如何扩展 if/if-else 语句以重新掷骰子
DiceSum - How to extend if/ if-else statement to reroll dice if dice sum is not a certain number
#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);
替换您的fordo { 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;
}
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 从“if constexpr”分支扩展对象生存期/范围
- DiceSum - 如果骰子总和不是某个数字,如何扩展 if/if-else 语句以重新掷骰子
- 在相同条件下扩展多个"if"可提高性能
- 是否有可能在不使用指针的情况下将变量的作用域扩展到if语句之外?
- 扩展在if/else序列中初始化的变量的作用域
- 将对象范围扩展到if语句之外