---
description: "两人一小时内随机到、先到等 15 分钟，相遇概率 $7/16 = 1-(3/4)^2$；单位正方形里挖掉两个角三角形"
---

# 约会问题：等 15 分钟

## 题

甲乙约好 12 点到 1 点之间见面，各自到达时刻在这一小时内均匀随机、相互独立。先到的人等 15 分钟，等不到就走（1 点前必须离开也不影响结论）。两人见到面的概率是多少？

## 一句话

**$7/16 \approx 0.44$**——单位正方形里 $|x - y| \le \frac14$ 的那条斜带，面积 $1 - \left(\frac34\right)^2$。

## 关键技巧

**两个独立均匀变量 = 单位正方形上的均匀点，概率 = 面积。** 把甲的到达时刻记 $x$、乙记 $y$（单位：小时），样本空间就是 $[0,1]^2$，均匀分布下任何事件的概率就是它的面积。

"见到面"翻译成不等式：$|x - y| \le \frac14$。这是对角线两侧宽度为 $\frac14$ 的斜带。与其算斜带，不如算补集——**斜带外是两个直角边为 $\frac34$ 的等腰直角三角形**，拼起来正好是一个边长 $\frac34$ 的正方形。

几何概率的通用手续：**写出不等式 → 画区域 → 优先算补集或对称块**。

## 解

$$
P(|x - y| \le \tfrac14) = 1 - 2 \cdot \frac12 \left(\frac34\right)^2 = 1 - \frac{9}{16} = \frac{7}{16}
$$

一般地，每人等待时长占总时长的比例为 $t$，相遇概率 $1 - (1 - t)^2$。反解：想把相遇概率做到一半，$(1 - t)^2 = \frac12$，每人要等 $60\left(1 - \frac{1}{\sqrt2}\right) \approx 17.6$ 分钟——**比 15 分钟只多 2.6 分钟，概率就从 44% 跳到 50%**。

## 延伸

- **各自等待时间不同**：甲先到最多等 $a$，乙先到最多等 $b$。条件变成 $-b \le y - x \le a$ 的非对称斜带，两个角三角形直角边分别是 $1 - a$、$1 - b$：

    $$
    P = 1 - \frac{(1-a)^2}{2} - \frac{(1-b)^2}{2}
    $$

    甲等 15 分钟、乙只等 10 分钟：$1 - \frac{9}{32} - \frac{25}{72} = \frac{107}{288} \approx 0.372$。**等得少的一方拖低的只是自己先到的那一半情形。**
- **三人都相遇**：三人都等 15 分钟，全员同时在场当且仅当"最晚到的 − 最早到的 $\le \frac14$"——这等价于任意两人都见过面。$n$ 个均匀变量的极差 $R$ 满足 $P(R \le a) = n a^{n-1} - (n-1) a^n$，$n = 3$ 时

    $$
    P = 3 \cdot \frac{1}{16} - 2 \cdot \frac{1}{64} = \frac{5}{32} \approx 0.156
    $$

    四人则跌到 $\frac{13}{256} \approx 0.051$。极差公式的来路：固定最早到的人和他的时刻，其余 $n-1$ 人都落在其后 $a$ 之内。
- **常见错误：把等待占比直接当概率**。$\frac14$ 是把"等 15 分钟"当成事件本身；$\frac12$ 是把斜带当成宽 $2 \times \frac14$ 的整条带子——忘了靠近 12 点和 1 点的两端被正方形截掉，截掉的两个小三角合计正好 $\frac{1}{16}$。画图就不会错。
- **同一招**：[折棍子成三角形](broken-stick-triangle.md)和 [Buffon 投针](buffon-needle.md)都是"把随机变量摆成坐标、概率化面积"。

??? note "数值验证"

    ```python
    from fractions import Fraction as F
    import math, random

    def meet(a, b=None):
        """先到的等对方：A 先到最多等 a，B 先到最多等 b（单位：小时）。"""
        b = a if b is None else b
        return 1 - (1 - a) ** 2 / 2 - (1 - b) ** 2 / 2

    def all_meet(n, a):
        """n 人都等 a：全员同时在场 <=> 最晚到的 - 最早到的 <= a。"""
        return n * a ** (n - 1) - (n - 1) * a ** n

    q = F(1, 4)
    print(meet(q), 1 - (1 - q) ** 2)               # 7/16 7/16
    print(all_meet(3, q), all_meet(4, q))          # 5/32 13/256
    print(meet(F(1, 4), F(1, 6)))                  # 107/288
    print(round(60 * (1 - 1 / math.sqrt(2)), 2))   # 17.57  要相遇概率 1/2 每人需等的分钟数

    random.seed(42)
    T, m2, m3, m4 = 10**6, 0, 0, 0
    for _ in range(T):
        x, y, z = random.random(), random.random(), random.random()
        m2 += abs(x - y) <= 0.25
        m3 += max(x, y, z) - min(x, y, z) <= 0.25
        m4 += (y - x <= 0.25) if x < y else (x - y <= 1 / 6)
    print(m2 / T, m3 / T, m4 / T)                  # 0.437529 0.156653 0.371506
    ```
