ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从约会问题理解几何概型:7/16概率推导与蒙特卡洛验证

从约会问题理解几何概型:7/16概率推导与蒙特卡洛验证

很多人第一次看到这道题,注意力都落在"15 分钟"上,然后凭直觉报一个 0.5 或者 0.25。实际上这道"约会问题"的标准答案是7/16 = 0.4375,它属于概率论里最经典的几何概型:把两个人的到达时刻看成一个平面点,把"能见面"翻译成平面上的一块区域,最后用面积比出结果。这个思路一旦立住,剩下的全是算术。但真正容易翻车的地方不在算术,而在于题干里那句没写出来的"每个人都等可能地在任意时刻到达"。我见过太多人背下了 7/16,被追问一句"如果一个人 12:30 才到,概率是多少"就当场卡壳。这篇就把这道题从图形、假设、代码验证、一般化公式、变式、条件概率到现实偏差,一层层拆开讲清楚,适合刚学概率的读者,也适合拿它练建模思维的从业者。

1. 先给答案:7/16 是怎么从一张正方形图里长出来的

这道题的核心动作只有一步:把"时间"这个一维量,升维成平面上的坐标点。一旦完成这个转换,概率就变成了面积比,不再需要任何复杂的概率公式。我建议所有第一次接触几何概型的人都从画图开始,而不是直接上积分——图形给你的直觉,比公式牢靠得多。

1.1 把"到达时间"变成平面上的一个点

设甲到达的时刻距离 12:00 过了 x 分钟,乙到达的时刻距离 12:00 过了 y 分钟。因为两人都可能在 12:00 到 13:00 之间的任意时刻出现,所以 x 和 y 都落在 [0, 60] 这个区间里。把 (x, y) 作为平面上的一个点,所有这些可能的点构成一个边长为 60 的正方形,左下角是 (0,0),右上角是 (60,60)。

关键在于:均匀到达等价于这个点在正方形里均匀分布。"均匀"在这里的含义是,落在任何一块区域里的概率,正比于那块区域的面积。这个性质是整道题的地基,后面所有推导都建立在它上面。举个类比:你往一块正方形靶子上随手扔飞镖,扔中某个区域的概率就是这个区域的面积占比——前提是每一处被扔中的可能性相同。

于是"两人相遇的概率"就变成了"随机点落在某个特定区域里的面积占比"。问题从概率问题退化成了几何问题。

1.2 那条 15 分钟宽的斜带子

接下来刻画"相遇"这个条件。题目的规则是:先到的人等后到的人,等待上限 15 分钟;超过 15 分钟还没来,先到的人就走了。这意味着两人能见面,当且仅当两人到达时刻的差不超过 15 分钟。

用坐标写出来就是|x - y| ≤ 15。在平面上,这是两条平行直线 y = x + 15 和 y = x - 15 之间的那条斜带子,以对角线 y = x 为中心线,宽度是 15 分钟(沿坐标轴方向量)。这条带子就是"相遇区"。

带子被正方形的边裁掉了两端。在正方形内部,这条带子的完整形状像一个被截断的长条:从左上角附近斜穿到右下角附近。可以直接看出来,正方形的左下角 (0,0) 附近有一个三角形不属于带子,右上角 (60,60) 附近也有一个同样大小的三角形不属于带子。除去这两个角,剩下的都是能见面的区域。

1.3 用"总减去空"算更省事

直接算带子的面积要做分段积分,比较麻烦。算补集要简单得多。两个"不相遇"的角是等腰直角三角形,直角顶点分别在 (0,0) 和 (60,60),两条直角边都落在正方形的边上。

看左下角那个三角形:它对应的是 x 很小、y 很大的情况,边界条件是 y - x > 15,即 y > x + 15。这个三角形在 x 轴上的截距是 0 到 45(因为当 y 最大取到 60 时,x 最大只能到 45 才能满足 y > x + 15),所以它的两条直角边长度都是60 - 15 = 45。面积是 45 × 45 / 2 = 1012.5。

右上角那个三角形由对称性可知面积完全相同,也是 1012.5。两个加起来是 2025。相遇区的面积就是 3600 - 2025 = 1575。

概率 = 1575 / 3600 = 0.4375 =7/16。

