判断一个游戏公不公平,先把它变成一道概率题:把双方各自的获胜概率算出来,看是否相等。下面按顺序执行,每一步都能用手算或一段短代码完成。
1. 锁定判断标准
-
明确 公平的数学定义:在完全不靠技巧、只靠运气的游戏里,双方获胜概率相等,各为 $\frac{1}{2}$。
-
确认 游戏是不是“零和”:一方赢必然意味着另一方输。如果存在平局、和局或第三方,就把问题拆成“甲胜率”和“乙胜率”两个数分别比较。
-
写下 你要计算的两个目标量,记作 $P_A$(甲获胜概率)和 $P_B$(乙获胜概率)。判断条件只有一条:$P_A = P_B$ 时规则公平,否则不公平。
2. 列出完整的样本空间
这一步是全部计算的地基,出错率最高。
-
列出 游戏进行一次时,所有可能出现的结果。注意是“一次完整进行”,不是“一回合”。
-
检查 每个结果是否等可能。只有等可能的结果,才能用“数个数、做除法”的方式算概率。
-
避免 把不同可能性的结果合并成一种。典型错误是掷两枚骰子算点数和,把结果写成
2到12共 11 种。实际上和为2只有 (1,1) 一种组合,和为7却有 (1,6)、(2,5)、(3,4)、(4,3)、(5,2)、(6,1) 六种组合,两者根本不等可能。 -
改用 带顺序的写法:把两枚骰子分别看作“第一枚、第二枚”,样本空间就是 36 种组合,每种出现机会相同。这一步改对,后面的数字才有意义。
3. 数出双方获胜的结果数
-
标记 把上一步列出的每一个结果,逐个判定“甲赢、乙赢、还是平局”。
-
统计 三个数量:$n_A$(甲赢的结果数)、$n_B$(乙赢的结果数)、$n_0$(平局结果数),总数为 $N$。
-
核对 用等式 $n_A + n_B + n_0 = N$ 复查有没有漏数或重数。
以“两枚骰子点数和大于 7 则甲赢,否则乙赢”为例:36 种组合里,和大于 7 的有 15 种,和小于等于 7 的有 21 种,$15 + 21 = 36$,核对通过。
4. 算概率、比大小
- 代入 古典概率公式:
$$P_A = \frac{n_A}{N}, \qquad P_B = \frac{n_B}{N}$$
-
比较 两个分数的大小。上例中 $P_A = \frac{15}{36} \approx 0.417$,$P_B = \frac{21}{36} \approx 0.583$,两者不相等,规则对甲不利。
-
处理 平局。如果规则规定平局重来,那么平局那部分概率会按比例重新分给双方,此时要用条件概率重算:$P_A = \frac{n_A}{n_A + n_B}$,$P_B = \frac{n_B}{n_A + n_B}$。如果规则规定平局算某一方赢,就直接把平局结果并入那一方重新数。
5. 用对称性做快速判断
很多游戏不需要算,看一眼结构就能下结论。
-
检查 规则对双方是否完全“镜像”:用到的道具、可选的数值范围、获胜条件,交换双方身份后是否一字不变。
-
判定 完全镜像则直接判公平,无需计算。石头剪刀布就是典型:三种手势两两相克,双方可选手势集合相同,任何一方都没有专属优势,胜率各为 $\frac{1}{3}$。
-
警惕 隐藏的不对称。只要存在“谁先动”“谁能看到对方的选择”“谁多一张牌”这类差异,镜像就被打破,必须回到第 2 步老实计算。
抽签是另一个容易误判的例子:10 张签里只有 1 张中奖,先抽的人中奖概率是 $\frac{1}{10}$;后抽的人要先熬过“前面没中”,概率是 $\frac{9}{10} \times \frac{1}{9} = \frac{1}{10}$。先抽后抽概率相同,抽签顺序公平。
6. 多局制要重新计算
“三局两胜”“五局三胜”会改变结论,不能直接沿用单局概率。
-
识别 单局获胜概率 $p$。若单局公平,$p = \frac{1}{2}$。
-
计算 三局两胜下的总胜率(先赢两局者胜,最多打三局):
$$P_3 = 3p^2(1-p) + p^3$$
-
判断 把具体数值代入。当 $p = \frac{1}{2}$ 时,$P_3 = 3 \times \frac{1}{4} \times \frac{1}{2} + \frac{1}{8} = \frac{1}{2}$,仍然公平。
-
注意 单局不公平会被多局制放大。当 $p = 0.6$ 时,$P_3 = 3 \times 0.36 \times 0.4 + 0.216 = 0.648$,劣势方从 40% 掉到约 35.2%。局数越多,强者越强。
7. 涉及下注时改用期望值判断
胜率相等只是“输赢次数”意义上的公平。一旦带钱,还要看赔率配不配。
- 写出 期望收益公式:
$$E = P_A \times W - P_B \times L$$
其中 $W$ 是赢时净赚的钱,$L$ 是输时净亏的钱。
-
令 $E = 0$,解出公平条件:$P_A \times W = P_B \times L$。
-
换算 成赔率形式:公平赔率应为 $\frac{W}{L} = \frac{P_B}{P_A}$。胜率越低的一方,赔率必须越高,才能抵消劣势。
-
检验 常见骗局:胜率五五开,但赢了只赔 1 倍、输了要赔 2 倍,此时 $E = 0.5 \times 1 - 0.5 \times 2 = -0.5$,每玩一次平均亏掉半个单位,规则不公平。
8. 用穷举代码验证手算结果
手算容易漏项,用程序把所有结果跑一遍最稳。
- 编写 穷举脚本,把所有等可能结果生成出来,逐个数。
from itertools import product
outcomes = list(product(range(1, 7), repeat=2))
total = len(outcomes)
win_a = sum(1 for a, b in outcomes if a + b > 7)
win_b = total - win_a
print("总数", total, "甲赢", win_a, "乙赢", win_b)
print("甲胜率", win_a / total, "乙胜率", win_b / total)
-
核对 输出应为总数 36、甲赢 15、乙赢 21,与手算一致。
-
复算 多局制时,用组合数直接算:
from math import comb
def best_of_three(p):
return comb(3, 2) * p**2 * (1 - p) + p**3
print(best_of_three(0.5))
print(best_of_three(0.6))
- 确认 输出分别是
0.5和0.648后,再下结论。
9. 排查四种常见误判
-
检查 样本空间是否真的等可能。只要出现“把不同组合数的结果当成一种”,概率立刻失真,这是最隐蔽也最常见的一类错误。
-
检查 平局有没有被正确处理。平局既不能直接丢掉,也不能默认给某一方,必须按规则重算。
-
检查 有没有信息差。后手能看见先手的选择、能根据对方动作调整策略,这类游戏不能只用静态计数,要按“每种应对策略”分别算概率。
-
检查 规则是否存在循环克制关系。三种以上选项两两相克时,需确认每个选项的“被克数量”相同,否则先选或后选会产生优势。
-
检查 已发生的对局是否改变了后续概率。比如“抽完不放回”的游戏,每抽一次剩余牌堆就变了,第二局的胜率不等于第一局,此时要按每一步的当前状态重算,不能拿单局概率乘局数。

暂无评论,快来抢沙发吧!