← 返回文章列表

鸭子游泳问题

圆形几何概率与蒙特卡洛实验

本文通过几何概率严密推导与 Python 蒙特卡洛百万次数值模拟,深入剖析圆周上随机分布的四只鸭子落在同一半圆内的概率问题。文章详细对比了连续几何对称性与离散组合分析的两种证明路径,揭示了对称性原理在概率计算中的底层数学之美。

如果把 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. 选取第 1 只鸭子为基准点,以它为顺时针起点画出一个半圆(跨度 $[\theta_1, \theta_1 + \pi)$);
  2. 其余 $3$ 只鸭子独立落在该半圆内的概率为: $$ P = \left(\frac{1}{2}\right)^3 = \frac{1}{8} $$
  3. 由于半圆是由顺时针方向的第 1 只鸭子唯一确定的,以不同鸭子作为起点所构成的事件是两两互斥的(不可能有两只不同的鸭子同时作为同一个满足条件的半圆起点);
  4. 既然有 $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,0000.750120.75000$+0.016\%$
4 只500,0000.500080.50000$+0.016\%$
5 只500,0000.312640.31250$+0.045\%$
6 只500,0000.187380.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)中,这种通过随机超平面划分样本空间的思路被广泛应用。理解了几何概率中的极值边界法,在面对工业级高维几何与空间索引设计时,就能拥有高屋建瓴的解题视角。