2013-09-02 6 views
2

동전 던지기에서 연속 머리를 계산하려고합니다. 불행히도 연속적인 헤드에 대한 카운터가 제대로 증가하지 않습니다. 어떤 아이디어? 아래의 코드 샘플 출력 :C++ 동전 뒤집기 프로그램 오류

#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. 

답변

0

FlipCoin(flip)를 호출 할 때마다 새로운 난수를 생성합니다. 두 번 호출하면 두 개의 다른 난수가 생성됩니다. FlipCoin(flip)을 한 번 호출하여 변수에 저장해야합니다. 다른 사람이 언급 한 바와 같이

, 당신의 mainflip 변수는 초기화되지 않은 및 사용되지 않습니다. 그것을 제거하는 것이 가장 좋습니다. FlipCoin 함수에서 flip을 참조로 전달하는 것이 좋습니다 (& 사용). 이것은 가장 확실하게 용도가 있지만 필수는 아닙니다.

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

추신 : 당신이 함수에서 flip 매개 변수를 제거하면, 당신은 또한 FlipCoin();

+0

오케이 - 그게 고쳐 줘서 고마워! – user2738727

0

당신이 플립 FlipCoin 함수를 호출 할 때마다. 따라서 while 함수를 반복 할 때마다 두 번 넘깁니다. 당신은 FlipCoin에 참조로 flip을 통과 고려할 수 :

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

'flip'은 코드에서 초기화되지 않은 변수입니다. – Barmar

+0

@Barmar, 예, flip,'FlipCoin'에 대한 참조로 전달할 수 있습니다 – cpp

+1

FlipCoin의 버전은 불필요하며 원래 프로그램과 관련하여 혼란 스럽습니다. 반올림 값을 전달하지 않는 것이 좋습니다. – collinjsimpson

0

문제로 FlipCoin(flip);의 모든 선두로부터 교체해야합니다 당신은 두 번 FlipCoin()를 호출하고있다 간단한 수정이있을 수 있습니다 각 반복마다 : 먼저 "heads"과 비교하고 다시 무슨 일이 있었는지 표시하십시오. 한 번 호출하여 변수에 넣어야합니다.

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

P.S. FlipCoin()에 대한 논쟁은 무엇입니까?