случайно генерируемая вероятность игры с петлями и устранением

Вот мое назначение:


В стране Puzzlevania Аарон, Боб и Чарли поспорили, кто из них
был величайшим решателем головоломок всех времен. Чтобы раз и навсегда закончить спор, они согласились
на дуэли до смерти. Аарон был неудачным выстрелом и только поразил свою цель с вероятностью
1/3. Боб был немного лучше и поразил цель с вероятностью 1/2. Чарли был бывшим
меткий стрелок и никогда не скучал. Попадание означает убийство, и попадание человека выпадает из дуэли.
Чтобы компенсировать неравенство в своих навыках стрельбы, трое решили, что они
будет по очереди, начиная с Аарона, затем Бобом, а затем Чарли. Цикл
повторял, пока не стоял один человек. Этот человек запомнится навсегда
время как величайший решатель загадок всех времен.

Очевидная и разумная стратегия — стрелять в самого точного стрелка
живой, на том основании, что этот стрелок является самым смертоносным и имеет лучшие шансы нанести ответный удар.
Напишите программу для имитации поединка, используя эту стратегию. Ваша программа должна использовать случайный
числа и вероятности, приведенные в задаче, чтобы определить, поражает ли стрелок его
цель. Вы, вероятно, захотите создать несколько подпрограмм и функций для завершения
проблема.

намек
Допустим, шанс Аарона поразить цель составляет 1/3. Вы можете смоделировать эту вероятность
генерация случайной величины R от 1 до 99 включительно. Какова вероятность того, что
R меньше 33? Это 1/3. Вы видите, куда это ведет? Если R 33, то мы можем
симулировать Аарона, поражающего цель. Если R> 33, то он пропускает. Вы также можете создать случайный
переменная от 0 до 1 и проверьте, что она меньше 0,33.


вот код, который я наконец смог обработать после переписывания с нуля дважды:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;int main ()
{
int aaron=1, bob=1,charlie=1, a=0,b=0,c=0,counter=0;
srand(time(0));
a= rand() % 100;
if (a<=33)//if aaron kills charlie
{
charlie=0;

b= rand() % 100; //bob choots at aaron
if (b<=50)  //if bob kills aaron
{
aaron=0;
cout<<"error1"<<endl;
}
else if (b>50)
{
while (b>50) //if bob misses
{
a= rand() % 100; //aaron shoots at bob
if (a<=33)// if he kills bob
{
bob=0;
cout<<"error2"<<endl;
}
else //if he misses
{
b= rand() % 100;//bob shoots at aaron

if (b<=50)//if he kills him
{
aaron=0;
cout<<"error3"<<endl;
}
else //if he misses then the loop continues
{
counter++;
}
}
}
}
}
else if (a>33)//aaron misses
{
b= rand() % 100; //bob shoots at charlie
if (b<=50) //he kills charlie
{
charlie = 0;
a= rand() % 100; //aaron shoots at bob
if (a<=33)//aaron kills bob
{
bob=0;
cout<<"error4"<<endl;
}
else //if not
{
b= rand() % 100;//bob shoots at aaron
if (b<=50) // if he kills aaron
{
aaron=0;
cout<<"error5"<<endl;
}
else if (b>50)
{
while (b>50)//if not then begin loop
{
a= rand() % 100; //aaron shoots at bob
if (a<=33) //if he kills him
{
bob=0;
cout<<"error6"<<endl;
}
else
{
b= rand() % 100;;   //if not bob shoots at aaron
if (b<=50)// if he kills aaron
{
aaron=0;
cout<<"error7"<<endl;
}
else
{
counter++; //if not loop around
}
}

}
}
}
}

else //he misses so charlies kills bob
{
bob=0;
a= rand() % 100; //aaron shoots at charlie
if (a<=33) //aaron kills charlie
{
charlie=0;
cout<<"error8"<<endl;
}
else // or charlie kills aaron
{
aaron=0;
cout<<"error9"<<endl;
}
}if (charlie==0 && bob==0)
{
cout<<"Aaron wins."<<endl;
}
else if (aaron==0 && bob==0)
{
cout<<"Charlie wins."<<endl;
}
else if (charlie==0 && aaron==0)
{
cout<<"Bob wins."<<endl;
}
}

return 0;
}

