【问题标题】:C++ Coin flip program errorC++ 硬币翻转程序错误
【发布时间】:2013-09-02 14:08:26
【问题描述】:

我正在尝试在掷硬币时数连续的正面。不幸的是,我的连续正面计数器没有正确增加。有任何想法吗?下面的代码和示例输出:

#include <iostream>
#include <string>
#include "random.h"
using namespace std;

string FlipCoin (string flip);


int main() {
    string flip;
    int consecutiveHeads = 0;
    int totalFlips = 0;
    while (consecutiveHeads<3) {
        totalFlips++;
        if (FlipCoin(flip) == "heads") {
           consecutiveHeads++;
        } else {
            consecutiveHeads = 0;
        }
        cout <<totalFlips<<" "<< FlipCoin(flip) << " " << consecutiveHeads <<endl;
    }
    cout <<"It took "<< totalFlips <<" coin flips to get 3 consecutive heads."<< endl;
    return 0;
}


string FlipCoin(string flip) {
    if (randomChance(0.50)) {
        return "heads";
    } else {
        return "tails";
    }
}

输出:

1 heads 1
2 tails 0
3 tails 1
4 heads 2
5 heads 3
It took 5 coin flips to get 3 consecutive heads.

【问题讨论】:

    标签: c++ flip


    【解决方案1】:

    每次调用FlipCoin(flip) 都会生成一个新的随机数。您调用它两次,因此它会生成两个不同的随机数。您应该调用一次FlipCoin(flip) 并将其存储在一个变量中。

    ...
    string result = FlipCoin(flip);
    if (result == "heads") {
        consecutiveHeads++;
    } else
        consecutiveHeads = 0;
    }
    cout <<"It took "<< totalFlips <<" coin flips to get 3 consecutive heads."<< endl;
    ...
    

    正如其他人提到的,main 中的 flip 变量未初始化且未使用。最好将其删除。建议您在FlipCoin 函数中传递flip 作为参考(使用&amp;)。这绝对有用途,但不是必需的。最简单的修订可能是:

    string FlipCoin() {
        if (randomChance(0.50)) {
            return "heads";
        } else {
            return "tails";
        }
    }
    

    PS:如果你从函数中去掉flip参数,你还必须用FlipCoin();替换每一次出现的FlipCoin(flip);

    【讨论】:

      【解决方案2】:

      问题是您在每次迭代中调用FlipCoin() 两次:首先与"heads" 进行比较,然后再次显示发生了什么。您需要调用一次,并将其放入变量中:

      while (consecutiveHeads<3) {
          totalFlips++;
          string curFlip = FlipCoin(flip);
          if (curFlip == "heads") {
             consecutiveHeads++;
          } else {
              consecutiveHeads = 0;
          }
          cout <<totalFlips<<" "<< curFlip << " " << consecutiveHeads <<endl;
      }
      

      附: FlipCoin() 的论据是什么?

      【讨论】:

        【解决方案3】:

        每次调用FlipCoin 函数时都会翻转。因此,您在 while 函数的每次迭代中翻转两次。您可以考虑传递flip 作为对FlipCoin 的引用:

        #include <iostream>
        #include <string>
        #include "random.h"
        using namespace std;
        
        void FlipCoin (string &flip);
        
        
        int main() {
            string flip;
            int consecutiveHeads = 0;
            int totalFlips = 0;
            while (consecutiveHeads<3) {
                totalFlips++;
                FlipCoin(flip);
                if (flip == "heads") {
                   consecutiveHeads++;
                } else {
                    consecutiveHeads = 0;
                }
                cout <<totalFlips<<" "<< flip << " " << consecutiveHeads <<endl;
            }
            cout <<"It took "<< totalFlips <<" coin flips to get 3 consecutive heads."<< endl;
            return 0;
        }
        
        
        void FlipCoin(string &flip) {
            if (randomChance(0.50)) {
                flip = "heads";
            } else {
                flip = "tails";
            }
        }
        

        【讨论】:

        • @Barmar,是的,flip 可以作为对 FlipCoin 的引用传递
        • 您的 FlipCoin 版本是不必要的,并且与原始程序相比令人困惑。最好不要传递翻转值。
        • 我的评论基于您的原始答案,没有重新定义 FlipCoin 以供参考。
        • 是的 - 就是这样。谢谢!
        • @cpp,不鼓励传递 flip 作为参考。如果有的话,从mainFlipCoin 中删除flip 参数会更合适。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多