-1

私は現在、C++ のモンティ ホール問題のシミュレーションを書いている最中で、いくつかの問題に遭遇しました。私が取得し続けるエラーは次のとおりです。

source.cpp(23): error C4700: uninitialized local variable 'doorReveal' used
source.cpp(25): error C4700: uninitialized local variable 'doorSwitch' used
source.cpp(52): error C4700: uninitialized local variable 'stayWin' used
source.cpp(56): error C4700: uninitialized local variable 'switchWin' used

何が悪いのかわからないようです。このプロジェクトは、最初の 100 回の試行で最初のドアの選択を維持し、次の 100 回の試行でドアが表示されたときに切り替えることで、勝利をシミュレートすることになっています。事前にご協力いただきありがとうございます。

 #include <iostream>
 #include <time.h>
 using namespace std;

 int main()
 {
     int doorChoice;
     int prizeDoor;
     int doorReveal;
     int doorSwitch;
     int count;
     int switchWin;
     int stayWin;

     srand((unsigned int) time(0));

     for (count = 0; count <= 200; count++)
     {
         prizeDoor = (rand() % 3) + 1;
         doorChoice = (rand() % 3) + 1;
         cout << "The prize door is door number " << prizeDoor << " ." << endl;
         cout << "The door the contestant chose was door " << doorChoice << endl;
         doorReveal != prizeDoor || doorChoice;
         cout << "The host revealed door number " << doorReveal << " ." << endl;
         doorSwitch != doorChoice || doorReveal;

         while (count < 101)
         {
             if (doorChoice == prizeDoor)
             {
                 cout << "Great Job! You won!" << endl;
             }
             else {
                 cout << "Not this time!" << endl;
             }
         }

         while (count < 201)
         {
             if (doorSwitch == prizeDoor)
             {
                 cout << "You switched and won!" << endl;
             }
             else {
                 cout << "You switched and lost!" << endl;
             }
         }

         if (doorChoice == prizeDoor)
         {
             stayWin++;
         }
         if (doorSwitch == prizeDoor)
         {
             switchWin++;
         }
         count++;
     }
     cout << "Your win percentage when staying was " << stayWin << "%!" << endl;
     cout << "Your win percentage when switching was " << switchWin << "%!" << endl;
     return 0;
 }
4

1 に答える 1

10

問題 1:operator!=

operator !=あなたが思っていることをしません。

もしかして

    doorReveal = !(prizeDoor || doorChoice);
    cout << "The host revealed door number " << doorReveal << " ." << endl;
    doorSwitch = (doorChoice || doorReveal);

doorReveal を決定する際に別のロジックの問題を感じます。それについては後で考えなければなりません。編集:問題5を参照

問題 2:while

while ループにも問題があります。

    while(count < 101)

    // ...

    while(count < 201)

ループ中にカウントが増加しないため、それらは無限ループです。ifの代わりに、そこを意味していたと思いますwhile

問題 3: 初期化switchWinstayWin

これらの変数は増分されるだけです。@KonradRudolphが提案したように、

  • 最初に必要な場所で変数を宣言します
  • それらを初期化する
  • あなたがそれにいる間、それらconstを適切にマークしてください

問題4:rand()%3偏っている

おそらく均一な分布を使用する必要があります。

見る

問題 5: ドアの「派生」を修正する

ブール値はセットではありません。たとえそうであったとしても、あなたはバイナリセットに固執するでしょう. 次のモデルを提案します。

enum doors { door1 = 1, door2 = 2, door3 = 4, any = door1|door2|door3 };

だからあなたは言うことができます:

doors const doorReveal = doors(~(prizeDoor | doorChoice)  & any);
doors const doorSwitch = doors(~(doorChoice | doorReveal) & any);

それを修正すると、動作しているように見えるプログラムが得られます。

#include <iostream>
#include <time.h>
using namespace std;

enum doors { door1 = 1, door2 = 2, door3 = 4, any = door1|door2|door3 };

static inline std::ostream& operator<<(std::ostream& os, doors val) {
    switch(val) {
    case door1: return os << "door #1";
    case door2: return os << "door #2";
    case door3: return os << "door #3";
    case any:   return os << "any door";
    }
    return os << "OOPS";
}

int main()
{
    unsigned switchWin = 0;
    unsigned stayWin   = 0;
    srand((unsigned int) time(0));
    for(int count = 0; count <= 200; count++)
    {
        doors const prizeDoor  = doors(1 << rand() / ( RAND_MAX / 3 ));
        doors const doorChoice = doors(1 << rand() / ( RAND_MAX / 3 )); 
        cout << "The prize door is door number " << prizeDoor << " ." << endl;
        cout << "The door the contestant chose was door " << doorChoice << endl;
        doors const doorReveal = doors(~(prizeDoor | doorChoice)  & any);
        doors const doorSwitch = doors(~(doorChoice | doorReveal) & any);

        cout << "The host revealed door number " << doorReveal << " ." << endl;
        if(count < 101)
        {
            if(doorChoice == prizeDoor)
            {
                cout << "Great Job! You won!" << endl;
            }
            else
            {
                cout << "Not this time!" << endl;
            }
        };
        if(count < 201)
        {
            if(doorSwitch == prizeDoor)
            {
                cout << "You switched and won!" << endl;
            }
            else
            {
                cout << "You switched and lost!" << endl;
            }
        };
        if(doorChoice == prizeDoor)
        {
            stayWin++;
        }
        if(doorSwitch == prizeDoor)
        {
            switchWin++;
        };
        count++;
    }
    cout << "Your win percentage when staying was " << stayWin << "%!" << endl;
    cout << "Your win percentage when switching was " << switchWin << "%!" << endl;
    return 0;
}
于 2013-09-25T07:00:49.310 に答える