Я пытаюсь посчитать подряд головы в броске монеты. К сожалению, мой счетчик последовательных головок не увеличивается должным образом. Есть идеи? Код и пример вывода ниже:
#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.
Каждый звонок 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;
...
Как кто-то еще упомянул, flip
переменная в вашем main
неинициализирован и не используется. Лучше удалить это. Было предложено пройти flip
в качестве ссылки в вашем FlipCoin
функция (используя &
). Это определенно имеет применение, но это не обязательно. Самая простая ревизия может быть:
string FlipCoin() {
if (randomChance(0.50)) {
return "heads";
} else {
return "tails";
}
}
PS: если вы удалите flip
параметр из функции, вы также должны заменить каждый в FlipCoin(flip);
с FlipCoin();
Проблема в том, что ты звонишь FlipCoin()
дважды в каждой итерации: сначала сравнить с "heads"
, а затем снова, чтобы отобразить, что произошло. Вам нужно вызвать его один раз и поместить в переменную:
while (consecutiveHeads<3) {
totalFlips++;
string curFlip = FlipCoin(flip);
if (curFlip == "heads") {
consecutiveHeads++;
} else {
consecutiveHeads = 0;
}
cout <<totalFlips<<" "<< curFlip << " " << consecutiveHeads <<endl;
}
Постскриптум Какой аргумент FlipCoin()
за?
Каждый раз, когда вы звоните 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";
}
}