蒙蒂霍尔项目

Monty Hall Project

本文关键字:项目      更新时间:2023-10-16

我目前正在编写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;
 }

问题 1:operator!=

operator !=不会做你认为它做的事情。

你的意思是

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

我感觉到确定门的另一个逻辑问题。我以后得考虑一下。编辑:见问题5

问题2:while

while 循环也存在一个问题:

    while(count < 101)
    // ...
    while(count < 201)

它们是无限循环,因为在循环期间计数不会增加。我想你的意思是if那里,而不是while.

问题 3:启动switchWinstayWin

这些变量只是递增。就像@KonradRudolph建议的那样,

  • 在最需要的位置声明变量
  • 初始化它们
  • 当您使用它时,将它们标记为适当的const

问题4:rand()%3有偏见

您可能应该使用均匀分布。

  • http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx
  • 我将在这里使用std::uniform_int_distribution作为读者的练习,因为它可能超出了您的课程范围。请记住在任何现实生活中的代码中使用它

问题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;
}