跳转至

约会问题:等 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}\)。画图就不会错。 - 同一招:折棍子成三角形和 Buffon 投针都是"把随机变量摆成坐标、概率化面积"。

数值验证
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