1990年,NBC電視台的 Let's make a deal節目中主持人讓來賓上台猜獎,獎品是一輛汽車,台上有三扇關著的門,汽車藏在其中一扇門後,其他兩扇門後面是一隻山羊,為了製造節目的效果和高潮,在你選好門之後,主持人暫不開門,由於他知道汽車在哪扇門後面,所以主持人就在你沒有選到的兩扇門中,選一扇有山羊的門打開,然後主持人就問你:「您要改變您的選擇嗎?」
你可以堅持原來的選擇,也可以改選另一扇門
這個問題其實非常簡單,但是身邊還是有人認為說換不換機率相等,加上今天無聊,就用Matlab來證明,換比不換答對率高。
至於到底為什麼換比不換好,我的方向是:有三個選項,有可能選到正確(1/3)與不正確(2/3)的選項,今天主持人開了一扇不可能是答案的門,那如果你本來選的是正確答案,你一換就絕對是錯誤答案(1/3),你原本選的是錯誤答案,你一換就絕對是正確答案(2/3)。
以下真相:
3個選項 樣本數1百萬


3個選項 樣本數1百萬


4個選項 樣本數1百萬


以下code:(看得懂的人自然知道哪裡斷行)
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)
