0

これが私の割り当てです:


パズルバニアの地で、アーロン、ボブ、チャーリーは、どちらが史上最高のパズルソルバーであるかについて議論しました。議論を終わらせるために、彼らは死への決闘に同意した。アーロンは貧弱なショットであり、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は取得されません。さらに、これらの数値を使用すると、二重の結果(つまり、そのエラーとプログラムの別の部分からの別の結果)が得られることがあり、ループに問題があると思い込ませます。

割り当ての範囲外であるため、再帰関数の代わりにループを使用することを選択しました。

私は本当に困惑しているので、構文と形式を確認していただければ幸いです。

4

1 に答える 1

1

最初のポイント - a= rand() % 100;1..99 を含むのではなく、0..99 を含む。代わりに使用できますa = (rand() % 99) + 1。によって与えられる乱数の範囲はrandおそらく 99 で割り切れないため、これはまだ完全に一様な分布ではありません。

  1. WhozCraig が示唆するように、C++11 乱数ライブラリを使用します。

  2. ループで乱数を生成します。rand()たとえば、 value が返された場合は>= 9900、破棄して再試行します。このループを関数に入れて、毎回気にする必要がないようにします。

  3. 心配する必要はありません。このような場合、問題を気にする必要がある場合は、おそらくすでに警告を受けているはずです。

次のポイントは、次のようなコードです...

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

here は、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次に、 andに個別の変数は必要ありませんb(また、 を使用しているとは思いませんc)。1 つの変数rを forrandomまたは類似のものとして使用するだけです。

最後に、私が使用する構造は...

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

ここでのポイントは、制御フローで誰が生きていて誰が死んでいるかを覚えようとすると、コードが複雑になるということです。次の反復で再度チェックするのは不必要な作業のように思えますが、それらのチェックは些細なことです。より単純なコードを優先する必要があります。

この場合、これらの 3 つのif <whoever>_aliveブロックがどの程度似ているか、関数にどのように分解されるかを調べることもできます。

于 2013-02-21T05:56:42.403 に答える