概率的定义
概率的数学定义
- 「明天下雨的概率是 30%」这样的结论究竟有没有意义?
- 「1192 年 6 月 6 日某地曾下过雨的概率」—— 讨论过去的事件,既成事实与概率何关联?
- 数学的做法:暂且不管问题是否有意义,先抽象地定义概率的概念
- 概率的具体定义是「满足若干条件的三元组(Ω, F, P)」
- 目标:把概率的直观印象与抽象定义统合起来
三扇门(蒙提霍尔问题)
题目
- 三扇门,只有一扇后面是高档豪车,另两扇门后是山羊
- 挑战者选一扇,主持人(知道答案)打开没被选中的错误门,露出一只山羊
- 主持人问:「是否要重新选择?」
- 重选、坚持、还是两者没区别?
正确答案与常见错误
- 第一次选择后,有 1/3 的概率正确,2/3 的概率不正确
- 如果第一次选对,重选必错;如果第一次选错,重选必对
- 所以「第一次选错」的概率 = 「重选后正确」的概率 = 2/3
- 重选更加有利
常见的草率见解
- 游戏开始时三种可能,各 1/3
- 假设挑战者选门 3,主持人打开门 1,于是门 1 不再成立,只剩两种可能
- 「门 2 是正确答案(1/2)、门 3 是正确答案(1/2)」
- 于是重选门 2 和继续选门 3 概率相同
- 得到了这个错误结论的人,很难被说服
以飞艇视角表述
放弃骰子
- 概率是很抽象的概念,仅凭直觉判断很难理解本质
- 换一种视角,把它转成可以实际衡量的形式
- 放弃使用骰子 —— 这个思维模式的转换就是现代数学中概率定义的基石
360 个游戏会场
- 在一个巨大的广场中分设 360 个会场,每个会场同时进行游戏
- 你乘坐在飞艇中,从上空俯视
- 与之前不同:每个会场都准备了剧本,主持人和挑战者按剧本表演,所有行动事先确定
- 剧本设定:
- 120 个会场的门 1 是正确答案,120 个门 2,120 个门 3
- 门 1 正确的 120 个会场中,40 个要求挑战者选门 1,40 个选门 2,40 个选门 3
- 门 2、门 3 正确的会场同样如此
主持人打开哪扇门
挑战者选错(×)时,剩下的两扇门一正确一错误,主持人只能开错误的那扇
挑战者选对(○)时,剩下两扇门各有一半概率被打开
统计下来,每个「主持人开哪扇门」的格子里都有 20 个 ○ 和 40 个 ×:
主持人开\挑战者选 选门 1 选门 2 选门 3 开门 1 — ○20 / ×40 ○20 / ×40 开门 2 ○20 / ×40 — ○20 / ×40 开门 3 ○20 / ×40 ○20 / ×40 — 从飞艇上数下来:
- 坚持最初的选择:○ 120 个会场正确,× 240 个错误
- 改选其他门:× 的 240 个会场得到正确答案,○ 的 120 个最终选错
改选更妥当,只要统计数量即可,不存在歧义
还能数出「轻率结论」错了几处:挑战者选门 3 而主持人打开门 1 的会场共 60 个,其中门 3 正确的只有 20 个 —— 概率并非各占一半
为什么不用 18 个会场
- 确实够用,但更多会场有助于理解后续内容
- 飞艇视角的四个要点:
- 准备大量会场,每个会场同时进行游戏
- 各会场中所有人仅按事先确定的剧本行动
- 剧本设定合理时,所有会场的结果能完美模拟原本的事件发生概率
- 从飞艇上俯瞰并统计会场数量,就能明确判断结论正误
- 抽象的概念被转换成了具体的统计问题
三元组(Ω, F, P)—— 上帝视角
从会场到世界
- 在飞艇上俯瞰各会场不同角色的行动,这大概就是上帝眼中的世界
- 平面上的每一点都是一个不同的世界,每个世界都有银河系、地球、上面生活着人
- 骰子在一个世界中的结果为 1,在另一个世界中可能是 5
- 每个世界都预先准备了专用剧本,记录从古至今乃至未来发生的所有事件
- 对某个特定的世界来说,所有结果都已确定,不存在任何随机事件
用转盘还原随机性
准备一个写有 1 至 360 的巨大转盘
转动后停在 124 号,就观察第 124 个会场
虽然准备了 360 个会场,但只观察其中一个
从观察者角度看,门 1 正确的概率 = 120/360 = 1/3,门 2、门 3 同样是 1/3
与掷骰子决定没有区别 —— 转换后仍能给出概率形式的解释
用代码验证蒙提霍尔的两种算法
#ruby
# 枚举 360 个会场的剧本,统计坚持 vs 改选
total = 360
stay_win = switch_win = 0
(1..total).each do |i|
# 正确答案的门:每 120 个会场轮换
correct = ((i - 1) / 120) + 1 # 1, 2, 3 各 120 个
# 挑战者的选择:每 40 个会场轮换
choice = ((i - 1) / 40) % 3 + 1 # 1, 2, 3 各 120 个
# 主持人打开一扇错误的门
opened = ([1, 2, 3] - [correct, choice]).sample
other = ([1, 2, 3] - [choice, opened]).first # 剩下的另一扇
if choice == correct
stay_win += 1
switch_win += 1 if other == correct # 选对时改选必错
else
switch_win += 1 # 选错时改选必对
end
end
puts "坚持原选正确: #{stay_win}/#{total} (#{(stay_win.to_f/total*100).round(2)}%)"
puts "改选后正确: #{switch_win}/#{total} (#{(switch_win.to_f/total*100).round(2)}%)"
# 坚持原选正确: 120/360 (33.33%)
# 改选后正确: 240/360 (66.67%)