量化面试绿皮书:24. 一圆N点

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

24. 一圆N点

Q: 在圆的周长上随机画N个点,所有点都在一个半圆内的概率是多少?

A: 在圆的周长上随机画 N N N 个点(假设点独立且均匀分布在圆周上),所有点都在同一个半圆内的概率为 N 2 N − 1 \frac{N}{2^{N-1}} 2N−1N。

推导说明

  • 该问题是一个几何概率问题,关键在于所有 N N N 个点必须位于某个半圆(即弧长为 π \pi π 的圆弧)内。

  • 通过固定一个参考点(利用旋转对称性),并将问题转化为分析点之间的间隙(gaps)。

  • N N N 个点将圆周(总长为 2 π 2\pi 2π) 分成 N N N 个间隙 G 1 , G 2 , ... , G N G_1, G_2, \ldots, G_N G1,G2,...,GN,满足 ∑ i = 1 N G i = 2 π \sum_{i=1}^N G_i = 2\pi ∑i=1NGi=2π 和 G i > 0 G_i > 0 Gi>0。

  • 所有点位于某个半圆内等价于最大间隙至少为 π \pi π,即 max ⁡ 1 ≤ i ≤ N G i ≥ π \max_{1 \leq i \leq N} G_i \geq \pi max1≤i≤NGi≥π。

  • 间隙的联合分布为 Dirichlet 分布(参数全为 1),即均匀分布在单纯形 ∑ G i = 2 π , G i > 0 \sum G_i = 2\pi, G_i > 0 ∑Gi=2π,Gi>0 上。

  • 使用包含-排除原理计算 P ( max ⁡ G i ≥ π ) P(\max G_i \geq \pi) P(maxGi≥π):

    • P ( max ⁡ G i ≥ π ) = P ( ⋃ i = 1 N { G i ≥ π } ) P(\max G_i \geq \pi) = P\left( \bigcup_{i=1}^N \{G_i \geq \pi\} \right) P(maxGi≥π)=P(⋃i=1N{Gi≥π})。

    • 由于对称性,且当 k ≥ 2 k \geq 2 k≥2 时, P ( G 1 ≥ π , ... , G k ≥ π ) = 0 P(G_1 \geq \pi, \ldots, G_k \geq \pi) = 0 P(G1≥π,...,Gk≥π)=0(因为总和约束),因此只有 k = 1 k=1 k=1 项非零:

      P ( ⋃ i = 1 N { G i ≥ π } ) = N ⋅ P ( G 1 ≥ π ) . P\left( \bigcup_{i=1}^N \{G_i \geq \pi\} \right) = N \cdot P(G_1 \geq \pi). P(i=1⋃N{Gi≥π})=N⋅P(G1≥π).

  • 单个间隙 G i G_i Gi 的边际密度为 f G i ( g ) = ( N − 1 ) ( 2 π − g ) N − 2 ( 2 π ) N − 1 f_{G_i}(g) = (N-1) \frac{(2\pi - g)^{N-2}}{(2\pi)^{N-1}} fGi(g)=(N−1)(2π)N−1(2π−g)N−2,其中 0 < g < 2 π 0 < g < 2\pi 0<g<2π。

  • 计算 P ( G i ≥ π ) P(G_i \geq \pi) P(Gi≥π):

    P ( G i ≥ π ) = ∫ π 2 π ( N − 1 ) ( 2 π − g ) N − 2 ( 2 π ) N − 1 d g = 1 2 N − 1 , for N ≥ 1. P(G_i \geq \pi) = \int_{\pi}^{2\pi} (N-1) \frac{(2\pi - g)^{N-2}}{(2\pi)^{N-1}} dg = \frac{1}{2^{N-1}}, \quad \text{for } N \geq 1. P(Gi≥π)=∫π2π(N−1)(2π)N−1(2π−g)N−2dg=2N−11,for N≥1.

  • 因此:

    P ( max ⁡ G i ≥ π ) = N ⋅ 1 2 N − 1 = N 2 N − 1 . P(\max G_i \geq \pi) = N \cdot \frac{1}{2^{N-1}} = \frac{N}{2^{N-1}}. P(maxGi≥π)=N⋅2N−11=2N−1N.

