今天無意看到一個源於賽局理論的有趣機率問題 -- 蒙提霍爾問題,亦稱為蒙特霍問題三門問題(英文:Monty Hall problem)。在此我引用維基百科中的部分內容說明之: (以下內容引用自維基百科)

【問題】

  • 參賽者在三扇門中挑選一扇。他並不知道裡面有什麼。
  • 主持人知道每扇門後面有什麼。
  • 主持人必須開啓剩下的其中一扇門,並且必須提供換門的機會。
  • 主持人永遠都會挑一扇有山羊的門。
    • 如果參賽者挑了一扇有山羊的門,主持人必須挑另一扇有山羊的門。
    • 如果參賽者挑了一扇有汽車的門,主持人隨機在另外兩扇門中挑一扇有山羊的門。
  • 參賽者會被問是否保持他的原來選擇,還是轉而選擇剩下的那一道門。

轉換選擇可以增加參賽者的機會嗎?

【解答】

問題的答案是可以:當參賽者轉向另一扇門而不是繼續維持原先的選擇時,贏得汽車的機會將會加倍。

有三種可能的情況,全部都有相等的可能性(1/3):

  • 參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。
  • 參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。
  • 參賽者挑汽車,主持人挑兩頭山羊的任何一頭。轉換將失敗。

在頭兩種情況,參賽者可以透過轉換選擇而贏得汽車。第三種情況是唯一一種參賽者透過保持原來選擇而贏的情況。因為三種情況中有兩種是透過轉換選擇而贏的,所以透過轉換選擇而贏的機率是2/3。

真是詭異的邏輯推論,一下子觸動了茶包射手的敏感神經!! 當主持人剔除了一扇山羊門,兩扇門其中之一有汽車,參賽者的中獎率是1/2,怎麼會因為更換選擇提高中獎率?? 非常違背直覺! 跟擲了九次銅板都是人頭,第10次再擲出人頭的機率一樣,直覺上機率應該只有1/1024,但實際上在那個當下,擲出人頭仍是1/2。仔細一想,這個題目剛好反過來,當下選擇的機率是1/2沒錯,但若原本選山羊換門後就一定中汽車,而總體選到山羊的機率是2/3,所以總體來說換門中汽車的機率也變成2/3。

還是有點難理解? 那就用程式來證明如何? (我試著用LINQ的Single(), Where()讓主持人選門及換門的邏輯更直覺一點,大家比較看看,是否比"if + 亂數 + 陣列"更容易理解。)

using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ThreeDoors
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Game> test = new List<Game>();
            for (int i = 0; i < 1000; i++)
            {
                Game g = new Game();
                Console.WriteLine(
                    "NO:{0:000} 汽車:{1} 初選:{2} 主持人:{3} 更換:{4} " +
                    "不換結果:{5} 更換結果:{6}",
                    i, g.WinIndex, g.PlayerPick, g.HostPick, g.ChangePick,
                    g.ResultWhenNoChange, g.ResultWhenChange);
                test.Add(g);
            }
            Console.WriteLine("不換而嬴得汽車的次數: {0}",
            test.Where(g => g.ResultWhenNoChange == "Car").Count());
            Console.WriteLine("更換後嬴得汽車的次數: {0}",
            test.Where(g => g.ResultWhenChange == "Car").Count());
            Console.Read();
        }
    }
    public class Game
    {
        class Door
        {
            public int Index;
            public string Result;
            public Door(int idx, string result) {
                Index = idx;
                Result= result;
            }
        }
        //門的編號為0, 1, 2
        List<Door> Doors =
            new List<Door>()
            {
                new Door(0, "Goat"), new Door(1, "Goat"), 
                new Door(2, "Goat")
            };
        //汽車所在門的編號
        public int WinIndex = -1;
        //使用者初選編號
        public int PlayerPick = -1;
        //更換選擇後的編號
        public int ChangePick = -1;
        //主持人選取的山羊門編號
        public int HostPick = -1;
        //更換選擇的結果
        public string ResultWhenChange
        {
            get 
            { 
                return Doors
                    .Single(o => o.Index == ChangePick).Result; 
            }
        }
        //維持原來選擇的結果
        public string ResultWhenNoChange
        {
            get
            {
                return Doors
                    .Single(o => o.Index == PlayerPick).Result;
            }
        }
        static Random rnd = new Random();
        
        public Game()
        {
            //亂數選一個門放汽車
            WinIndex = rnd.Next(3);
            Doors.Single(o => o.Index == WinIndex)
                 .Result = "Car";
            //參賽者挑一個門
            PlayerPick = rnd.Next(3);
            //主持人挑山羊門
            //若參賽者未挑中汽車
            if (PlayerPick != WinIndex)
            {
                //找出參賽者未選的另一集山羊
                HostPick = Doors.Single(o =>
                    o.Index != PlayerPick &&
                    o.Result == "Goat").Index;
            }
            else //參賽者挑中汽車
            {
                HostPick =
                Doors.Where(o => o.Result == "Goat")
                    //挑過零個或一個隨機選羊
                .Skip(rnd.Next(2)).First().Index;
            }
            //PlayerPick與HostPick以外的就是結果
            ChangePick = Doors.Single(o =>
                o.Index != PlayerPick &&
                o.Index != HostPick).Index;
        }
    }
}

