如果把 4 只鸭子扔进一个圆形池塘里自由游弋,它们碰巧全都挤在“同一个半圆里”的概率有多大?
初看这道流传在技术面试和数学竞赛中的趣味题,不少人的第一反应是无从下手:圆形池塘是二维连续空间,半圆的朝向有无穷多个,难道要列出二重积分去算点集测度吗?
数学的精妙之处恰恰在于:巧妙的坐标变换与对称性降维,往往能将看似令人头秃的连续积分,瞬间化简为小学算术。
本文带大家从圆周角降维切入,不仅推导出通项公式,还会顺手将这群“鸭子”赶向高维球面的温德尔定理(Wendel’s Theorem)。
1. 问题背景与描述
问题描述:
一个圆形的池塘中,有 $4$ 只鸭子在其中随机游泳。假设鸭子可以被视作质点,且它们在池塘中的位置是完全独立且均匀分布的。
问题:这 $4$ 只鸭子同时落在同一个半圆内的概率是多少?
| 几何要素 | 抽象数学表示 | 概率与几何含义 |
|---|---|---|
| 基准顶点 | 随机选定第 1 只鸭子 $\theta_1$ | 作为顺时针半圆的起始锚点 |
| 有效半圆区域 | 区间 $[\theta_1, \theta_1 + \pi)$ | 跨度为 $\pi$($180^\circ$)的半圆圆心角范围 |
| 事件成立充要条件 | 其余 $3$ 只鸭子均落在该区间内 | 每只独立落入概率为 $\frac{1}{2}$,联合概率为 $(\frac{1}{2})^3 = \frac{1}{8}$ |
2. 几何概率推导
2.1 降维与角度抽象
首先,从圆心向每只鸭子做一条射线。池塘里的任意一个半圆区域,在圆心角上对应的是一个跨度为 $\pi$($180^\circ$)的扇形。因此,二维池塘中的位置分布问题,等价于圆周上 $4$ 个随机点的圆心角分布问题。
设圆周的角度范围为 $[0, 2\pi)$,$4$ 只鸭子的角度分别为 $\theta_1, \theta_2, \theta_3, \theta_4$,且独立均匀分布于 $[0, 2\pi)$。
2.2 确定基准半圆
判断 $N$ 个点是否位于同一个半圆内,关键在于找到包含所有点的最小弧长是否 $\le \pi$。
我们可以任选一个点作为顺时针半圆的起始边界:
- 选取第 1 只鸭子为基准点,以它为顺时针起点画出一个半圆(跨度 $[\theta_1, \theta_1 + \pi)$);
- 其余 $3$ 只鸭子独立落在该半圆内的概率为: $$ P = \left(\frac{1}{2}\right)^3 = \frac{1}{8} $$
- 由于半圆是由顺时针方向的第 1 只鸭子唯一确定的,以不同鸭子作为起点所构成的事件是两两互斥的(不可能有两只不同的鸭子同时作为同一个满足条件的半圆起点);
- 既然有 $4$ 只鸭子,每只鸭子都有机会作为这样一个极值边界点,因此总概率为: $$ P(\text{4 只鸭子在同半圆}) = 4 \times \left(\frac{1}{2}\right)^3 = \frac{4}{8} = \frac{1}{2} = 50\% $$
2.3 推广到 $N$ 只鸭子的通用公式
$$ P(N) = \frac{N}{2^{N-1}} $$- 当 $N=1$ 时,$P(1) = 1$(1 只鸭子必在半圆内);
- 当 $N=2$ 时,$P(2) = \frac{2}{2^1} = 1$(2 只鸭子连成一条直径,必在某个半圆内);
- 当 $N=3$ 时,$P(3) = \frac{3}{2^2} = \frac{3}{4} = 75\%$;
- 当 $N=4$ 时,$P(4) = \frac{4}{2^3} = \frac{4}{8} = 50\%$;
- 当 $N=5$ 时,$P(5) = \frac{5}{2^4} = \frac{5}{16} = 31.25\%$。
3. 高维升华:温德尔定理(Wendel’s Theorem)
$$ P(d, N) = \frac{1}{2^{N-1}} \sum_{k=0}^{d-1} \binom{N-1}{k} $$- 在一维圆周($d=2$)上,公式退化为: $$ P(2, N) = \frac{1}{2^{N-1}} \left[\binom{N-1}{0} + \binom{N-1}{1}\right] = \frac{1 + (N-1)}{2^{N-1}} = \frac{N}{2^{N-1}} $$
- 在三维球面($d=3$)上,4 个点落在同一半球面的概率为: $$ P(3, 4) = \frac{1}{2^3} \left[\binom{3}{0} + \binom{3}{1} + \binom{3}{2}\right] = \frac{1 + 3 + 3}{8} = \frac{7}{8} = 87.5\% $$
4. Python 计算机模拟验证
import numpy as np
import pandas as pd
def simulate_ducks(n_ducks: int = 4, n_trials: int = 500_000, seed: int = 42):
np.random.seed(seed)
# 随机生成每个试验中 n 只鸭子的角度 (0 到 2pi)
angles = np.random.uniform(0, 2 * np.pi, size=(n_trials, n_ducks))
# 向量化排序角度并计算相邻差值
sorted_a = np.sort(angles, axis=1)
diffs = np.zeros((n_trials, n_ducks))
diffs[:, :-1] = np.diff(sorted_a, axis=1)
diffs[:, -1] = 2 * np.pi - (sorted_a[:, -1] - sorted_a[:, 0])
# 若存在某个间距 >= pi,说明所有鸭子都在其余的半圆内
in_semicircle = np.any(diffs >= np.pi, axis=1)
win_rate = np.mean(in_semicircle)
theory_rate = n_ducks / (2 ** (n_ducks - 1))
return {
"鸭子数量 N": n_ducks,
"试验次数": f"{n_trials:,}",
"模拟估计概率": round(float(win_rate), 5),
"理论公式计算值": round(float(theory_rate), 5)
}
# 验证 N = 3, 4, 5, 6
results = [simulate_ducks(n) for n in [3, 4, 5, 6]]
df = pd.DataFrame(results)
print(df.to_markdown(index=False))
5. 实验结果与对比
| 鸭子数量 $N$ | 试验次数 | 模拟估计概率 | 理论公式计算值 | 误差 |
|---|---|---|---|---|
| 3 只 | 500,000 | 0.75012 | 0.75000 | $+0.016\%$ |
| 4 只 | 500,000 | 0.50008 | 0.50000 | $+0.016\%$ |
| 5 只 | 500,000 | 0.31264 | 0.31250 | $+0.045\%$ |
| 6 只 | 500,000 | 0.18738 | 0.18750 | $-0.064\%$ |
6. 几何概率与降维思维的方法论
鸭子游泳问题为我们展示了连续几何概率中最具启发性的一面:
6.1 抓住对称性:把复杂的连续空间化繁为简
初学者面对连续几何概率,容易被高维积分的边界约束所困扰。而真正高段位的解法,往往是寻找系统的旋转不变性(Rotational Invariance)与极值互斥点(First Hitting Point)。通过定义“顺时针方向的第一个边界”,原本重叠复杂的连续积分被优雅地拆解成了离散的独立试验。
6.2 维度跃迁与温德尔定理的数学之美
从一维圆周的 $\frac{N}{2^{N-1}}$,到三维球面的 $\frac{7}{8}$,再到任意 $d$ 维空间的超平面划分,数学定理展现出令人惊叹的对称统一性。这告诉我们:高维空间看似复杂,但在随机投影下,其拓扑性质往往遵循极具确定性的组合公式。
6.3 计算机图形与高维检索中的工程启示
在计算几何、计算机图形学(光线追踪遮挡计算)以及高维向量检索(如局部敏感哈希 LSH)中,这种通过随机超平面划分样本空间的思路被广泛应用。理解了几何概率中的极值边界法,在面对工业级高维几何与空间索引设计时,就能拥有高屋建瓴的解题视角。