验证

  • 当 N = 1 N = 1 N=1:一个点总是在半圆内,概率为 1 = 1 2 0 1 = \frac{1}{2^{0}} 1=201。
  • 当 N = 2 N = 2 N=2:两个点总是位于某个半圆内(即使为对径点),概率为 1 = 2 2 1 1 = \frac{2}{2^{1}} 1=212。
  • 当 N = 3 N = 3 N=3:概率为 3 4 = 0.75 \frac{3}{4} = 0.75 43=0.75(经典结果)。
  • 当 N = 4 N = 4 N=4:概率为 4 8 = 0.5 \frac{4}{8} = 0.5 84=0.5.

答案

N 2 N − 1 \boxed{\dfrac{N}{2^{N-1}}} 2N−1N

Python 实现

以下是使用Python实现的解决方案,代码包括理论概率计算和蒙特卡洛模拟两种方法:

python 复制代码
import numpy as np
from typing import Tuple, List


def theoretical_probability(n: int) -> float:
    """计算所有点位于同一个半圆内的理论概率。

    根据数学推导,概率公式为:N / (2^(N-1))

    Args:
        n (int): 点的数量(正整数)

    Raises:
        ValueError: 如果n小于1

    Returns:
        float: 理论概率值(浮点数)
    """
    if n < 1:
        raise ValueError("n must be at least 1")
    return n / (2 ** (n - 1))


def check_points_in_semicircle(points: np.ndarray) -> bool:
    """检查给定点集是否位于同一个半圆内。

    算法步骤:
    1. 将角度排序
    2. 计算相邻点间的间隙(包括首尾间隙)
    3. 判断最大间隙是否≥π(若是则所有点可被一个半圆覆盖)

    Args:
        points (np.ndarray): 形状为(N,)的数组,包含圆周上的点(弧度制)

    Returns:
        bool: 所有点位于同一个半圆内返回 True,否则 False
    """
    sorted_points = np.sort(points)
    # 计算相邻点间隙(包括首尾间隙)
    gaps = np.diff(np.append(sorted_points, sorted_points[0] + 2 * np.pi))
    max_gap = np.max(gaps)
    return max_gap >= np.pi


def simulate_probability(
    n: int, trials: int = 10_000, random_seed: int = 42
) -> Tuple[float, List[bool]]:
    """蒙特卡洛模拟估计所有点位于同一个半圆内的概率。

    步骤:
    1. 生成trials组样本,每组含n个[0, 2π)的随机点
    2. 对每组样本检查是否满足半圆条件
    3. 计算满足条件的频率作为概率估计

    Args:
        n (int): 点的数量(正整数)
        trials (int, optional): 模拟实验次数. Defaults to 10_000.
        random_seed (int, optional): 随机种子. Defaults to 42.

    Raises:
        ValueError: 如果n<1或trials<1

    Returns:
        Tuple[float, List[bool]]: 估计概率, 所有试验结果的布尔列表
    """
    if n < 1 or trials < 1:
        raise ValueError("n and trials must be at least 1")

    np.random.seed(random_seed)
    results = []

    for _ in range(trials):
        # 在[0, 2π)上生成n个均匀分布的点
        points = np.random.uniform(0, 2 * np.pi, size=n)
        results.append(check_points_in_semicircle(points))

    estimated_prob = np.mean(results)
    return estimated_prob, results


# 测试不同N值的理论概率
test_cases = [1, 2, 3, 4, 5]
print("理论概率:")
for n in test_cases:
    p = theoretical_probability(n)
    print(f"N={n}: {p:.4f} ({p*100:.1f}%)")

# 对N=3进行模拟验证
n = 3
trials = 10_000
print(f"\n蒙特卡洛模拟 (N={n}, trials={trials}):")

# 运行模拟
prob_estimate, results = simulate_probability(n, trials)
print(f"估计概率: {prob_estimate:.4f}")
print(f"理论概率: {theoretical_probability(n):.4f}")
print(f"绝对误差: {abs(prob_estimate - theoretical_probability(n)):.6f}")

