深蓝黑背景封面:左侧是一个单位正方形坐标系示意——横轴 x、纵轴 y 各从 0 到 1,正方形内画出灰色虚线对角线 y=x、紫色约束线 x=1/2、y=1/2 与 y=x±1/2,左上方与右下方各有一个青色阴影小直角三角形,标注面积各为 1/8,下方文字说明「可行区域 = 两个直角三角形,合计面积 1/4,对角线 y=x 上方对应 x<y」;右侧大标题「随机切两刀,三段能成三角形吗」,副标题「几何概型:概率 = 面积比」,灰字「答案 1/4,蒙特卡洛模拟交叉验证」;左上标注「面试经典 · 算法」,右上圆角胶囊标注「Day 10 · 11-17」 图 1:本文封面,单位正方形里的两块青色可行区域就是答案的形状。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。一条长为 1 的线段,独立均匀地随机切两刀,得到的三段能拼成三角形的概率是多少?答案是 1/4。但面试官要的不是这个数字,而是你如何把「概率」一步步翻译成「面积」。

第一步:把「能拼成三角形」翻译成不等式。

三段能构成三角形,当且仅当任意两段之和大于第三段,也就是著名的三角形不等式。设三段长度为 a、b、c,总和 a+b+c=1。把条件 a+b>c 代入 c=1−a−b,得到 a+b>1/2,两边再代入总和关系一化简,等价于 c<1/2。另外两个不等式同理。于是一个对称又好记的结论浮出来:总和为 1 的三段能成三角形,当且仅当每一段都小于 1/2。直觉上也说得通——只要有一段超过一半,另外两段加起来都不够它长,肯定围不拢。

第二步:把随机试验画进单位正方形。

两个切点 X、Y 独立均匀分布在 [0,1] 上,所有可能的结果正好是平面上的点 (x, y),铺满一个单位正方形——这就是几何概型的样本空间。由于取点是均匀的,某个事件的概率就等于它对应区域的面积占正方形总面积的比例;总面积是 1,概率就直接等于面积。问题从「算概率」变成了「量面积」。

第三步:三条约束线一夹,可行域自己浮出来。

先看对角线 y=x 上方的半个正方形,即 x<y 的情形,此时三段长度依次是 x、y−x、1−y。逐条施加「每段小于 1/2」:x<1/2 把可行点压到竖直线 x=1/2 左侧;y−x<1/2 把可行点压到直线 y=x+1/2 下方;1−y<1/2 即 y>1/2 把可行点抬到水平线 y=1/2 上方。三条线围出一个直角边为 1/2 的小直角三角形,顶点在 (0, 1/2)、(1/2, 1/2)、(1/2, 1),面积是 1/2×1/2×1/2=1/8。

剩下半个正方形(x>y)由对称性完全镜像——把 x、y 角色互换,约束一模一样,又贡献一个面积 1/8 的三角形。两块合计 1/4,对角线本身面积为零不影响结果。答案收工。

第四步:让电脑掷一百万次骰子交叉验证。

解析推导再漂亮,也值得用蒙特卡洛模拟复核一次:随机撒点,统计三段都小于 1/2 的频率。

// node triangle.js(Node.js 22 实测)
function trial() {
  const x = Math.random(), y = Math.random();
  const a = Math.min(x, y), b = Math.max(x, y);
  const segs = [a, b - a, 1 - b];
  return segs.every(s => s < 0.5); // 三段都小于 1/2 才能成三角形
}
const N = 1_000_000;
let hit = 0;
for (let i = 0; i < N; i++) if (trial()) hit++;
console.log('频率:', hit / N, '解析解:', 0.25);

实测输出:频率 0.2497,与解析解 1/4 吻合到小数点后三位。大数定律在给几何推导背书,这也顺手展示了工程里验证概率结论的标准动作。

左侧是放大的样本空间坐标图:单位正方形(横轴 x、纵轴 y,各标 0、1/2、1),内部画灰色虚线对角线 y=x,紫色约束边界线 x=1/2、y=1/2、y=x+1/2 与 y=x−1/2;左上方三角形(顶点 (0,1/2)、(1/2,1/2)、(1/2,1))与右下方三角形(顶点 (1/2,0)、(1,1/2)、(1/2,1/2))以青色阴影标出,各注面积 1/8;图下注明青色为可行区域、紫色为约束边界。右侧自上而下五张步骤卡:① 设切点 X、Y 独立均匀分布于 [0,1];② 样本空间 = 单位正方形,概率 = 区域面积;③ 不妨设 x<y,三段长为 x、y−x、1−y;④ 三角形存在当且仅当每段小于 1/2,即 x<1/2、y−x<1/2、y>1/2;⑤ 可行域为两个直角三角形,面积 = 2 × ½ × ½ × ½ = 1/4。右下紫色验证卡:蒙特卡洛随机取点 100 万次,能成三角形的频率约 0.250,与解析解 1/4 吻合 图 2:五步推导卡与样本空间里两块各 1/8 的可行区域。

这类题为什么值得准备。

「把随机试验映射成几何区域、用面积比求概率」是几何概型的通用套路,约会等待、随机取点、Buffon 投针类的题目都是同一个模子。它的工程延伸也不小:采样算法的置信度、随机化测试的覆盖率估算,本质都是在高维空间里度量「可行区域的占比」,低维直觉是高维分析的起点。

回到面试现场,建议的答题结构:先报答案 1/4,再按「翻译成不等式 → 画出样本空间 → 约束围出可行域 → 面积比求概率」四步推导,最后主动补一句可以用蒙特卡洛模拟验证。完整讲出推导链条,远比背出数字值钱。如果把题目改成「切三刀、四段能围成四边形」,你会怎么把这个思路推广到三维空间?欢迎聊聊你的想法。