主题:【原创】关于换不换门的问题,大家讨论。 -- 淡紫若兰
我愿意从奖金里分她$75,上限。美男计也成
嗯,钱不能白给,她得答应帮我换模式才行。
ABC三个箱子,模拟的次数为3N (N 很大)。假设嘉宾选中的是A,主持人打开的是B。(因为有奖的分布是随机的,这样的设定等同于主持人在不知的情况下在任意选择BC。)A有奖的次数接近于N, BC有奖的次数接近于2N,但其中B有奖的N次不记入统计。结果是在2N次有效模拟中 A有奖的次数=C有奖的次数=N。
嘉宾是否知道‘主持人是否知道哪扇门有奖’,不会影响换门或者不换门本身的中奖概率。
这不是说换门或者不换门的中奖概率一样,而是说,在主持人打开一扇空门后:
事实:主持人知道
嘉宾以为‘主持人知道’
最终概率:换门2/3 不换门1/3
事实:主持人知道
嘉宾以为‘主持人是瞎蒙的’
最终概率:换门2/3 不换门1/3
事实:主持人是瞎蒙的
嘉宾以为‘主持人知道’
最终概率:换门1/2 不换门1/2
事实:主持人是瞎蒙的
嘉宾以为‘主持人是瞎蒙的’
最终概率:换门1/2 不换门1/2
也就是说,嘉宾的想法对于换门或不换门的(实际)最终概率没有影响,‘嘉宾以为’那行完全是多余的。
严格来说,在任何情况下,嘉宾在打开空门后都应该换门。因为如果主持人是瞎蒙的,换门也不亏,但如果主持人知道,换门就有赚。有时候,就算主持人告诉嘉宾他不知道,也可能是骗人的,嘉宾无法确认这点,然而从概率得益的角度,嘉宾无需确认这点,只要坚持换门就好了。无论主持人知道还是瞎蒙,对嘉宾来说,换门可能增加赢面,并肯定不会减少赢面,不换门则可能减少赢面,肯定不会增加赢面。
因此,没有必要另给好处购买信息。
游戏规则在游戏开始之前是不同的,这个很明显,样本空间砍去1/3是这种不同的体现。
但在游戏开始之后,在已经打开了一扇空门之后,游戏规则还能有什么不同?为何样本空间的不同依然适用?这些问题让人无法得出一个直观解释。
不考虑样本空间的话概率就无从谈起。我们的直观有时候是具有欺骗性,多做些训练就可以建立有效的直观了 --- 不可本末倒置
否则模式A的结果应该是换和不换都是1/2。
如果数学概念和直观想法有冲突,而我只信直观解释不信其他,那就是本末倒置。
但寻求用直观的方法来解释数学概念,这不是本末倒置。如果说我们的直观想法有时候具有欺骗性,那么针对正确的数学概念寻求正确的直观解释,正是破解这种欺骗性的必要过程。
对这样的简单问题来说,如果不能通过正确的直观想法破解错误的直观想法,只说‘数学概念如此’‘统计实验结果如此’,那么我觉得这只是灌输答案,并没有真正找出直观感觉究竟在哪里骗了你。
问题是直观是从哪里来的。没有足够的有效的体验不能产生有效直观。
就这个概率问题而言,我的解释是概率不能脱离样本空间而存在。两个完全一样的现场,如果产生的途径不一样,可能隐含可重复性不同,继而导致概率不同。
花之
但不用卷心菜那么麻烦的思路。。。
当主持人不知道哪扇门里有奖的情况下,
实际上就是一个“拿走不放回”的彩票问题。。。
所以第二次的时候换与不换是一样的。
===========================================
但如果是N个门呢?
其实还是一样的。。。
不换门的中奖概率是1/N,换门的中奖概率是(N-1)/N * 1/(N-1)=1/N
这就很明显的可以看出是简单的彩票模型,不管先买后买,其实中的概率都一样。。。
- -- 系统屏蔽 --。
- -- 系统屏蔽 --。
int doors[3][2] = {0}; //数据,全局,第一维为中奖位置,第二维为用户选择位置,如果被选择,则置一
int WinTimes = 0; //中奖次数,全局,每次调用时由调用函数置0。
void Dothegame()
{
//选定一个位置做为中奖位置, doors第一维该位置1;
int rd = rand();
int Bingo = rd%3;
doors[Bingo][0] = 1;
//选定一位置作为指定位置,doors第二维该位置1;
int choose = rand()%3;
doors[choose][1] = 1;
//去掉一个未中奖且未被选择位置
for(int i = 0; i <= 2; i++)
{
if((doors[i][0]==0) && (doors[i][1]==0))
break;
}
//此时i为被去掉位置。
//更改选择
int Final= 3-i-choose;
if(doors[Final][0] == 1)
{
WinTimes++;
}
}
void CTest231Dlg::OnOK()
{
this->UpdateData();
WinTimes = 0;
// srand( (unsigned)time( NULL ) );
srand( (unsigned)GetTickCount ( ) );
m_list.ResetContent();
int t = this->m_times;
for(int a = 0; a<t; a++)
{
memset(doors, 0, sizeof(doors));
Dothegame();
}
ShowResult();
// CDialog::OnOK();
}