# 输出前10次实验结果
print("\n前10次实验结果:")
for i, res in enumerate(results[:10]):
    print(f"试验{i+1}: {'成功' if res else '失败'}")

代码说明

  1. 理论计算函数

    • theoretical_probability(n: int) -> float
      直接使用公式 \\frac{N}{2\^{N-1}} 计算概率
  2. 核心判定函数

    • check_points_in_semicircle(points: np.ndarray) -> bool
      • 将点按角度排序
      • 计算相邻点间隙(包括首尾间隙)
      • 当最大间隙 ≥ π 时返回 True(数学上等价于所有点位于某个半圆内)
  3. 蒙特卡洛模拟

    • simulate_probability(n, trials, random_seed) -> Tuple[float, List[bool]]
      • 生成指定次数的随机点集
      • 用判定函数检查每个样本
      • 返回概率估计和详细结果列表
  4. 主函数

    • 演示理论概率计算(N=1~5)
    • 对N=3进行10,000次模拟验证
    • 显示理论值和模拟值的对比

输出示例

text 复制代码
理论概率:
N=1: 1.0000 (100.0%)
N=2: 1.0000 (100.0%)
N=3: 0.7500 (75.0%)
N=4: 0.5000 (50.0%)
N=5: 0.3125 (31.2%)

蒙特卡洛模拟 (N=3, trials=10000):
估计概率: 0.7478
理论概率: 0.7500
绝对误差: 0.002200

前10次实验结果:
试验1: 失败
试验2: 成功
试验3: 成功
试验4: 成功
试验5: 成功
试验6: 成功
试验7: 成功
试验8: 成功
试验9: 失败
试验10: 失败
...