用公式表达就是:P = 1 - (T - w)² / T²,其中 T = 60 是总时间窗口,w = 15 是等待时长。代入得 1 - 45² / 60² = 1 - 2025/3600 = 1575/3600。这个过程心算就能完成,不需要动笔。

2. 三个没写在题干里、但你必须默认的假设

很多人觉得这道题的难点是算面积,其实不是。面积计算是最简单的一环。真正的难点在于:题干给的信息是残缺的,你必须自己补全三个假设才能动笔。而这三个假设一旦被替换,答案立刻变样。这就是为什么同一道题在不同场合会被追问出完全不同的版本。

2.1 均匀到达:整个 60 分钟里每一秒都等可能

题干只说"约好 12:00 到 13:00 之间见面",没说每个人具体怎么分布。用面积法求解时,我们默认了 x 和 y 在 [0, 60] 上均匀分布。这个假设的现实含义是:甲在 12:00 到 13:00 之间的任意时刻到达的可能性完全相同,乙也一样。

现实里这个假设通常不成立。约 12 点见面,很多人会赶在 12:00 到 12:10 之间出现,也可能有人因为吃午饭拖到 12:40。分布一旦偏离均匀,"面积法"给出的 7/16 就不再是正确答案,只能作为参考。如果你要在真实场景里估这个概率,第一步该做的是估分布,而不是套公式。

不过有一点值得说明:均匀假设在很多笔试和面试场景里是隐含约定,出题人默认你会这么理解。缺省状态下按均匀处理没有错,但你要知道自己用了一个假设,而不是一个已知条件。

2.2 相互独立:两个人不打电话、不互相等

第二个隐含假设是独立性:甲的到达时刻不影响乙的到达时刻。两人没有实时沟通,不会因为对方说"我快到了"而调整自己的出发时间。有了独立性,(x, y) 才是一个在正方形里均匀分布的点。

如果两人保持通话,那就完全是另一个问题:一旦允许沟通,"能否见面"接近确定事件,等待规则就形同虚设。这道题之所以有意思,恰恰因为信息不通畅。用博弈论的语言说,这是一个协调博弈,双方只能靠事先约定的规则来提高见面的机会。

2.3 边界上的等号:≤15 还是 <15 其实无所谓

题干说"不超过 15 分钟",那么正好等 15 分钟算不算?严格地讲,|x - y| = 15 是一条直线,面积为零,对最终概率没有影响。在连续分布下,单点、单条线的概率都是 0,取不取等号都不改变结果。

这个细节经常被拿来当"思维严谨性"的考察点,但它对答案毫无影响。真正需要注意的是另一种情况:如果题目改成"按分钟取整"的离散模型,边界就变得重要了,因为这时每条线都有正概率。这个坑我们放在第 3 节里专门讲。

提示:判断"边界是否重要"的方法很简单——看它是连续的还是离散的。连续模型下边界测度为 0,可以忽略;离散模型下每一点都有质量,必须逐一数清楚。

3. 用代码把 7/16 跑出来:蒙特卡洛的收敛与抖动

解析解算出来之后,最舒服的验证方式是写几行模拟代码跑一遍。这不是不相信数学,而是模拟能帮你看清哪些环节是"结构性"的、哪些是"巧合"。当你改动一处假设,解析公式可能要重新推半天,模拟却只要改一行。

3.1 二十行代码验证解析解

思路很直白:反复抽样两个 [0, 60] 上的均匀随机数,判断差的绝对值是否不超过 15,统计命中比例。下面是一个向量化版本,跑一百万次大约一两秒:

import numpy as np rng = np.random.default_rng(2024) def simulate(n=1_000_000, T=60.0, w=15.0): x = rng.uniform(0, T, n) y = rng.uniform(0, T, n) hit = np.abs(x - y) <= w return hit.mean(), hit.sum() p, k = simulate() print(f"命中次数 {k}, 估计概率 {p:.5f}") print(f"解析解 {1575/3600:.5f}")

跑出来大概会在 0.4373 到 0.4378 之间浮动,具体数值取决于随机种子。如果写成 for 循环逐次抽样,逻辑一样,速度会慢上百倍,验证性质的工作没必要那样写。

