天天看點

三門問題之python解答

 最近,在網上看到一個有趣的三門問題,遂準備用python來娛樂下。下邊是三門問題的介紹。

  三門問題(Monty Hall problem)亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大緻出自美國的電視遊戲節目 Let's Make a Deal。問題名字來自該節目的主持人蒙提·霍爾(Monty Hall)。

  參賽者會看見三扇關閉了的門,其中一扇的後面有一輛汽車,選中後面有車的那扇門可赢得該汽車,另外兩扇門後面則各藏有一隻山羊。當參賽者標明了一扇門,但未去開啟它的時候,節目主持人開啟剩下兩扇門的其中一扇,露出其中一隻山羊。主持人其後會問參賽者要不要換另一扇仍然關上的門。

問題是:換另一扇門會否增加參賽者赢得汽車的機率?

要求:

通過程式模拟三門問題,并重複進行大量測試,統計換門與不換門的情況下,赢得汽車的機率。

下邊是解答的代碼:

<code>#!/usr/bin/python</code>

<code>#coding:utf-8</code>

<code>total</code><code>=</code><code>100000</code>

<code>a</code><code>=</code><code>b</code><code>=</code><code>c</code><code>=</code><code>d</code><code>=</code><code>e</code><code>=</code><code>f</code><code>=</code><code>0.00</code>

<code>x</code><code>=</code><code>0</code>

<code>from</code> <code>random </code><code>import</code> <code>randint</code>

<code>list</code><code>=</code><code>[</code><code>"sheep1"</code><code>,</code><code>"sheep2"</code><code>,</code><code>"car"</code><code>]</code>

<code>tuple</code><code>=</code><code>(</code><code>"yes"</code><code>,</code><code>"no"</code><code>)</code>

<code>while</code> <code>x!</code><code>=</code><code>total:</code>

<code>   </code><code>t</code><code>=</code><code>randint(</code><code>0</code><code>,</code><code>2</code><code>)</code>

<code>   </code><code>i</code><code>=</code><code>randint(</code><code>0</code><code>,</code><code>1</code><code>)</code>

<code>#   print list[t],tuple[i] </code>

<code>   </code><code>if</code> <code>list</code><code>[t]</code><code>=</code><code>=</code><code>"car"</code><code>:</code>

<code>        </code><code>if</code> <code>tuple</code><code>[i]</code><code>=</code><code>=</code><code>"yes"</code><code>:</code>

<code>         </code><code>a</code><code>+</code><code>=</code><code>1</code>

<code>        </code><code>else</code><code>:</code>

<code>         </code><code>b</code><code>+</code><code>=</code><code>1</code>

<code>   </code><code>elif</code> <code>list</code><code>[t]</code><code>=</code><code>=</code><code>"sheep1"</code><code>:</code>

<code>if</code> <code>tuple</code><code>[i]</code><code>=</code><code>=</code><code>"yes"</code><code>:</code>

<code>           </code><code>c</code><code>+</code><code>=</code><code>1</code>

<code>           </code><code>d</code><code>+</code><code>=</code><code>1</code>

<code>   </code><code>elif</code> <code>list</code><code>[t]</code><code>=</code><code>=</code><code>"sheep2"</code><code>:</code>

<code>           </code><code>e</code><code>+</code><code>=</code><code>1</code>

<code>           </code><code>f</code><code>+</code><code>=</code><code>1</code>

<code>   </code><code>x</code><code>+</code><code>=</code><code>1</code>

<code>print</code> <code>"總次數為%d"</code><code>%</code><code>(total)</code>

<code>print</code> <code>"換%d"</code> <code>%</code><code>(a</code><code>+</code><code>c</code><code>+</code><code>e),</code><code>"不換%d"</code> <code>%</code><code>(b</code><code>+</code><code>d</code><code>+</code><code>f)</code>

<code>print</code> <code>"不換赢的機率為%.2f%%"</code><code>%</code><code>(b</code><code>/</code><code>(c</code><code>+</code><code>b</code><code>+</code><code>e)</code><code>*</code><code>100</code><code>)</code>

<code>print</code> <code>"換赢的機率為%.2f%%"</code><code>%</code><code>((c</code><code>+</code><code>e)</code><code>/</code><code>(c</code><code>+</code><code>b</code><code>+</code><code>e)</code><code>*</code><code>100</code><code>)</code>

下圖運作結果:

<a href="https://s4.51cto.com/wyfs02/M02/8E/36/wKiom1i4z9qDqEpZAAA28hBwHZg264.png" target="_blank"></a>

結論: 由此可以看出,換門赢的機率大約是不換赢的機率的2倍,是以換門能增加參賽者赢得汽車的機率。

本文轉自 goldfishe 51CTO部落格,原文連結:http://blog.51cto.com/jack88/1902857