关键算法解释

  1. 点生成 :在 [ 0 , 2 π ) [0, 2\pi) [0,2π) 上生成均匀分布的随机点
  2. 间隙计算
    • 排序点: p 0 ≤ p 1 ≤ ⋯ ≤ p N − 1 p_0 ≤ p_1 ≤ \cdots ≤ p_{N-1} p0≤p1≤⋯≤pN−1
    • 计算间隙: g i = { p i + 1 − p i i < N − 1 p 0 + 2 π − p N − 1 i = N − 1 g_i = \begin{cases} p_{i+1} - p_i & i < N-1 \\ p_0 + 2\pi - p_{N-1} & i = N-1 \end{cases} gi={pi+1−pip0+2π−pN−1i<N−1i=N−1
  3. 判定原理 :当最大间隙 max ⁡ ( g i ) ≥ π \max(g_i) \geq \pi max(gi)≥π 时,存在半圆包含所有点

这道面试题的本质是考察候选人将几何问题转化为概率模型的能力在高维约束下解析求解的数学思维,这类能力直接对应量化金融中市场风险建模、极端事件概率计算、投资组合集中度风险等核心挑战。通过随机点分布的分析,可映射金融资产价格的联合变动、尾部风险相依性等关键问题。

🔑 核心知识点

  1. 几何概率(Geometric Probability)

    研究几何空间中随机事件的概率分布,对应金融中的资产价格路径模拟

  2. Dirichlet分布(Dirichlet Distribution)

    多元连续概率分布,用于描述单纯形约束下的随机变量,对应投资组合权重分配问题

  3. 包含-排除原理(Inclusion-Exclusion Principle)

    组合数学核心工具,处理复杂事件联合概率,对应信用风险中的违约相关性计算

  4. 尾部风险建模(Tail Risk Modeling)

    最大间隙 max ⁡ G i ≥ π \max G_i \geq \pi maxGi≥π 本质是极端事件分析,直接关联VaR(Value at Risk)和ES(Expected Shortfall)计算

  5. 高维积分技术(High-Dimensional Integration)

    边际密度积分 P ( G i ≥ π ) = ∫ π 2 π f G i ( g ) d g P(G_i \geq \pi) = \int_{\pi}^{2\pi} f_{G_i}(g) dg P(Gi≥π)=∫π2πfGi(g)dg 对应衍生品定价中的蒙特卡洛模拟

📊 面试评估维度

考察维度 具体表现要求 本题对应点
量化建模能力 将现实问题转化为数学模型 将"半圆覆盖"转化为最大间隙问题
概率直觉 理解复杂事件的概率结构 识别 max ⁡ G i ≥ π \max G_i \geq \pi maxGi≥π 的等价性
分析求解能力 在高维约束下解析求解 利用Dirichlet分布性质简化计算
边界案例验证 检验模型极端情况的合理性 验证 N = 1 , 2 , 3 , 4 N=1,2,3,4 N=1,2,3,4的特例
金融映射思维 将数学结果关联金融场景 将最大间隙解释为资产价格极端偏离

🧩 典型回答框架

  1. 问题转化(Problem Transformation)

    将圆周展开为线性区间 [ 0 , 2 π ) [0,2\pi) [0,2π),建立间隙模型:

    ∑ i = 1 N G i = 2 π , G i > 0 \sum_{i=1}^N G_i = 2\pi, \quad G_i > 0 i=1∑NGi=2π,Gi>0

  2. 关键等价条件(Key Equivalence)

    证明几何约束与概率条件的等价性:

    所有点在半圆内    ⟺    max ⁡ 1 ≤ i ≤ N G i ≥ π \text{所有点在半圆内} \iff \max_{1 \leq i \leq N} G_i \geq \pi 所有点在半圆内⟺1≤i≤NmaxGi≥π

  3. 分布识别(Distribution Identification)

    确认间隙的联合分布:

    ( G 1 , ⋯   , G N ) ∼ Dirichlet ( 1 , 1 , ⋯   , 1 ) (G_1, \cdots ,G_N) \sim \text{Dirichlet}(1,1, \cdots ,1) (G1,⋯,GN)∼Dirichlet(1,1,⋯,1)

  4. 概率分解(Probability Decomposition)

    使用包含-排除原理:

    P ( max ⁡ G i ≥ π ) = N ⋅ P ( G 1 ≥ π ) P(\max G_i \geq \pi) = N \cdot P(G_1 \geq \pi) P(maxGi≥π)=N⋅P(G1≥π)

  5. 积分求解(Integration Solution)

    计算边际概率:

    P ( G 1 ≥ π ) = ∫ π 2 π ( N − 1 ) ( 2 π − g ) N − 2 ( 2 π ) N − 1 d g = 1 2 N − 1 P(G_1 \geq \pi) = \int_{\pi}^{2\pi} (N-1) \frac{(2\pi - g)^{N-2}}{(2\pi)^{N-1}} dg = \frac{1}{2^{N-1}} P(G1≥π)=∫π2π(N−1)(2π)N−1(2π−g)N−2dg=2N−11

  6. 结果验证(Validation)

    检查边界案例:

    • N = 1 N=1 N=1: 1 / 2 0 = 1 1/2^{0}=1 1/20=1(单点恒在半圆内)
    • N = 2 N=2 N=2: 2 / 2 1 = 1 2/2^{1}=1 2/21=1(两点恒在半圆内)

💡 核心洞察

  1. 维度诅咒的破解

    通过对称性将 N N N 维问题降维至单变量积分,此法可迁移至投资组合的维度缩减建模

  2. 尾部风险的本质
    max ⁡ G i ≥ π \max G_i \geq \pi maxGi≥π 揭示极端事件概率的指数衰减特性 N 2 N − 1 \frac{N}{2^{N-1}} 2N−1N,直接对应金融风险的肥尾(Fat Tail)分析

  3. 相依性建模范式

    间隙的相依结构 ( ∑ G i = 2 π ) (\sum G_i = 2\pi) (∑Gi=2π) 类比资产收益的资本约束(Capital Constraint),提供Copula函数外的替代建模思路

  4. 模型可解释性

    解析解 N 2 N − 1 \frac{N}{2^{N-1}} 2N−1N 比蒙特卡洛模拟更揭示风险本质,对应监管要求的模型可解释性(XAI)

在量化金融实践中,该模型可扩展至:

  • 计算投资组合在压力场景下的存活概率(Survival Probability)
  • 估计多个关联资产价格同时突破阈值的联合尾部风险(Joint Tail Risk)
  • 优化风险预算分配(Risk Budgeting)中的极端损失约束

风险提示与免责声明

本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。