3门问题的简明解释与程序模拟

问题:三扇门,只有一扇门后面有奖品。你随便选择了一扇门。然后主持人打开了另一扇门,里面是空的。他问你"换不换?" 换还是不换的中奖率高?
答案:换的中奖率是2/3,不换的中奖率是1/3。
注意:主持人必定打开空门。他知道哪扇门有奖品。他不会打开你选择的门。

如果选择不换,即忽略主持人,中奖率是1/3。如果选择换,以奖品在0号门后为例:你选0,主持人选1或2,相应地你选2或1,不中奖。你选1,主持人只能选2,你只能选0,中奖。你选2,主持人只能选1,你只能选0,中奖。总结:如果你第一次选的是0,最后不中奖;如果第一次选的是1或2,最后必然换回0,中奖。3选2,中奖概率是2/3。奖品在1号或2号门后的结果一样。把程序里的prize = randint(0, 2)换成prize = 0,1,2中某个固定的数,结果一样。

1 - 不换的中奖率1/3 = 2/3,只是特例。若有10扇门,不换的中奖率是0.1, 换的中奖率不可能是0.9。总共3扇门,主持人选后剩两扇,非此即彼。

一个袋中有三个球,0,1,2,摸一次拿到1的概率是1/3。如果球的编号换成0,1,0,拿到1的概率还是1/3,不是说摸到的球不是0就是1,所以概率是1/2。

门用0,1,2编号是为了便于程序处理:chosen = (chosen + 1) % 3

复制代码
# -*- coding: gbk -*-
from random import randint
def test_randint():
    d = {}; cnt = 0
    for i in range(10000): i = randint(0, 2); d[i] = 1 + d.get(i, 0)
    print(d)
test_randint()
def p(num, den):
    a = float(cnt) / n; b = float(num) / den
    print(a, ' = ' if abs(a - b) < 0.01 else ' != ', num, '/', den, sep='')
cnt = 0; n = 300000
for i in range(n):
    prize = randint(0, 2)
    chosen = randint(0, 2)
    while True:
        host = randint(0, 2)
        if host != prize and host != chosen: break
    old_chosen = chosen
    chosen = (chosen + 1) % 3
    if chosen == host: chosen = (chosen + 1) % 3
    if chosen == prize: cnt += 1
    if chosen == host or chosen == old_chosen: print('WTF!')
p(2, 3)
复制代码

 条件概率 | 生日相同与n门问题

posted @   Fun_with_Words  阅读(549)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫









 和6张牌。

点击右上角即可分享
微信分享提示