顺带说一个细节:判断条件写成<=还是<,结果不会有可见差别,因为浮点数恰好相等的情况几乎不可能出现。这从侧面印证了上面关于边界的讨论。

3.2 为什么模拟值总在 0.4375 上下飘

蒙特卡洛估计的误差是可以量化的。每次试验是一个伯努利事件,成功率 p = 0.4375,n 次独立试验后估计值的标准差是 sqrt(p(1-p)/n)。代入 p(1-p) = 0.2461:

试验次数 n标准差大致能达到的精度
1 万0.0050小数点后两位
10 万0.0016小数点后两到三位
100 万0.0005小数点后三位
1 亿0.00005小数点后四位

这张表说明一件事:想要多一位精度,试验次数要翻一百倍。所以拿模拟去"证明" 7/16 是不现实的,它只能佐证。想验证到小数点后三位,一百万次足够;想验证更精确的值,应该回去检查解析推导。

还有一个常见误区:有人跑出 0.440 就以为解析解错了。0.440 距离 0.4375 差 0.0025,对于十万次试验的模拟来说完全在正常波动范围内(约 1.6 个标准差)。判断模拟结果是否异常,要拿标准差的倍数去比,而不是凭感觉看小数点后几位。

3.3 换成离散的"整分钟"会怎样

现实里没人按"12:07:23.451"这种精度约时间。如果把模型改成"两人都在 61 个整点时刻中随机选一个",答案是多少?

这个问题我建议你亲手算一遍,因为它的结果和连续模型的差异非常能说明问题。

取时刻为 0, 1, 2, ..., 60,共 61 个值,总的组合数是 61² = 3721。对每一个 x,满足 |x - y| ≤ 15 的 y 的数量是 min(60, x+15) - max(0, x-15) + 1。分段统计:

  • x 从 0 到 15:数量从 16 递增到 31;
  • x 从 15 到 45:数量恒为 31;
  • x 从 45 到 60:数量从 31 递减到 16。

加总得 1651,概率是 1651/3721 ≈0.4437,比 0.4375 略大。

如果用 0 到 59 这 60 个时刻,总组合数为 3600,逐段求和结果是 1620,概率正好是0.45。

两种离散化方式,结果分别是 0.4437 和 0.45,都不等于 0.4375。这不是算错了,而是离散化把边界"加厚"了:连续模型里 |x-y| = 15 是一条零面积的线,离散模型里它是一批有正概率的点对,被算进了命中区。如果你的程序里出现这种差异,先检查是不是把连续问题离散化了,再去怀疑公式。

4. 把 60 和 15 换成字母:一般公式与几个常见变式

把具体数字换成符号,是检验自己是否真正理解一道题的标准动作。如果换掉 60 和 15 之后你还能立刻写出表达式,说明你掌握的是方法;如果必须重新画图重推,说明你记住的是答案。

4.1 一般公式 P = (2Tw - w²)/T² 的推导

设总时间窗口为 T,等待时长为 w,且 0 ≤ w ≤ T。相遇条件是 |x - y| ≤ w,正方形边长为 T,总面积 T²。不相遇的两个三角形,直角边长都是 T - w,各占 (T - w)² / 2,合计 (T - w)²。

于是:

P = [T² - (T - w)²] / T² = (2Tw - w²) / T²

这个式子可以写成更直观的形式:P = w/T × (2 - w/T)。令 r = w/T(等待时长占总窗口的比例),则 P = r(2 - r),这是一条开口向下的抛物线,在 r = 1 时取到 1,在 r = 0.5 时等于 0.75,在 r = 0.25 时等于 0.4375。

这个形式透露了一个重要信息:概率对 w 不是线性的。等待时间翻倍,概率并不会翻倍。r 从 0.25 涨到 0.5,概率从 0.4375 涨到 0.75,涨了约 0.31;r 再从 0.5 涨到 0.75,概率只涨到 0.9375,涨幅降到 0.19。越往后越不划算。

4.2 等待时间对照表:从 5 分钟到 30 分钟

固定 T = 60,把常见的等待时长都算一遍,方便你直接拿去用:

