1990年,NBC电视台的 Let's make a deal节目中主持人让来宾上台猜奖,奖品是一辆汽车,台上有三扇关着的门,汽车藏在其中一扇门后,其他两扇门后面是一只山羊,为了制造节目的效果和高潮,在你选好门之后,主持人暂不开门,由於他知道汽车在哪扇门后面,所以主持人就在你没有选到的两扇门中,选一扇有山羊的门打开,然后主持人就问你:「您要改变您的选择吗?」你可以坚持原来的选择,也可以改选另一扇门
这个问题其实非常简单,但是身边还是有人认为说换不换机率相等,加上今天无聊,就用Matlab来证明,换比不换答对率高。
至於到底为什麽换比不换好,我的方向是:有三个选项,有可能选到正确(1/3)与不正确(2/3)的选项,今天主持人开了一扇不可能是答案的门,那如果你本来选的是正确答案,你一换就绝对是错误答案(1/3),你原本选的是错误答案,你一换就绝对是正确答案(2/3)。
以下真相:
3个选项 样本数1百万
3个选项 样本数1百万
4个选项 样本数1百万
以下code:(看得懂的人自然知道哪里断行,由於我是繁体语系的人XD,里面的注释,我就不繁转简了,大家看得懂就好)
clear;clc;
nochange=0; %不改变答对的数量
change=0; %改变答对的数量
imwrong=0; %ㄜ...
testamount=1000000; %样本数
for i=1:testamount
answer=ceil(rand*3); %正确答案
player=ceil(rand*3); %玩家一开始的选择
playerelse=[1:player-1,player+1:3]; %玩家没选到的选项
if player==answer %如果玩家一开始就选对,那就能任意告知剩下的两个其一为非答案
tellplayer=playerelse(ceil(rand*2));
else %如果玩家一开始选错,那就只能告知剩下的两个中不是答案的为非答案
tellplayer=playerelse(playerelse~=answer);
end
tellplayerelse=[1:tellplayer-1,tellplayer+1:3]; %没告知的选项
playerchange=tellplayerelse(tellplayerelse~=player); %玩家改变选择
fprintf('答案:%d 玩家开始选:%d 告知非答案:%d 玩家改变选:%d\n',answer,player,tellplayer,playerchange)
if playerchange==answer
change=change+1;
disp('改变对')
elseif player==answer
nochange=nochange+1;
disp('不改变对')
else
imwrong=imwrong+1;
disp('写程式的人是脑残')
end
end
fprintf('改变答对率:%.6f\n 不改变答对率:%.6f\n 写程式的人是脑残的机率;%.6f\n',change/testamount,nochange/testamount,imwrong/testamount)
-----------------------------------------------------------------------------
clear;clc;
selectamount=input('输入选项数');
nochange=0; %不改变答对的数量
change=0; %改变答对的数量
testamount=1000000; %样本数
for i=1:testamount
answer=ceil(rand*selectamount); %正确答案
player=ceil(rand*selectamount); %玩家一开始的选择
playerelse=[1:player-1,player+1:selectamount]; %玩家没选到的选项
if player==answer %如果玩家一开始就选对,那就能任意告知剩下的其一为非答案
tellplayer=playerelse(ceil(rand*(length(playerelse))));
else %如果玩家一开始选错,那就只能告知剩下的不是答案的为非答案
playerelse=playerelse(playerelse~=answer);
tellplayer=playerelse(ceil(rand*(length(playerelse))));
end
tellplayerelse=[1:tellplayer-1,tellplayer+1:selectamount]; %没告知的选项
tellplayerelse=tellplayerelse(tellplayerelse~=player);
playerchange=tellplayerelse(ceil(rand*(length(tellplayerelse)))); %玩家改变选择
fprintf('答案:%d 玩家开始选:%d 告知非答案:%d 玩家改变选:%d\n',answer,player,tellplayer,playerchange)
if playerchange==answer
change=change+1;
disp('改变对')
elseif player==answer
nochange=nochange+1;
disp('不改变对')
end
end
fprintf('改变答对率:%.6f\n 不改变答对率:%.6f\n',change/testamount,nochange/testamount)
这个问题其实非常简单,但是身边还是有人认为说换不换机率相等,加上今天无聊,就用Matlab来证明,换比不换答对率高。
至於到底为什麽换比不换好,我的方向是:有三个选项,有可能选到正确(1/3)与不正确(2/3)的选项,今天主持人开了一扇不可能是答案的门,那如果你本来选的是正确答案,你一换就绝对是错误答案(1/3),你原本选的是错误答案,你一换就绝对是正确答案(2/3)。
以下真相:
3个选项 样本数1百万
3个选项 样本数1百万
4个选项 样本数1百万
以下code:(看得懂的人自然知道哪里断行,由於我是繁体语系的人XD,里面的注释,我就不繁转简了,大家看得懂就好)
clear;clc;
nochange=0; %不改变答对的数量
change=0; %改变答对的数量
imwrong=0; %ㄜ...
testamount=1000000; %样本数
for i=1:testamount
answer=ceil(rand*3); %正确答案
player=ceil(rand*3); %玩家一开始的选择
playerelse=[1:player-1,player+1:3]; %玩家没选到的选项
if player==answer %如果玩家一开始就选对,那就能任意告知剩下的两个其一为非答案
tellplayer=playerelse(ceil(rand*2));
else %如果玩家一开始选错,那就只能告知剩下的两个中不是答案的为非答案
tellplayer=playerelse(playerelse~=answer);
end
tellplayerelse=[1:tellplayer-1,tellplayer+1:3]; %没告知的选项
playerchange=tellplayerelse(tellplayerelse~=player); %玩家改变选择
fprintf('答案:%d 玩家开始选:%d 告知非答案:%d 玩家改变选:%d\n',answer,player,tellplayer,playerchange)
if playerchange==answer
change=change+1;
disp('改变对')
elseif player==answer
nochange=nochange+1;
disp('不改变对')
else
imwrong=imwrong+1;
disp('写程式的人是脑残')
end
end
fprintf('改变答对率:%.6f\n 不改变答对率:%.6f\n 写程式的人是脑残的机率;%.6f\n',change/testamount,nochange/testamount,imwrong/testamount)
-----------------------------------------------------------------------------
clear;clc;
selectamount=input('输入选项数');
nochange=0; %不改变答对的数量
change=0; %改变答对的数量
testamount=1000000; %样本数
for i=1:testamount
answer=ceil(rand*selectamount); %正确答案
player=ceil(rand*selectamount); %玩家一开始的选择
playerelse=[1:player-1,player+1:selectamount]; %玩家没选到的选项
if player==answer %如果玩家一开始就选对,那就能任意告知剩下的其一为非答案
tellplayer=playerelse(ceil(rand*(length(playerelse))));
else %如果玩家一开始选错,那就只能告知剩下的不是答案的为非答案
playerelse=playerelse(playerelse~=answer);
tellplayer=playerelse(ceil(rand*(length(playerelse))));
end
tellplayerelse=[1:tellplayer-1,tellplayer+1:selectamount]; %没告知的选项
tellplayerelse=tellplayerelse(tellplayerelse~=player);
playerchange=tellplayerelse(ceil(rand*(length(tellplayerelse)))); %玩家改变选择
fprintf('答案:%d 玩家开始选:%d 告知非答案:%d 玩家改变选:%d\n',answer,player,tellplayer,playerchange)
if playerchange==answer
change=change+1;
disp('改变对')
elseif player==answer
nochange=nochange+1;
disp('不改变对')
end
end
fprintf('改变答对率:%.6f\n 不改变答对率:%.6f\n',change/testamount,nochange/testamount)