執行結果:

NO:988 汽車:1 初選:1 主持人:2 更換:0 不換結果:Car 更換結果:Goat
NO:989 汽車:2 初選:0 主持人:1 更換:2 不換結果:Goat 更換結果:Car
NO:990 汽車:2 初選:0 主持人:1 更換:2 不換結果:Goat 更換結果:Car
NO:991 汽車:1 初選:0 主持人:2 更換:1 不換結果:Goat 更換結果:Car
NO:992 汽車:1 初選:0 主持人:2 更換:1 不換結果:Goat 更換結果:Car
NO:993 汽車:2 初選:2 主持人:0 更換:1 不換結果:Car 更換結果:Goat
NO:994 汽車:2 初選:2 主持人:1 更換:0 不換結果:Car 更換結果:Goat
NO:995 汽車:0 初選:0 主持人:1 更換:2 不換結果:Car 更換結果:Goat
NO:996 汽車:1 初選:1 主持人:2 更換:0 不換結果:Car 更換結果:Goat
NO:997 汽車:1 初選:2 主持人:0 更換:1 不換結果:Goat 更換結果:Car
NO:998 汽車:2 初選:2 主持人:0 更換:1 不換結果:Car 更換結果:Goat
NO:999 汽車:2 初選:1 主持人:0 更換:2 不換結果:Goat 更換結果:Car
不換而嬴得汽車的次數: 341
更換後嬴得汽車的次數: 659

故得證! 不過,以上的模擬只是證明"有2/3的換門者最後嬴得汽車",這代表可以透過換門來"提高"中獎率嗎? 我不以為然! 跟丟銅板的例子一樣,整體機率是一回事,當下的機率又是另一回事。當主持人加開山羊門後,換後不換門的中獎機率應該都是1/2才合理!

那先前的計算又要怎麼解釋?

有三種可能的情況,全部都有相等的可能性(1/3):

  • 參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。
  • 參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。
  • 參賽者挑汽車,主持人挑兩頭山羊的任何一頭。轉換將失敗。