等待时长 wr = w/T概率 P小数
5 分钟1/12115/1440.7986… 不对,应为 575/3600
10 分钟1/61100/36000.3056
15 分钟1/41575/36000.4375
20 分钟1/32000/36000.5556
30 分钟1/22700/36000.7500

(5 分钟那一栏的正确结果是 575/3600 ≈ 0.1597,可以直接用公式 2×60×5 - 25 = 575 验证。)

从表里能读出一个反直觉的结论:在这个模型下,即使愿意等 15 分钟,见面的概率还不到一半。原因是"两人都不在中间时段到达"这类情况占的比例相当大——比如一个人在 12:00 到、另一个人在 12:50 到,这样的组合数量并不少。

想要把概率提到 0.75,等待时间得占到整个窗口的一半,也就是 30 分钟。这个数字在现实里是不可接受的,也解释了为什么"约一个宽泛的时间窗口"这种约定方式效率很低。

4.3 两个人的到达窗口错开时会掉多少

现实里经常出现这种约定:甲 12:00 到 13:00 之间到,乙 12:30 到 13:30 之间到。两个窗口错开半小时,但都不是很确定。这时正方形变成了矩形,问题性质变了。

设甲的时刻 a ∈ [0, 60],乙的时刻 b ∈ [30, 90],做变量替换 b' = b - 30 ∈ [0, 60]。相遇条件是 |a - b' - 30| ≤ 15,即 b' 落在 [a - 45, a - 15] 里。

对每个 a,符合的 b' 在 [0, 60] 内的长度是:

  • a < 15 时,区间上界 a - 15 < 0,落在 [0,60] 外的部分全部无效,长度为 0;
  • 15 ≤ a ≤ 45 时,下界 ≤ 0,有效长度是 a - 15;
  • 45 ≤ a ≤ 60 时,下界在 [0, 15] 内,上界在 [30, 45] 内,有效长度恒为 30。

积分:∫(15→45)(a - 15)da + ∫(45→60)30da = 450 + 450 = 900。总面积仍是 3600,概率 = 900/3600 =0.25。

错开半小时之后,在同样等 15 分钟的前提下,概率从 0.4375 掉到 0.25,掉了将近一半。原因很直观:甲早到的时候(12:15 之前),乙的窗口还没开始,甲怎么等也等不到。这一段占掉了甲四分之一的可能到达时间,白白浪费。

这个变式有实际意义:如果你和朋友的时间窗口天然错开,先把窗口对齐比延长等待时间更划算。把乙的出发时间往前挪半小时,概率能恢复到 0.4375,相当于凭空多等了近 10 分钟的效果。

4.4 非对称等待:一方等 10 分钟、另一方等 20 分钟

再换一个变式:甲先到时只肯等 10 分钟,乙先到时愿意等 20 分钟。这时的相遇区域不再是那条对称的斜带子,而是两块宽度不同的区域拼起来的。

条件是:x < y 时要求 y - x ≤ 10;x > y 时要求 x - y ≤ 20。

上三角那块(x < y)的面积,对 x 积分 min(10, 60 - x):x ≤ 50 时取 10,x > 50 时取 60 - x。积分得 500 + 50 = 550。

下三角那块(x > y)的面积,对 y 积分 min(20, 60 - y):y ≤ 40 时取 20,y > 40 时取 60 - y。积分得 800 + 200 = 1000。

总面积 1550,概率 = 1550/3600 ≈0.4306。

有意思的地方在于:10 和 20 的平均值是 15,但结果比对称的 15 分钟情况(0.4375)略低。差得不多,只有 0.007 左右,原因是对称时两块区域在边界处的"拼接"更紧凑。这个结论说明,让两人等一样长,比一个人多等一个人少等要略好一点,虽然优势很小,实际意义有限。

5. 条件概率与平均值:被追问时最容易翻车的两个点

这类题在笔试和面试里很少只问一个"求概率"就结束。最常见的追问是往条件概率方向走,或者问平均等待时间。这两类问题都有陷阱,而且陷阱的位置很隐蔽。

5.1 "已知 A 先到"为什么不改变概率

一个常见的追问:已经知道甲先到,他最终能等到乙的概率是多少?

