作者:Thomas Hanning,原文鏈接,原文日期:2015-09-27
譯者:SergioChan;校對:numbbbbb;定稿:numbbbbb
三門問題是一個超級讓人摸不著頭腦的概率問題。我們會在 Swift Playground 里來演示它的解法,而不是通過枯燥的數學解釋。
三門問題
這個問題的核心很簡單。在 1990 年的Parade雜志中是這么解釋的:
假設你正在參加一個游戲節(jié)目,需要在三扇門中選擇一扇。其中一扇后面有一輛車,其余兩扇后面則是羊。你選擇了一扇門,假設是 1 號門,主持人知道門后面是什么,他開啟了另一扇后面有羊的門,假設是3號門。然后他問你:“你想選擇 2 號門嗎?”這時候你改變決策是有利的嗎?
實際上,結果是有利的。如果你選擇另外一扇門,你就有2/3的概率贏得汽車。相反,如果你不改變你的選擇,贏得汽車的概率就只有 1/3。當然你可以從數學的角度去證明,但是這里我們希望驗證一下。
算法
算法很簡單。首先,你選擇一扇門。然后主持人打開一扇后面有羊的門。如果你的第一次選擇就選中了有車的門,他就要在剩下兩扇門中隨機選擇一扇開啟。如果你的第一次選擇選中的是有羊的門,他就要把剩下一扇也是羊的門打開。最后,你是否改變選擇取決于你采取的策略。
Playground
我們來編寫一個簡單的 Playground 程序。我們會對每種選擇策略執(zhí)行 100000 次測試來得出大致的概率。
import UIKit
enum Strategy {
case Change
case Stay
}
func play(strategy:Strategy,repeats:Int) -> Int {
var wins = 0
for _ in 0..<repeats {
let car = Int(arc4random_uniform(3))
var playerChoice = Int(arc4random_uniform(3))
if strategy == Strategy.Change {
if playerChoice == car {
var remainingDoors = [0,1,2]
remainingDoors.removeAtIndex(playerChoice)
playerChoice = remainingDoors[Int(arc4random_uniform(2))]
} else {
playerChoice = car
}
}
if car == playerChoice {
wins++
}
}
return wins
}
var repeats = 100000
var winsStrategyChange = play(.Change, repeats: repeats)
var winsStrategyStay = play(.Stay, repeats: repeats)
var quoteStrategyChange = Double(winsStrategyChange) / Double(repeats)
var quoteStrategyStay = Double(winsStrategyStay) / Double(repeats)
結果
每次運行這個 Playground 得到的結果都不完全相同,但是都很接近的。例如,其中一次結果是:
改變選擇且贏得汽車的次數: 66,461不改變選擇且贏得汽車的次數: 33,509改變選擇且贏得汽車的概率: 0,66461不改變選擇且贏得汽車的概率: 0,33509
結果正如理論所預計的那樣。如果你不改變你的選擇,你就只有百分之 33 的概率贏得汽車。如果你改變了你的選擇,這個概率就上升到了百分之 66。
結論
在 Playground 中做實驗是十分有趣的。在這種情況下,我們可以驗證那些乍一看摸不著頭腦的理論。
引用
圖片: @ Lim ChewHow / shutterstock.com
維基百科: Monty Hall Problem