我認為這是一個有疑問的陳述,所謂的機率應是"目標組合的數目 除以 所有可能組合的數目",在以上陳述裡卻刻意"河蟹"掉了一部分的事實;事實上應該有四種可能的情況,而不是三種:(經網友Ann Wang指正,四種機率應為1/3, 1/3, 1/6, 1/6)

  • 參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。1/3
  • 參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。 1/3
  • 參賽者挑汽車,主持人挑山羊一號。轉換將失敗。1/6
  • 參賽者挑汽車,主持人挑山羊二號。轉換將失敗。1/6
  • 列舉全部的組合後再重新計算,轉換成功及轉換失敗的機率各半,而非前述的2比1。 依此來看,原先的想法有誤,轉換嬴得汽車的機率是2/3,轉換丟掉汽車的機率是1/3,四種情況的計算結果仍與機率理論主張相符。

    最後,我想到一個說服自己的簡單解釋:
    *如果一閞始就選到汽車(發生機率33%): 留下的門100%是山羊
    *如果一開始選到的是山羊(發生機率66%): 留下的門100%是汽車
    留下門後有汽車的機率等於 100% 減去一開始選到汽車的機率,由於一開始選到汽車的機率只有 33%,所以留下的門後有汽車的機率是 66%。

    因此,我的結論是:

    1. 經由程式模擬證明,有2/3的換門者最後嬴得汽車。
    2. 主持人打開山羊門後,留下來你那個沒選的門,有 66% 的機率後面有汽車無誤。

    Comments

    # by lsk

    其中的說詞,有些都蠻吊詭的 應該說參賽者挑到汽車的機率有1/3 挑到山羊的機率有2/3,如果換門就一定得到汽車 但參賽者怎麼知道一開始挑到的是汽車還是山羊 所以第一次選門後,當下有1/2的機率得到汽車,Yes or No 但總體會有2/3的機率因換門而得到汽車 因為挑到山羊的有2/3

    # by 陳哲峰

    丟銅板的問題,(1)在一開始就決定只丟十次, 跟(2)丟完九次後可以決定要不要再丟第十次是不一樣的問題。 在問題(1)連丟九次銅板都是人頭機率是1/512,所以雖然第10次再擲出人頭的單次機率是1/2,但整體發生的機率卻是1/1024。 三門的問題也是取決於一開始的決定,如果一開始就決定不理主持人一意孤行,猜中機率只有三分之一。 如果一開始就決定不管第一次的選擇,那只有當我第一次就選到汽車,我才會得不到汽車。 做人,除非已經偷看到答案,否則不用堅持; 如果真的知道自己只能用猜的,那麼仔細觀察已經知道答案之人的反應是可以增加自己猜中的機率。

    # by 小中中

    其實主持人被規定要開啟一扇內有山羊的門,這就已經限定參賽者選到汽車的機率為 1/2 了,因為未開啟的門是一扇有山羊,另一扇有汽車。而參賽者永遠不會去開啟主持人開的那扇門...! 對參賽者而言,第一次選擇只是假動作,因為真正的選擇是在第二次,也就是說在第一次選擇結果的條件下,第二次選到汽車的條件機率,跟忽略第一次選擇,直接來看第二次選擇的機率是一樣的,也就是說兩個事件是獨立的。如果把第一次選擇的過程跟所造成的結果完整剃除掉,第二次換門選到汽車的機率是 1/2,不換門選到汽車的機率也是 1/2,完全沒有比較高......

    # by 陳哲峰

    會是1/2,是因為"一開始就決定"等到第二次選門時由擲銅板決定。 所以 "一開始就決定" 堅持不換,選到汽車是1/3; "一開始就決定" 第二次換門由銅板決定,選到汽車是1/2; "一開始就決定" 觀察主持人所開的門,不選第一次自己選的,也不選主持人所開的,則選到汽車是2/3。 聰明的你,你是否還是決定不觀察別人?

    # by sam319

    這部電影裡有提到這個問題 http://tw.movie.yahoo.com/movieinfo_main.html/id=2550 我看了三次電影也還是不太明白 程度太差了==" 不過電影還不錯 你可以去找來看看唷~

    # by Wolke

    理論上的機率是這樣, 但幾個人能壓住有功力的主持人, 以假亂真的一些主持技巧, 讓你選到山羊? 應該要加主持人送出汽車後,下一集就不用來了的條件! 哈!

    # by Ark

    真是~暗陰羊

    # by Ike

    我同意 lsk 的說法, 真正決定的機率的,其實是第一次選擇, 因為選羊的機率是 2/3, 所以選羊換門得車的機率就是 2/3,(不換門得車機率是 1/3) 而問題是「轉換選擇可以增加參賽者的機會嗎?」 答案應該為:可以! 若問題是「參賽者得到車的機率」那才會是 1/2,因為這是參賽者自己的選擇。

    # by Jeffrey

    <P>to lke, 試著為我所認知的"提高"中獎率下個定義--&gt;不管參賽者第一次選羊或選車,若透過換門能讓原本中獎者仍保有獎品、並讓原本未中獎者也能中獎,則換門才有"提高"中獎率的效果。換門充其量只是像個切換中奬或落敗命運的開關,我認為並不算增加嬴率。</P> <P>假設你手中握緊了一枚不知正反面的硬幣(多開了羊門後,參賽者不是選車就是選羊,就權充正反面),跟你對賭的人說,你可以選擇掌心朝上或掌心朝下開牌,人頭朝上算嬴... 掌心朝上或朝下會逆轉輸嬴,但都沒有"提高中獎率"的效果。<BR>不過,若把題目解釋成"轉換選擇是否能提高參賽者的整體中獎機會",我認為答案是肯定的。</P>

    # by Robert

    這個是很有名的統計Puzzle, 叫作Monty Hall Problem. 機率的確不是1/2, 我想可以利用擴充門的數量來思考, 這樣可以繞過那個盲點. Wiki上的資料就很詳細, 大家可以參考看看: http://en.wikipedia.org/wiki/Monty_Hall_problem

    # by Ike

    To Jeffrey, 題目裡需留意的是「是否換門」並非是一個選項,而是對照的兩方。 若最後還可以決定「要不要換門」,這樣的機率就會是 1/2。 但若為對照的兩方而非選項,「要換門(A方)」的得獎率將會大於「不換門(B方)」。 所以要確定問題裡… 「轉換選擇可以增加參賽者的機會嗎?」 的「轉換選擇」是否解釋為「要換門」。 我的解讀會是… 「轉換選擇」=「要換門」,因此我同意「換門可以增加參賽者的機會」(即對照組的A方)

    # by Ike

    剛看了 Robert 的資料,Wiki 裡的題目比較清楚「…問題是:換另一扇門會否增加參賽者贏得汽車的機會率?…」 http://zh.wikipedia.org/zh-tw/蒙提霍爾問題

    # by Jeffrey

    to lke, 我同意你的觀點,原始題目看來是以第三者立場觀察,換門可以增加參賽者的機會這點是肯定的。我所推論不能提高中獎率的說法,適用於參賽者做抉擇的當下。

    # by ben

    第一次有三個門可以選,選中車的機會是1/3,小於一半。 換句話說第一次選到羊的機會比較大,大於一半。 第二次有兩個門可以選,似乎選中車的機會是1/2。 但是這兩個門裡面,有一個是"比較有可能是羊"的門,這樣兩個門的機率就不相等了。 這時候放棄掉"比較"可能是羊的那一個門,就會比較容易得到車。 簡單的說,在1/3的選擇結果上做改變,由選錯改成選對的機會,大於由選對改成選錯,因此改變是比較有利的。 可能有人會覺得第一次不是對就是錯,那應該是1/2吧?換或不換也是1/2,所以不會改變。但是按這個邏輯來看,明天會世界末日,跟明天不會世界末日,也能說是各有50%的機會。

    # by Solomon

    未公佈前: 機率是1/3 公佈後: 因為主持人剔除了一個選項, 機率變成1/2 這裡的機率是:未公佈答案前,答對的機率 如果不換, 機率就是公佈前的機率, 不管主持人開出多少門 中車的機率仍然是1/3 但是公佈前選羊的機率是2/3, 剔除掉一羊後 "換答案可以得到車"的機率不是應該就是"當初選羊的機率"嗎? 好像又繞回去了,呵呵

    # by Ann Wang

    版大說的沒錯 是有四種可能性如下 # 參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。 # 參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。 # 參賽者挑汽車,主持人挑山羊一號。轉換將失敗。 # 參賽者挑汽車,主持人挑山羊二號。轉換將失敗。 但是 每一種可能性的機率不同 # 參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。 1/3 # 參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。 1/3 # 參賽者挑汽車,主持人挑山羊一號。轉換將失敗。 (1/6) # 參賽者挑汽車,主持人挑山羊二號。轉換將失敗。 (1/6) 版大認為被河蟹掉的部分 其實應該是已經加起來為1/3了吧 畢竟中獎率一開始為1/3 如果一開始就選對了 主持人任選哪個門開啟 又是1/2的機率 所以(1/3)*(1/2)=1/6

    # by iamshiao

    我自己也寫過程式論證這個問題,然後被結果迷惑,看到您的例舉令我茅塞頓開阿!

    # by Jeffrey

    泛科學今天剛好講到「 蒙提霍爾問題」:http://pansci.asia/archives/125878 重想一次,總算找到說服自己的簡單解釋,己更新於內文。 to Ann Wang,感謝指正,四種情況說的機率如你所說,是1/3, 1/3, 1/6, 1/6才對。

    Post a comment