これが私の割り当てです:
パズルバニアの地で、アーロン、ボブ、チャーリーは、どちらが史上最高のパズルソルバーであるかについて議論しました。議論を終わらせるために、彼らは死への決闘に同意した。アーロンは貧弱なショットであり、1/3の確率で彼のターゲットをヒットしただけでした。ボブは少し良く、1/2の確率で目標を達成しました。チャーリーは熟練した射手であり、決して逃しませんでした。ヒットはキルを意味し、ヒットした人は決闘から脱落します。射撃スキルの不平等を補うために、3人は、アーロン、ボブ、チャーリーの順で順番にやり直すことにしました。このサイクルは、一人の男が立つまで繰り返されました。その男は、史上最高のパズルソルバーとして常に記憶されているでしょう。
明白で合理的な戦略は、この射手が最も致命的であり、反撃する可能性が最も高いという理由で、各人がまだ生きている最も正確な射手を撃つことです。この戦略を使用して決闘をシミュレートするプログラムを作成します。プログラムでは、問題で与えられた乱数と確率を使用して、射手がターゲットに当たるかどうかを判断する必要があります。問題を完了するために、複数のサブルーチンと関数を作成することをお勧めします。
ヒントアーロンがターゲットに命中する可能性は1/3だとしましょう。1から99までの確率変数Rを生成することにより、この確率をシミュレートできます。Rが33未満である確率はどれくらいですか?1/3です。これがどこをリードしているのかわかりますか?R 33の場合、ターゲットに当たるアーロンをシミュレートできます。R> 33の場合、彼はミスします。0から1の間の確率変数を生成し、それが0.33未満であるかどうかを確認することもできます。
これが、最初から2回書き直した後、ようやく処理できたコードです。
#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行に追加しました。
エラー1、2、3、および6のcout行を取得した場合、プログラムは実行されますが、それに付随するはずの名前付きの勝者が含まれるcoutは取得されません。さらに、これらの数値を使用すると、二重の結果(つまり、そのエラーとプログラムの別の部分からの別の結果)が得られることがあり、ループに問題があると思い込ませます。
割り当ての範囲外であるため、再帰関数の代わりにループを使用することを選択しました。
私は本当に困惑しているので、構文と形式を確認していただければ幸いです。