1654 巴斯卡—費馬機率論:一場賭局催生的數學#
案發現場#
1654 年,法國。賭徒德梅雷爵士(Chevalier de Méré)寫信給數學家巴斯卡(Blaise Pascal, 1623–1662),提出一個困擾職業賭桌多年的懸案——分賭金問題(problem of points):
兩人對賭,先贏三局者獨得全部賭金。賭到甲勝二局、乙勝一局時,賭局被迫中斷,賭金該怎麼分?按已勝局數 2:1 分?甲會喊冤——他眼看就要贏了。按什麼標準才公平?
德梅雷靠賭桌經驗累積了不少機率直覺(他甚至憑經驗知道「擲一顆骰子四次出現六點」與「擲兩顆骰子二十四次出現雙六」的賠率並不等價,儘管表面比例相同),但直覺無法給出分賭金的原則。一個從古羅馬流傳千年的懸案,終於等到了它的偵查者。
偵查過程#
巴斯卡與圖魯茲的費馬(Pierre de Fermat, 1601–1665)為此展開 1654 年夏天的著名通信。兩人各自獨立破解,思路殊途同歸:
費馬的方法:窮舉。剩餘最多兩局即可分勝負,故共 \(2^2=4\) 種等可能的未來:甲甲、甲乙、乙甲、乙乙——前三種都是甲勝,只有最後一種乙勝。故甲應得賭金的 \(3/4\) 。
巴斯卡的方法:遞迴與期望值。他不窮舉未來,而是問「此刻的處境價值多少」:若再賭一局甲勝,甲得全部(價值 1);若甲敗,成 2:2 平手,各得一半(價值 1/2)。兩種情況各半,故甲此刻的「公道份額」為 \(\frac{1}{2}\times 1 + \frac{1}{2}\times \frac{1}{2} = \frac{3}{4}\) 。
這個加權平均的量,就是期望值(expectation)的誕生。兩人在通信中還解決了擲骰子的點數分配、賭注的公平賠率等問題——機率論在賭桌上誕生,但它的方法第一次讓「不確定」本身成為可以精確計算的對象。
結案報告#
分賭金問題的結案報告,寫成了此後三百年間一整門學科:
- 機率論誕生:1657 年惠更斯據此寫出第一本機率論教材《論賭博中的計算》;伯努利《猜度術》(1713)證明大數法則;帕斯卡本人則在經歷宗教體驗後轉向神學,留下「帕斯卡賭注」——把期望值計算用在了信仰上。
- 實驗誤差理論:觀測數據的隨機誤差成為可計算對象,直通 1801-高斯最小平方法.md 與常態分佈——「數據」從此成為可以評估信賴度的證據。
- 統計力學與資訊論:十九世紀,馬克士威與波茲曼用機率描述億萬分子的混沌運動,把熵變成機率的函數;二十世紀,夏農在 1948-夏農資訊論.md 中把資訊定義為不確定性的消除——機率論成為微觀世界與資訊世界的共同語言。
- 保險精算與現代生活:壽險、年金、醫療統計、品質管制,全建立在期望值之上——賭桌上的數學成為現代社會的算術。
促進鏈分析#
- 實驗⇒數學:德梅雷的賭局(實際問題)催生期望值與機率論——異常的賭桌經驗逼出新的數學。
- 數學⇒理論:機率論成為統計力學的骨架,把熵與熱力學第二定律(1850-克勞修斯第二定律.md)化為機率陳述。
- 數學⇒實驗:機率論支撐誤差理論與統計檢驗,讓一切定量實驗的數據成為可評估的證據(1801-高斯最小平方法.md)。
- 數學⇒技術:期望值成為保險精算、金融定價與通訊糾錯碼(1948-夏農資訊論.md)的設計引擎。
證據與工具#
# 用 Python 重演 1654 年的偵查:分賭金問題與蒙提霍爾問題
from itertools import product
# --- 第一部分:分賭金問題(費馬的窮舉 vs 巴斯卡的期望值)---
# 甲已勝 2 局、乙勝 1 局,先贏 3 局者勝;剩餘最多 2 局
outcomes = list(product(["甲", "乙"], repeat=2)) # 窮舉剩餘兩局
win_A = sum(1 for o in outcomes
if o[0] == "甲" or o[1] == "甲") # 甲再贏任一局即勝
print("--- 分賭金問題 ---")
print(f"剩餘兩局的等可能未來:{outcomes}")
print(f"甲勝的情形:{win_A}/{len(outcomes)} → 甲應得賭金的 {win_A/len(outcomes)}")
# 巴斯卡遞迴:p = 0.5*1 + 0.5*0.5 = 0.75,與窮舉一致
p_recursive = 0.5*1 + 0.5*0.5
assert abs(p_recursive - win_A/len(outcomes)) < 1e-12
# --- 第二部分:蒙提霍爾問題(直覺 vs 機率論的對決)---
import random
def monty_hall(switch: bool, trials=100_000):
win = 0
for _ in range(trials):
car = random.randrange(3) # 車所在的門
pick = random.randrange(3) # 參賽者最初選的門
# 主持人開一扇有山羊、且非參賽者所選的門
host = next(d for d in range(3) if d != car and d != pick)
if switch:
pick = next(d for d in range(3) if d != pick and d != host)
win += (pick == car)
return win / trials
print("\n--- 蒙提霍爾問題(10 萬次模擬)---")
print(f"堅持原選的勝率:{monty_hall(False):.3f}(理論值 1/3)")
print(f"換門的勝率 :{monty_hall(True):.3f}(理論值 2/3)")
# 結論:直覺說「換不換都一樣」,機率論說「換門勝率加倍」——期望值的勝利