【何为三门问题?】
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?
【三门为题解法】
解法一
问题的答案是可以:当参赛者转向另一扇门而不是维持原先的选择时,赢得汽车的机会将会加倍。
有三种可能的情况,全部都有相等的可能性(1/3):
参赛者挑山羊一号,主持人挑山羊二号。转换将赢得汽车。
参赛者挑山羊二号,主持人挑山羊一号。转换将赢得汽车。
“参赛者挑汽车,主持人挑羊一号。转换将失败”,和“参赛者挑汽车,主持人挑羊二号。转换将失败。”此情况的可能性为: 由上可知,改变选择后获奖概率为2/3,不改变选择获奖概率为1/3。
【蒙特卡洛法】
蒙特卡洛法亦称为统计模拟法,是一种随机模拟法,是基于概率与统计理论方法的一种计算方法。将所需要解决的问题同一定的概率模型相联系,用电子计算机实现仿真或抽样,以获得近似解。
有大数定理可知,当样本容量足够大时,事件发生的频率即为其概率。
【本题思路】
可通过对三门问题进行仿真,重复尽可能多的游戏次数,得出最后的获奖与不获奖的频率,当次数足够多,结果可近似为三门问题的近似解。
【代码部分(matlab)】
n = 100000; % n代表蒙特卡罗模拟重复次数
a = 0; % a表示不改变主意时能赢得汽车的次数
b = 0; % b表示改变主意时能赢得汽车的次数
for i= 1 : n % 开始模拟n次
x = randi([1,3]); % 随机生成一个1-3之间的整数x表示汽车出现在第x扇门后
y = randi([1,3]); % 随机生成一个1-3之间的整数y表示自己选的门
% 下面分为两种情况讨论:x=y和x~=y
if x == y % 如果x和y相同,那么我们只有不改变主意时才能赢
a = a + 1; b = b + 0;
else % x ~= y ,如果x和y不同,那么我们只有改变主意时才能赢
a = a + 0; b = b +1;
end
end
disp(['蒙特卡罗方法得到的不改变主意时的获奖概率为:', num2str(a/n)]);
disp(['蒙特卡罗方法得到的改变主意时的获奖概率为:', num2str(b/n)]);
【matlab的成长路】
1.randi()的用法:randi([1,3],2,4)表示生成2行4列各元素数值大小在1~3之间的矩阵
【学习感悟】
1.注重将实际问题进行抽象,转化为数学问题
2.温故而知新,许多知识已经学过,需要结合一定的实际问题加深理解
3.代码编程这块,蒙特卡洛法不是具体的某一种算法,而是解决某一类问题的思路和方法。(算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令)
4.最后感谢清风大哥的视频,让我受益匪浅。