看见一个女孩 vs 有一个女孩

在围脖上闲逛,看到死理性派的一篇博文http://www.guokr.com/article/60677/,其中涉及了一个很古老也很有迷惑性的概率问题

原文:

一位母亲有两个孩子,有人问母亲的朋友A,两个孩子都是女孩吗?这位朋友说:“我不清楚,但有一个是女孩”。母亲的另一位朋友B说:“我上次去她家,看到一个女孩”。朋友A听到,表示不屑:“这和我说的不是一样的吗”。
看起来这两个信息没有差别,但它们真的是等同的吗?
答案是:不同的。由A给出的信息可以推出两个孩子全是女孩的概率是1/3,而由B则是1/2。

文章后面跟贴无数,有很多依然陷在排列组合的陷阱中。有人试图用模拟数据来证明文章的观点是错的,可是,既然要用模拟数据来说明问题,那么,拥有正真的模拟是很重要的。虽然概率论对我来说已经有审美疲劳,但是花几分钟写几行代码来实现这个模拟不算麻烦。

rand = new Random()
def child = { rand.nextInt() % 2 } // 1: Girl; 0: Boy
def hasOneGirl = { it[0] || it[1] } //两个小孩中任意一个是女孩则返回 true
def meetOneGirl = { it[child()] } // 随机遇到一个小孩,如果是女孩则返回 1
def both = { it[0] && it[1] } // 两个都是女孩

ttl1 = 0 //有一个女孩的次数
ttl2 = 0 //遇到一个女孩的次数
allGirls = 0
rpt = 100000 //模拟次数

rpt.times {
    def children = [child(), child()]
    if(hasOneGirl(children)) ttl1++
    if(meetOneGirl(children)) ttl2++
    if(both(children)) allGirls++
}

println ttl1 / rpt //0.75,至少有一个女孩的总概率
println ttl2 / rpt //0.50,看到一个女孩的总概率
println allGirls / ttl1 //0.33,知道至少有一个女孩的情况下,两个都是女孩的概率
println allGirls / ttl2 //0.50,看到一个女孩的情况下,两个都是女孩的概率

飞叔:既然有计算机,何必想破头皮算概率呢,模拟就得了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值