直觉会告诉你"应该比 0.4375 大",因为甲既然先到了,就一定会等,而乙只要在 15 分钟内出现就行。但这个直觉是错的,正确答案仍然是0.4375。

理由很干净:条件"甲先到"相当于把样本空间从整个正方形缩小到对角线以上的那个三角形,面积是 1800。而相遇区域 |x - y| ≤ 15 恰好关于对角线 x = y 对称,它在那个三角形里占的面积正好是一半,即 787.5。面积比 787.5/1800 = 0.4375。

换句话说,斜带子被对角线切成面积相等的两半,这源于 x 和 y 的完全对称。这个等式是"对称性"送的礼物,不是什么普遍规律。如果两人的分布不对称,或者等待规则不对称,这个结论立刻失效——比如上一节的 10 分钟对 20 分钟,甲先到时等到乙的概率是 550/1800 ≈ 0.3056,和 0.4306 差得很远。

同样需要区分清楚的是另一种问法:已知甲在 12:20 到达,他见到乙的概率是多少?这就变了。甲到达后,乙的时刻必须落在 [5, 35] 这个区间里(因为甲在 20 分,往后等 15 分钟到 35 分,往前推算 15 分钟是 5 分),区间长度 30,概率是 30/60 =0.5,比 0.4375 大。

条件概率
无条件0.4375
已知甲先到(没说具体时刻)0.4375
已知甲在 12:00 到达15/60 = 0.25
已知甲在 12:20 到达30/60 = 0.5
已知甲在 12:30 到达30/60 = 0.5
已知甲在 12:50 到达25/60 ≈ 0.4167
已知甲在 13:00 到达15/60 = 0.25

这张表值得反复看:"知道谁先到"和"知道谁几点到"是两种强度完全不同的信息。前者只给了序关系,对概率毫无影响;后者给了一个具体位置,直接改变了条件分布。很多人在这两种问法之间混为一谈,答得很自信但错得很干脆。

表格里还有一个小规律:甲在 12:15 到 12:45 之间到达时,概率恒为 0.5,因为等待窗口完全落在 [0, 60] 内部,不会被边界裁掉。越靠近两端,被裁掉的部分越多,概率越低。

5.2 若真的见了面,平均等了多久

另一个常见的追问:见面成功的那些情况里,先到的人平均等了多久?

这需要算条件期望。两人到达时刻之差的绝对值 d = |x - y|,在正方形上,d 的密度函数是 f(d) = 2(T - d)/T²,这里 T = 60。这个式子来自"距离为 d 的等值线是两条线段,总长度 2(T-d)",再除以总面积。

要算的是 E[d | d ≤ 15] = E[d · 1{d≤15}] / P(d ≤ 15)。分母是 0.4375。分子是 ∫(0→15) d · 2(60 - d)/3600 dd,展开后得 3.125。

于是条件期望 = 3.125 / 0.4375 =50/7 ≈ 7.14 分钟。

这个结果还算好记:见面成功的场合下,先到的人平均只等了 7 分多钟。因为多数成功的情况是两人到达时间比较接近,真正"卡在 15 分钟边缘"的情形贡献了一部分,但主导的是小时间差。

顺带可以算另一个数字:不管见没见到,两人到达时刻差的期望是 T/3 = 20 分钟。这 20 分钟里有 15 分钟是白等的(超过 15 分钟的部分意味着见不到面),这个对比挺能说明问题的。

6. 现实里这个模型会怎么坏掉

公式算得再漂亮,现实里也不会真的按均匀分布走。我见过不少人把 7/16 当成一个"真理"往外讲,比如"我们约在整点之间见,见到的概率只有 44%",这话在特定前提下成立,换个场景就完全不准了。知道模型会在哪里失效,比记住答案更有用。

6.1 人的到达从来不是均匀的

真实的到达时间至少有三个特征:一是偏向窗口开头,约 12 点见面的人,大量会集中在 12:00 到 12:15 之间;二是偏向整点或半点,12:15 这种时刻比 12:13 更受欢迎;三是存在迟到尾部,少数人会拖到很晚。

这三点对概率的影响方向不同。前两点让两人的到达时间更"聚集",增加了见面的机会;迟到尾部的存在又拉开了差距,降低了机会。到底哪一边占上风,必须靠数据说话,不能拍脑袋。

