蒙蒂大厅项目 我目前正在编写一个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

蒙蒂大厅项目 我目前正在编写一个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,c++,C++,我似乎不知道出了什么问题。该项目应该通过在前100次尝试中保持原来的门选择,然后在接下来的100次尝试中打开门时切换来模拟胜利。提前感谢大家的帮助 #include <iostream> #include <time.h> using namespace std; int main() { int doorChoice; int prizeDoor; int doorReveal; int doorSwitch;

我似乎不知道出了什么问题。该项目应该通过在前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;
 }
#包括
#包括
使用名称空间std;
int main()
{
国际门户选择;
国际prizeDoor;
内部门帘;
车门开关;
整数计数;
int switchWin;
int stayWin;
srand((无符号整数)时间(0));
对于(计数=0;计数问题1:
操作员!=
操作员!=
不会做您认为它会做的事情

你是说

    doorReveal = !(prizeDoor || doorChoice);
    cout << "The host revealed door number " << doorReveal << " ." << endl;
    doorSwitch = (doorChoice || doorReveal);
它们是无限循环,因为循环期间计数不会增加。我想你的意思是
if
,而不是
while

问题3:初始化
switchWin
stayWin
这些变量只是在递增。就像@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;
}
#包括
#包括
使用名称空间std;
枚举门{door1=1,door2=2,door3=4,any=door1 | door2 | door3};

静态内联std::ostream&operator不要在开始时声明所有变量,而是在您首先使用的位置声明每个变量–而不是更早!此外,您的变量类型是错误的。您不希望所有变量都使用
int
。@KonradRudolph这确实是一个偏好问题,将它们声明在何处很好,但是y应该用默认值初始化。pptaszek如果您没有用其中一些变量中的数据初始化变量,请检查您的操作顺序!@Matthew不,它不是。正如您所看到的,它很容易出错。它还使代码的逻辑更难遵循,因为它人为地膨胀了程序的状态。有一个共识是程序的状态可管理且程序可读,变量的作用域应尽可能小,因此只能在实际使用的地方声明。@TobiasKienzler:不相关。但是像Konrad编写的一样,您通常不需要浪费行数,并且仍然可以从静态类型中获益。顺便说一句,您还应该注意,内置rand可能不是一个高质量的伪随机数生成器。在确定
门启示时,我感觉到另一个逻辑问题。我以后必须考虑这个问题。“启示门0”不是一个有效的结果——它无法工作:
!(prizeDoor | | doorChoice)
始终为0,因为门的编号为“1,2,3”。未经测试,但
doorexpeal=6-prizeDoor-door-choice
应该可以使用。@Jongware很棒。谢谢你提醒我。我决定用理智的方式“修复”它:稍等-brainfart回来lunch@Jongware好了。我想现在已经修好了。分行仍然有相当大的问题s(我认为
OP“在前100次尝试时保持原来的门选择,然后在下100次尝试时显示门时切换…”表明您是正确的,它需要是一个简单的
if(计数<100)…else.
可以将
stayWin
switchWin
语句移动到每个语句中。另外:for循环应计为200,不包括在内。您的门选择可以更容易地编写(和解析)为
任意-prizeDoor-doorChoice
,或者可能为
doorexpeal=doors(任意^prizeDoor^door选项)
(其中XOR为
而不是
)。
#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;
}