Skip to content

Commit

Permalink
add inclusive-exclusive example
Browse files Browse the repository at this point in the history
  • Loading branch information
Ye Yuan committed Nov 27, 2023
1 parent 6e73839 commit 039eef8
Showing 1 changed file with 41 additions and 17 deletions.
58 changes: 41 additions & 17 deletions docs/mathematics/probability/exercises.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,7 @@

本文收集一些经典的概率问题。

## 例1: 错排问题

> 假设有 N 位男士参加舞会,所有人都将帽子扔到房间中央混在一起,然后每人再随机拿一顶帽子,所有人都拿到别人帽子的概率是多少?
该题并不能简单利用排列组合或者条件概率求解。可以有两种思路解答,即:

1. 容斥恒等式(inclusion-exclusion identity)
2. 得出递推公式

### 容斥恒等式
## 容斥恒等式(inclusion-exclusion identity)

容斥恒等式用于解决多个相交集合取并集的问题。它的数学定义是:

Expand All @@ -25,18 +16,24 @@ $$ P(E_1 \cup E_2 \cup \cdots \cup E_n) = \sum_{i=1}^n P(E_i) - \sum_{i_1 < i_2}

图形中的数字是该区域参与计数的次数,如果我们需要取并集,期望能让每个区域只被计数一次。

在本例的场景下,我们设事件 $E_i$ 为 __共有 i 个人恰好拿到自己的帽子__。注意,这个定义 __并未要求其他人不能拿到自己帽子__。我们只要算出 i = 1,2,……,N 的并集概率,再用 1.0 减去这个值,就得出了没有人拿到自己帽子的概率。
### 例题

> 例 1: 假设有 N 位男士参加舞会,所有人都将帽子扔到房间中央混在一起,然后每人再随机拿一顶帽子,所有人都拿到别人帽子的概率是多少?
我们通过排列组合可以简单得到:
该题并不能简单利用排列组合或者条件概率求解,需要利用容斥恒等式。

$$ E_i = \frac{C_{N}^{i} (N-i-1)!}{N!} = \frac{1}{i!} $$
在本例的场景下,我们设事件 $E_i$ 为 __第 i 个人恰好拿到自己的帽子__。注意,这个定义 __并未要求其他人不能拿到自己帽子__。我们只要利用容斥恒等式算出有任一个人拿对帽子的概率,再用 1.0 减去这个值,就得出了没有人拿到自己帽子的概率。但是,我们并不直接用 $E_i$,而是用 k 个人拿对自己帽子的概率进行计算。即直接得出每一个加减项的值。

这里有个似乎有点反直觉的结论:$E_1 = 1.0$。这个结论是因为我们重复计算了概率,即,这个 $E_1$ 本身与其他 $E_n$ 是有交集的。
我们通过排列组合可以得到 __至少 k 个人拿对自己帽子__ 的概率:

$$ a_k = \sum P(E_{i_1}E_{i_2}\cdots E_{i_k}) = \frac{C_{N}^{k} (N-k-1)!}{N!} = \frac{1}{k!} $$

这里有个似乎有点反直觉的结论:$a_1 = 1.0$。这个结论是因为我们重复计算了概率,即,这个 $a_1$ 本身与其他 $a_n$ 是有交集的。

代入容斥恒等式可以得到:

$$\begin{align}
P(E_1 \cup E_2 \cup \cdots \cup E_N) &= \sum_{i=1}^{N} (-1)^{i+1} \frac{1}{i!} \\
P(E_1 \cup E_2 \cup \cdots \cup E_N) &= \sum_{k=1}^{N} (-1)^{k+1} \frac{1}{k!} \\
&= 1.0 - \frac{1}{2!} + \frac{1}{3!} - \cdots + (-1)^{N+1} \frac{1}{N!}
\end{align}$$

Expand All @@ -50,6 +47,33 @@ $$ e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}$$

当 N 足够大的时候,该式趋近于 $e^{-1} \approx 0.3679$。

### 递推解法

若不知道容斥不等式,我们也可以通过找到递推关系得到同样的结论。
> 例 2: N 对夫妇随机坐成一圈,计算所有妻子都不坐在丈夫身边的概率
N 对夫妇坐成随机坐一共有 $2N!$ 种排列方式,由于坐成 __一圈__,由于圆圈的对称性,初始位置其实选哪里都一样,还需要除以 $2N$,实际有 $(2N-1)!$ 种排列。

同例题1,我们直接得出每一个加减项的概率。设 __至少 k 对夫妇坐在一起__ 的概率是 $a_k$。其本质是从 N 对夫妇种选取 k 对,每对夫妇视作一个整体来安排位置,类似于只有 $(2N-k)$ 个人的情况。一共有 $(2N - k - 1)!$ 种排列方式,还需考虑,这 k 对夫妇两两可以交换,还需要乘以 $2^k$,得到至少 k 对夫妇坐一起的概率是:

$$\begin{align}
a_k &= \frac{2^k C_{N}^k (2N - 1 - k)!}{(2N - 1)!}
\end{align}$$

利用容斥恒等式,得到 0 对夫妇坐一起的概率为:

$$\begin{align}
P &= 1.0 - \sum_{k=1}^N (-1)^{k+1} a_k \\
&= 1.0 + \sum_{k=1}^N \frac{(-2)^k C_{N}^k (2N - 1 - k)!}{(2N - 1)!}
\end{align}$$

```py
import math

def calculate_prob(N: int):
p = 1.0
for k in range(1, N + 1):
c_n_k = math.factorial(N) / math.factorial(N - k) / math.factorial(k)
p += math.pow(-2, k) * math.factorial(2 * N - 1 - k) / math.factorial(2 * N - 1) * c_n_k
return p
```

将 $N=10$ 输入上面程序得到 0.3395,与书本答案相同。

0 comments on commit 039eef8

Please sign in to comment.