汽车山羊问题的分析以及Python和MATLAB仿真实验

时间:2024-02-20 17:25:27

汽车和山羊问题

题目的背景介绍:

现有三扇门,其中一扇门后是一辆车,另外两扇门后是一头山羊。

选手从1,2,3号三扇门中选出一扇(仅标记,不打开),接着主持人再从未标记的两扇门中选出一扇打开。

主持人知道每扇门后放的是什么,所以每次主持人都选择后面是羊的那扇门打开。

选手有一次改变自己选择的机会。

最后,打开选手最终选中的那扇门,以选手最终选择的是车为获胜。

请问选手是否需要改变选择?

汽车和山羊问题求解

一、对该问题的枚举分析

是否更换 选择几号门 如果车在一号门后 如果车在二号门后 如果车在三号门后
# 不换 一号 \(√\) \(×\) \(×\)
二号 \(×\) \(√\) \(×\)
三号 \(×\) \(×\) \(√\)
# 换 一号 \(×\) \(√\) \(√\)
二号 \(√\) \(×\) \(√\)
三号 \(√\) \(√\) \(×\)

​ 令更换选择且成功为事件A,不更换选择且成功为事件B,那么显然我们可以得出二者的概率为:

\[P(A)=\frac{1}{3}\quad\quad\quad P(B)=\frac{2}{3} \]

二、对该问题的条件概率概率分析

​ 令更换选择为事件A,不更换选择为事件B,显然

\[P(A)=P(B)=\frac{1}{2} \]

1. 如果没有更换选择

​ 车在一、二、三号门后分别为事件a、b、c,则

\[P(a)=P(b)=P(c)=\frac{1}{3} \]

​ 令选择一、二、三号门分别为事件1,2,3,则

\[P(1)=P(2)=P(3)=\frac{1}{3} \]

​ 那么显然没有更换选择且成功的概率设为\(P(\alpha)\)就是

\[P(\alpha)=P(1\cap a)+P(2\cap b)+P(3\cap c)=1/9+1/9+1/9=1/3 \]

​ 故\(P(\alpha)=1/3\)

2. 如果更换了选择

​ 显然我们可知如果更换选择,那么如果刚开始选的是对的则最后是错的,刚开始选的是错的则最后是对的

​ 车在一、二、三号门后分别仍设为事件a、b、c,则

\[P(a)=P(b)=P(c)=\frac{1}{3} \]

​ 令选择一、二、三号门也分别为事件1,2,3,则

\[P(1)=P(2)=P(3)=\frac{1}{3} \]

​ 那么显然更换选择且成功的概率设为\(P(\beta)\)就是

\[P(\beta)=P(2\cap a)+P(3\cap a)+P(1\cap b)+P(3\cap b)+P(1\cap c)+P(2\cap c)\\ =1/9+1/9+1/9+1/9+1/9+1/9=2/3 \]

​ 故\(P(\beta)=2/3\)

三、基于\(MATLAB\)的模拟实验

先用\(Python\)做了模拟实验

from random import*
TIMES = 10000
nochange=0             			        #初始化不改选择的次数
change=0           		 		#初始化更改选择的次数
for i in range(TIMES):
	Door=randint(0,2)                       #汽车在哪个门
	guess=randint(0,2)                      #我的选择是哪个门
	if Door==guess:                         #猜对了
		nochange+=1    			#不改选择的次数+1
	else:
		change+=1   			#更改选择的次数+1
print("不改选择:{}".format(nochange/TIMES))
print("更改选择:{}".format(change/TIMES))
# 以下为测试数据
# 不改选择:0.332  更改选择:0.668
# 不改选择:0.3283 更改选择:0.6717
# 不改选择:0.331  更改选择:0.669
# 不改选择:0.3308 更改选择:0.6692
# 不改选择:0.3369 更改选择:0.6631

可以看到模拟实验的频率都稳定在上述分析得出的理论概率附近

另用\(MATLAB\)也做了模拟

n = 100000;						%%n代表随机次数
nochange = 0;					        %%不改变选择
change = 0;						%%改变选择
for i= 1 : n					        %%车在哪个门后
    x = randi([1,3],1);
	y = randi([1,3],1);			        %%我的选择哪个门
if x == y						%%选对了
      nochange = nochange + 1;	%%不改选择的次数+1
end 	
if x ~= y 						%%选错了
    change = change + 1;		                %%更改选择的次数+1
end
end
disp(nochange/n);				        %%输出不改变选择时的获奖概率
disp(change/n);					        %%输出改变选择时的获奖概率 
%%以下为测试数据
%%不改变0.3342 改变0.6658
%%不改变0.3286 改变0.6714
%%不改变0.3351 改变0.6649