您的位置:首页 > 编程语言 > MATLAB

[解答]一道引起全美大学生和很多军械学院人士举论坛辩论的逻辑题

2005-08-31 19:34 411 查看
原题:
假设你在进行一个游戏节目。现给三扇门供你选择:一扇门后面是一辆轿车,另两
扇门后面分别都是一头山羊。你的目的当然是要想得到比较值钱的轿车,但你却并
不能看到门后面的真实情况。主持人先让你作第一次选择。在你选择了一扇门后,
知道其余两扇门后面是什么的主持人,打开了另一扇门给你看,而且,当然,那里
有一头山羊。现在主持人告诉你,你还有一次选择的机会。那么,请你考虑一下,
你是坚持第一次的选择不变,还是改变第一次的选择,更有可能得到轿车?

《广场杂志》刊登出这个题目后,竟引起全美大学生的举国辩论,许多大学的教授
们也参与了进来。真可谓盛况空前。据《纽约时报》报道,这个问题也在中央情报
局的办公室内和波斯湾飞机驾驶员的营房里引起了争论,它还被麻省理工学院的数
学家们和新墨哥州洛斯阿拉莫斯实验室的计算机程序员们进行过分析。

现在,请你来回答一下这个问题。
偶的理解:
应该是换的概率大,从不得车的角度看:
第一次选择,不得车的概率是2/3.
在第二次选择中,
如果换,就会改变第一次不得车的命运,所以第二次换的话,也就是得车概率成了2/3.
如果不换的话,不得车的概率还是第一次的不得车概率2/3,也就是得车是1/3概率.
所以换是2/3得车,不换是1/3得车
 
论坛的讨论(军网):
http://23.104.219.35/bbs/ShowPost.asp?id=21126
计算机模拟:
1,
matlab程序,直接复制到matlab窗口就可以运行;
运行结果:

如果换得车概率:0.66657
如果不换得车概率:0.33343

cout=1000000; %选取次数
car_change=0; %换得车次数

car_unchange=0;%不换得车次数

open=rand(1,cout)./0.3333;%均匀分布的随机数,在0~1表示选中车
for i=1:cout
if open(i)<1 %如果选中车
car_unchange = car_unchange + 1; %不换则得车,
car_change =car_change + 0;%换则不得车
else %没选中车
car_unchange = car_unchange + 0; %不换则不得车
car_change =car_change + 1;%换则得车
end
end

disp(strcat('如果换得车概率:',num2str(car_change/cout)))

disp(strcat('如果不换得车概率:',num2str(car_unchange/cout)))

套用CCEZC的公式对比,完全吻合:


拓展到羊为n只的matlab模拟程序:
cout=20000;
n=10;
    l_change=zeros(1,n);
    l_unchange=zeros(1,n);
    car_change=zeros(1,n);
    car_unchange=zeros(1,n);
 
for k=2:n %k为羊的只数
%车总是放在第一个门
 open=rand(1,cout);%均匀分布的随机数,第一次选的门
 open2=rand(1,cout);%均匀分布的随机数,第二次选的门

 
    for i=1:cout
        door_open=ceil(open(i)*(k+1));%第一次选择的门
        door_open2=ceil(open2(i)*(k-1));%第二次选择的门,将主持人开的门和第一次所选的门放在最后面,重排门
                                         %则第二次选择范围为1~k-1
       
              
 
       
        if door_open==1   %如果选中车
            car_unchange(k) = car_unchange(k) + 1; %不换则得车
            car_change(k) =car_change(k) + 0;%换则不得车
        else   %没选中车
            car_unchange(k) = car_unchange(k) + 0; %不换则不得车
           
           
            %第二次换的门
           
           
            if door_open2==1%如果第二次换得车
                car_change(k) =car_change(k) + 1;%换则得车
           
            else %如果第二次换还不得车
                car_change(k) =car_change(k) + 0;%换也不得车
            end
           
           
        end
    end
    l_change(k)=car_change(k)/cout;
    %disp(strcat('如果换得车概率:',num2str(car_change(k)/cout)))
    l_unchange(k)=car_unchange(k)/cout;
    %disp(strcat('如果不换得车概率:',num2str(car_unchange(k)/cout)))
end
x=2:n;
p_change=x./(x+1)./(x-1);%推导公式,换得车概率
%画图
 
l_change_G=l_change(:,2:n); 
l_unchange_G=l_unchange(:,2:n);
p_change_G=p_change;
 
plot(2:n,l_change_G,':',2:n,l_unchange_G,2:n,p_change_G,'*')

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab plot 游戏