调试有偏差的C++硬币翻转程序:结果全为正或全为反
解决C++硬币翻转程序全正/全反的问题
嘿,我一眼就发现问题所在啦!你的程序每次输出全是Heads或者全是Tails,核心原因是你只在循环外面生成了一次随机数,之后整个循环都在重复使用这个固定值,自然结果完全一致。
问题代码的关键缺陷
你看这段逻辑:
int FLIP_RESULT = rand() % 2 + 1; // 只生成一次随机数 // ... for (int COUNTER = 0; COUNTER < NUMBER_OF_FLIPS; COUNTER++) { // 每次循环都用同一个FLIP_RESULT值 if (FLIP_RESULT == 1) { cout << "Heads" << endl; } else { cout << "Tails" << endl; } }
rand()只被调用了一次,所以FLIP_RESULT从始至终都是同一个数字(要么1要么2),循环里反复输出同一个结果也就不奇怪了。
修正方案:把随机数生成放到循环内部
我们只需要把随机数的生成逻辑移到for循环里面,让每次循环都重新生成一个新的随机数,这样每次翻转的结果才会随机变化。另外,srand(time(nullptr))是用来初始化随机数种子的,这个只需要在程序开头调用一次就够了,不用放到循环里。
修正后的完整代码:
#include <cstdlib> #include <ctime> #include <iostream> #include <string> using namespace std; int main() { srand(time(nullptr)); // 初始化随机种子,只需要执行一次 int NUMBER_OF_FLIPS = 0; cout << "Welcome to Coin Flipper. How many coins would you like to flip?" << endl; cin >> NUMBER_OF_FLIPS; for (int COUNTER = 0; COUNTER < NUMBER_OF_FLIPS; COUNTER++) { // 每次循环都生成新的随机数 int FLIP_RESULT = rand() % 2 + 1; if (FLIP_RESULT == 1) { cout << "Heads" << endl; } else { cout << "Tails" << endl; } } return 0; }
额外小优化
其实rand() % 2就可以直接得到0或1,不用加1,这样判断逻辑可以更简洁:
int FLIP_RESULT = rand() % 2; cout << (FLIP_RESULT == 0 ? "Heads" : "Tails") << endl;
内容的提问来源于stack exchange,提问作者WinterSunSummerSnow
相关产品推荐
相关产品推荐

