在围脖上闲逛,看到死理性派的一篇博文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,看到一个女孩的情况下,两个都是女孩的概率
飞叔:既然有计算机,何必想破头皮算概率呢,模拟就得了