C++ Coin flip program error

坚强是说给别人听的谎言 提交于 2020-01-04 09:36:08

问题


I am trying to count consecutive heads in a coin toss. Unfortunately, my counter for consecutive heads is not incrementing properly. Any ideas? Code and sample output below:

#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";
    }
}

Output:

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.

回答1:


Each call to FlipCoin(flip) generates a new random number. You call it twice, so it's generating two different random numbers. You should call FlipCoin(flip) once and store it in a variable.

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

As somebody else mentioned, the flip variable in your main is uninitialized and unused. It's best to remove it. It was suggested that you pass flip as a reference in your FlipCoin function (using &). This most definitely has uses but it's not necessary. The simplest revision might be:

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

PS: If you remove the flip parameter from the function, you must also replace every occurence of FlipCoin(flip); with FlipCoin();




回答2:


The problem is you're calling FlipCoin() twice in each iteration: first to compare with "heads", and then again to display what happened. You need to call it once, and put it in a variable:

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

P.S. What is the argument to FlipCoin() for?




回答3:


Each time you call FlipCoin function you flip. Thus, you flip twice in each iteration of your while function. You may consider passing flip as reference to 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";
    }
}


来源:https://stackoverflow.com/questions/18566294/c-coin-flip-program-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!