Я добавил в строку cout ошибку #, когда я компилирую программу, чтобы увидеть, где мои ошибки.

программа запускается всегда, если я получаю строки cout ошибок 1,2, 6 и 6, я не получаю cout с именованным победителем, который должен идти вместе с ним. кроме того, с этими числами я иногда получаю двойной результат (то есть результат с этой ошибкой и другой из другой части программы), что заставляет меня предположить, что есть проблема с моими циклами.

Я решил использовать цикл вместо рекурсивной функции, так как это выходило за рамки назначения.

Я был бы признателен за любой пересмотр моего синтаксиса и формы, так как я действительно в тупике.

0

Решение

Первая точка — a= rand() % 100; не дает 1..99 включительно, дает 0..99 включительно. Вы могли бы использовать a = (rand() % 99) + 1 вместо. Это все еще не идеально равномерное распределение, потому что диапазон случайных чисел, заданных rand вероятно не делится на 99. Возможные исправления включают …

  1. Используйте библиотеку случайных чисел C ++ 11, как рекомендует WhozCraig.

  2. Генерация случайных чисел в цикле. Если rand() дает значение >= 9900Например, выбросьте его и попробуйте снова. Поместите этот цикл в функцию, чтобы вам не приходилось каждый раз беспокоиться об этом.

  3. Не беспокойтесь об этом — что-то вроде этого, если вы должны заботиться о проблеме, вы, вероятно, уже были предупреждены об этом.

Следующий пункт для кода, такого как …

if (b<=50)  //if bob kills aaron
{
aaron=0;
cout<<"error1"<<endl;
}
else if (b>50)

if (b>50) здесь полностью избыточно, по крайней мере, для компилятора. Вы могли бы включить это для ясности, учитывая, что у вас есть довольно длинный кусок кода с некоторой глубокой вложенностью, но я бы сделал это комментарием, и позвольте else делай свою работу

Вероятно, ваша настоящая проблема, хотя …

while (b>50) //if bob misses
{
a= rand() % 100; //aaron shoots at bob
if (a<=33)// if he kills bob
{
bob=0;
cout<<"error2"<<endl;
}
else //if he misses
{
b= rand() % 100;//bob shoots at aaron

if (b<=50)//if he kills him
{
aaron=0;
cout<<"error3"<<endl;
}
else //if he misses then the loop continues
{
counter++;
}
}
}

Если Аарон стреляет в Боба, b не изменяется, поэтому цикл повторяется снова. Аарон может стрелять в Боба снова и снова, прежде чем он наконец пропустит, и Боб, наконец, получает ход, хотя он уже мертв. Вам нужно изменить условие цикла — возможно, и в других случаях, хотя я не проверял. Я бы, наверное, использовал done флаг.

Далее вам не нужны отдельные переменные для a а также b (и я не думаю, что вы даже используете c) — просто используйте одну переменную r за random или похожие.

Наконец, структура, которую я бы использовал, была бы …

while num_alive > 1
if aaron_alive
if charlie_alive
aaron tries to shoot charlie
else
aaron tries to shoot bob

if bob_alive
if charlie_alive
bob tries to shoot charlie
else
bob tries to shoot aaron

if charlie_alive
if bob_alive
charlie tries to shoot bob
else
charlie tries to shoot aaron

Дело в том, что если вы попытаетесь вспомнить слишком много о том, кто жив, а кто мертв в потоке управления, код становится запутанным. Повторная проверка следующей итерации кажется ненужной работой, но эти проверки тривиальны, и даже если это не так, это преждевременная оптимизация. Вы должны предпочесть более простой код.

В этом случае вы также можете посмотреть, насколько похожи эти три if <whoever>_alive блоки, и как они могут быть включены в функцию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]