一个极端的例子可以说明均匀假设多重要:假设甲一定在 12:00 到 12:20 之间到,乙一定在 12:40 到 13:00 之间到。这时两人的时间差至少是 20 分钟,永远超过 15 分钟,概率是 0。同样的等待规则,同样的总窗口,概率从 0.4375 直接归零。窗口一样不代表机会一样,这是建模时最容易被忽略的一点。

6.2 换一个分布重跑模拟

想知道非均匀分布下的概率,最省事的办法是改模拟代码。下面这个例子假设两人的到达时间都集中在中段,用标准差为 8 的正态分布模拟,并裁剪到 [0, 60] 区间:

import numpy as np rng = np.random.default_rng(7) n = 2_000_000 a = np.clip(rng.normal(30, 8, n), 0, 60) b = np.clip(rng.normal(30, 8, n), 0, 60) print(f"集中到达时的相遇概率: {np.mean(np.abs(a - b) <= 15):.4f}")

跑出来会落在0.8 附近,比均匀分布的 0.4375 高出一大截。原因很直观:两人的到达时刻都挤在中间一段,时间差自然就小。这说明"约定得越具体,越容易见到"——哪怕具体的时间本身并不准确,只要双方对"大概什么时候"的认知一致,效率就上来了。

反过来,如果经常有一方会迟到,模拟里可以给其中一个人加一个右移的偏移量:

a = np.clip(rng.normal(25, 8, n), 0, 60) # 通常准时 b = np.clip(rng.normal(38, 10, n), 0, 60) # 习惯性晚一点 print(f"一方习惯性迟到: {np.mean(np.abs(a - b) <= 15):.4f}")

这种情况下概率会掉到 0.5 上下。一个人的迟到习惯,对见面的伤害远大于等待时间的延长——把等待时间从 15 分钟加到 20 分钟只能把概率从 0.4375 提到 0.5556,而纠正一个平均迟到 13 分钟的坏习惯,影响幅度是另一个量级。

6.3 等待时长该设多少:一个粗糙的成本视角

理论上,等待时间越长见面概率越高,w 取到 T 时概率是 1。但等人的时间是有成本的,所以这是个权衡问题,不是单目标优化。

粗略地建一个模型:见面的收益记为 R,每等一分钟的成本记为 c。给定等待时长 w,见面的概率 P(w) = w/T × (2 - w/T),见面的情况下平均等待时间大约是某个关于 w 的增函数。期望净收益大致是 P(w) × R 减去等待成本。

当 w 从小往大增加时,P(w) 的增长越来越慢(抛物线),而成本近似线性增长,所以存在一个最优点。这个最优点具体在哪,取决于 R 和 c 的比值——如果见面的价值很高,多等一会儿无所谓;如果只是随便碰个面,等待超过十几分钟就该走了。

这套分析当然很粗糙,但它给了一个比"凭感觉定 15 分钟"更靠谱的思考框架:等待时长应该和"见面的价值 / 时间成本"的比值挂钩,而不是一个固定的数字。重要客户可以等半小时,顺路碰头十分钟就够了。

提示:如果你只是想要一个经验数字,在双方都在宽窗口内随机到达的前提下,等待时长取窗口总长的 1/4 到 1/3 是性价比比较高的区间,对应概率 0.44 到 0.56。再往上加,每多一点概率都要付出不成比例的等待代价。

7. 常见错误清单:从算错面积到单位混用

这道题的错误率相当高,而且错误的类型很集中。我把见过的问题整理成一份清单,你可以在自己算完之后对着检查一遍。这些问题看起来都是小失误,但在笔试现场,一个就足够让整道题归零。

7.1 面积算成 45×45 的一半

最常见的一种错误:算出直角边是 45,然后下意识地写 45 × 45 / 2 = 1012.5,把这个数当成"不相遇的总面积",再用 1 减去 1012.5/3600 得到 0.71875。

错在忘了有两个三角形。左下角和右上角各一块,必须乘 2。正确的不相遇面积是 2025,占总面积 3600 的 0.5625,所以才有了 0.4375 这个答案。

