当循环应该只运行一次时,执行两次while循环(C++)
Do-while loop running twice when it should run only once (C++)
朋友。我有个问题。
问题:计算机必须从36个字符串的数组中随机选择一个字符串。如果它偶然选择字符串#34或#35(最后两个),它必须从同一数组中再抽取两个随机字符串。我尝试了一个临时解决方案,它"几乎"有效(请参阅下面的代码)。
随机化工作得很好,称为srand in main()。有一个强制的"x2"绘制(出于测试原因),所以计算机又绘制了两个字符串。这两个新的随机选择不是"x2",但循环仍然会再次启动——但只是又一次!这一次,计算机又选择了两个"chits",它们也不是"x2",所以,正如预期的那样,它返回"chits have draw"语句,函数终止。为什么同一个代码运行两次,结果相同,但if/else行为不同?事先非常感谢。
string mortalityCalc ()
{
string mortalityChits[36] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","-","-","-","-","x2","x2"};
int mortalityResult;
// mortalityResult = rand() %36;
mortalityResult = 35; // for testing only. Delete afterwards.
string drawnChit = mortalityChits[mortalityResult];
string drawnChit1;
string drawnChit2;
if (drawnChit != "-" && drawnChit != "x2")
{
string returnText = string("The computer has drawn the chit '") + drawnChit + "'.";
return returnText;
}
else if (drawnChit == "-")
{
string returnText = string("The computer has drawn the chit '") + drawnChit + "'. No senators died this year.";
return returnText;
}
do
{
cout << "The computer has drawn the 'x2' chit." << endl;
cout << "Two more chits will be drawn.n" << endl;
mortalityResult = rand() %36;
drawnChit1 = mortalityChits[mortalityResult];
cout << "The first draw is the chit '" << drawnChit1 << "'. ";
mortalityResult = rand() %36;
drawnChit2 = mortalityChits[mortalityResult];
cout << "The second draw is the chit '" << drawnChit2 << "'." << endl;
} while (drawnChit1 == "x2" || drawnChit2 == "x2");
return "The mortality chits have been drawn. The corresponding senators are dead.";
}
UPDATE:尝试将此代码与程序的其余部分隔离运行,其行为与预期一致。所以我想发布之前的内容很重要:
cout << "If you are a lazy bastard, the computer can pick one senator randomly for you.nAre you a lazy bastard? [y/n]" << endl;
string lazyBastard;
cin >> lazyBastard;
cout << endl;
if (lazyBastard == "y" || lazyBastard == "Y" || lazyBastard == "yes" || lazyBastard == "YES" || lazyBastard == "Yes")
{
mortalityCalc ();
cout << mortalityCalc () << endl;
cout << "Very well. Now, imminent wars become active (Only one of each match)." << endl;
cout << "Get ready for the next phase." << endl;
通过阅读这里的其他一些问题,我的猜测是,cin在某种程度上扰乱了循环行为,尽管它们不相关,并且循环的语句或条件中没有任何用户输入。这可能吗?如果是,为什么以及如何补救?
再次感谢。
在第一个循环中,您强制执行'x2',这样您就进入了do-while循环。两次调用"rand()%36"的结果总是19,并且是一个介于30和34之间的数字。关键是,如果你不给随机数生成器一个种子"srand(…)",随机数生成器总是生成相同的数字序列
do {
// ...
cout << rand()%36;
// ...
} while( /*...*/ )
请参阅http://ideone.com/zl8ggH您必须创建随机数,并且您的代码能够满足您的期望。
终于来了!我以为这会是一件愚蠢的事情!我刚刚意识到我调用了mortalityCalc()函数两次!这就是它循环两次的原因!
感谢所有试图提供帮助的人!
- 在映射擦除c++期间执行循环的次数
- C++-For循环未执行
- 如何强制循环执行另一次迭代到零并关闭循环
- 程序在循环执行后崩溃
- 如何使用两个 for 循环执行唯一的洗牌
- 对于循环执行失败,因为变量我不会递增,为什么?
- pi的倍数到千分之一的值可能会改变循环执行方式
- For 循环执行奇怪的增量跳转
- 在循环执行之间释放内存
- 如何计算循环执行了多少次?C++
- 给定范围内的完美平方:循环执行异常
- 需要澄清有关此循环执行乘法的信息
- 有条件的大平面数组遍历和令人惊讶的短循环执行时间
- c++openmp,用于循环执行期间的循环最大减少值
- 为什么循环执行时间的此C++存在显着差异?
- 对于循环条件内的循环执行,C++
- 使用for循环执行线程
- c++中While循环执行得太早
- c++中while循环执行中的打印输出语句
- 这个 while 循环执行其适当的功能,但对于其他内容是必需的