virusdefender's blog ʕ•ᴥ•ʔ

概率论几个有意思的模型

问题:袋子中有a个黑球,b个白球,现在一只只的摸出来,求第k次摸出黑球的概率。(a ≤ k ≤ a + b)

本题有两个解法,首先考虑是有次序的,也就是排列方法,另一个就是组合解法。

排列方法的样本空间就是对a+b个球进行了全排列,也就是$(a+b)!$,然后填充第k个位置,选一个黑球,有a个选择,然后就是对(a+b-1)的位置放球,有(a+b-1)!种方法。所以得到

$$P = \frac{a × (a + b - 1)!}{(a + b)!} = \frac{a}{a + b}$$

第二种解法就是认为全部的球就两部分,黑的和白的,认为同种颜色的球之间没有区别。先把黑球放好的话,有$C_{a + b}^{a}$种方法。这个事情做完了,剩下的都是白球了。有利场合就是$C_{a + b - 1}^{a - 1}$种。所以

$$P=\frac{C_{a + b - 1}^{a - 1}}{C_{a + b}^{a}}=\frac{a}{a + b}$$

这样的话,最后的结果很重要,结果和k是没有关系的,最终的概率都是一样的,这个也是抽签的模型。这个证明显示抽签的前后顺序是不影响结果的。


现在有n个球,每个球都有相同的概率$\frac{1}{n}$落到N个格子里面(N大于等于n)的每一个格子中,求

  1. 某指定的n个格子中各有一个球的概率P(A)
  2. 任何n个格子中各有一个球的概率P(B)

要注意的是一个格子中可以放多个球。

第一问是先在N个格子中选出n个进行有重复的排列,样本空间就是$N^{n}$,比如第一个有N种方法,第二次还是N个,以后还是。 因为已经指定了n个格子,相当于n个球进行了全排列,有利场合就是$n!$。

第二问因为n个格子是任意的,首先要挑出n个格子,然后对n个球进行全排列。有利场合就是$C_{N}^{n} × n!$。结果是

$$P(B) = \frac{C_{N}^{n} × n!}{N^{n}}=\frac{N!}{N^{n}(N - n)!}$$

实际应用一下,有n个人(n < 365),每个人的生日都不一样的概率就可以套用第二问,每个格子都有一个人,而且只有一个人。n个人中至少两个人生日相同的概率就可以使用1 - P(B)


蒙提霍尔问题

问题详情参考 http://wiki.mbalib.com/wiki/%E4%B8%89%E9%97%A8%E9%97%AE%E9%A2%98

使用Python模拟就好了

 1# coding=utf-8
 2import random
 3
 4
 5# 不改变选择
 6def do_not_change():
 7    prize = ["goat", "goat", "car"]
 8    random.shuffle(prize)
 9    return prize[random.randint(0, 2)] == "car"
10
11
12# 不确定改不改变
13def random_selection():
14    # 不确定改不改变的话,也就是在除去主持人打开的门之后再随机选择一个
15    prize = ["goat", "car"]
16    random.shuffle(prize)
17    return prize[random.randint(0, 1)] == "car"
18
19
20# 改变选择
21def change():
22    prize = ["goat", "goat", "car"]
23    random.shuffle(prize)
24    choice = random.randint(0, 2)
25    prize.pop(choice)
26    for i in [0, 1]:
27        # 主持人选择山羊
28        if prize[i] == "goat":
29            prize.pop(i)
30            break
31    # 选择最后一个
32    return prize[0] == "car"
33
34count = 0
35for i in range(100000):
36    if do_not_change():
37        count += 1
38
39print u"不改变选择", count / 100000.0
40
41count = 0
42for i in range(100000):
43    if random_selection():
44        count += 1
45print u"不确定改不改变选择", count / 100000.0
46
47count = 0
48for i in range(100000):
49    if change():
50        count += 1
51print u"改变选择", count / 100000.0
52
53"""
54最终结果
55不改变选择 0.33098
56不确定改不改变选择 0.50006
57改变选择 0.6637
58"""

提交评论 | 微信打赏 | 转载必须注明原文链接

#其他