口诀记一下:不相遇面积 = (T - w)²,不是一个三角形,而是两个三角形拼起来的正方形。因为两个直角边为 (T-w) 的等腰直角三角形,正好能拼成一个边长为 (T-w) 的正方形。用这个视角看,公式 P = 1 - (T-w)²/T² 就变得非常自然了。

7.2 把带子宽度当成 30

另一种错误:把相遇条件的边界写成 |x - y| ≤ 30,理由是"两个人各有 15 分钟的等待,加起来 30 分钟"。

这个逻辑听着有道理,但混淆了"时间差"和"各自等待时长"两个概念。相遇条件只取决于时间差,而这个差的上限就是单侧的等待时长 15 分钟。甲先到等 15 分钟,意味着乙最多比甲晚 15 分钟到;反过来乙先到也一样。所以边界始终是 15,不是 30。

如果把边界错写成 30,算出来的是 1 - 900/3600 = 0.75,正好是答案表里 w = 30 的那一行。这个巧合说明什么?说明**"两人各等 15 分钟"和"时间差不超过 30 分钟"在规则上并不等价**,前者对应 |x-y| ≤ 15,后者对应 |x-y| ≤ 30。只是两个错误恰好撞上了同一组数字,容易让人自我确认。

7.3 小时和分钟混着用

最后这个错误最朴素,也最致命:算面积时一边用 T = 1(小时),一边用 w = 15(分钟)。结果分母是 1,分子是一堆以分钟为单位的数,算出个几百几千,直接乱掉。

这类错误在代公式的时候特别容易犯,因为公式 P = 1 - (T - w)²/T² 里的 T 和 w 必须同单位。有两条防线:一是统一换成分钟,T = 60、w = 15,全程用分钟;二是算完之后做量纲检查,概率必然在 0 到 1 之间,如果算出来大于 1 或是个负数,一定是单位或符号出了问题。

还有一个相关的坑:把"12:00 到 13:00"理解成一个"小时窗口"之后,有人会把 w 也写成 0.25 小时,这本身没错,但中途又混用 60 分钟做分母,照样出错。选定一种单位后,整道题从头到尾都不要换。

错误类型典型表现正确做法
漏乘 2不相遇面积写成 1012.5两个三角形合计 2025
边界翻倍用 |x-y| ≤ 30|x-y| ≤ 15
单位混用T 用小时、w 用分钟全程统一为分钟
忘记均匀假设直接套 7/16 到现实先确认分布形态
离散化未察觉按整分钟枚举得 0.45明确说明用离散模型

8. 我个人对这道题的几点体会

这道题我前后给别人讲过很多遍,最大的感受是:它的价值根本不在 7/16 这个数,而在于"把条件翻译成几何区域"这个动作。会做这道题的人,换个场景照样能建出类似的模型——比如两个人随机时刻登录系统、在同一个 5 分钟窗口内才可能协作;比如两台设备每隔一段时间上报心跳,只有落点接近时才能配对;比如两个快递员在同一片区随机到达,等待超过某个阈值就算失败。这些都是同一个结构。

反过来,只记住答案的人,一遇到"窗口错开"或者"其中一方迟到"就完全无从下手。所以我在给自己复习的时候,从来不背公式,而是每次都重新画那个正方形,把带子和两个角画出来,然后从面积比一路推下来。这个过程花不到一分钟,但保证了我不会记混 w 和 2w 的关系。

另外一点体会是关于模拟的。模拟的最大作用不是验证答案,而是让你敢于改动假设。当解析公式推不动的时候(比如三个人、非均匀分布、非对称等待),改一行代码就能得到估计值,这种自由度是纸笔给不了的。但也要清楚模拟的局限:它只能告诉你"这个假设下大概是多少",永远不能告诉你"这个假设对不对"。后者需要看现实数据。

最后留一个可以自己动手的小练习:把人数从 2 加到 3,规则改成"任意两人之间时间差不超过 15 分钟就算有人碰到面",用模拟估一下概率是多少,再想想能不能解析地算出来。我试过几次,解析路径相当麻烦,得对三维立方体做体积分割,而模拟跑几十万次就能给出一个稳定的估计值。这种"解析难、模拟易"的对比,本身就是一道很好的建模练习。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进