蒙蒂大厅项目 我目前正在编写一个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次尝试中打开门时切换来模拟胜利。提前感谢大家的帮助蒙蒂大厅项目 我目前正在编写一个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;
#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;
}