2013-09-02 2 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) и сохранить его в переменной.

Как кто-то упоминал, flip переменной в вашем main не инициализирован и не используется. Лучше всего удалить его. Было предложено передать flip в качестве ссылки в вашей функции FlipCoin (используя &). Это наиболее определенно использует, но это необязательно. Самый простой пересмотр может быть:

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

PS: Если вы удалите параметр flip из функции, необходимо также заменить все вхождения FlipCoin(flip); с FlipCoin();

+0

Хорошо - это исправлено - спасибо! – user2738727

0

Каждый раз, когда вы звоните 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"; 
    } 
} 
+0

'flip' - это неинициализированная переменная в его коде. – Barmar

+0

@Barmar, да, 'flip' может быть передано как ссылка на' FlipCoin' – cpp

+1

Ваша версия FlipCoin не нужна и запутанна в отношении исходной программы. Было бы предпочтительным не передавать значение переворота. – collinjsimpson

0

проблемного вы звоните 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()?

Смежные вопросы