用条件二项分布回答一件酒桌上天天发生、却很少被算清楚的事:
已知人数、自己的骰子和叫法历史,现在该跟、该加,还是该开?
这是一份独立数学研究(v2.0,2026 年 8 月),不是游戏 App。仓库里有论文、闭式概率代码、仿真数据和论文图。
| 论文 | 代码 | 数据 | 图 |
|---|---|---|---|
| PDF · Word | liars_dice/prob.py |
data/ |
figures/ |
吹牛骰子(Liar's Dice / 大话骰)是多人不完全信息博弈:每人 5 颗六面骰,只能看自己的,轮流叫「至少有 (q) 个面 (f)」,或者开上家。飞模式里 1 是万能牌,斋模式里不是。
民间口诀很多(「人多敢叫大」「有对才敢叫」),但一次跟叫会泄露手牌,一次开牌又像做假设检验。本研究把这件事拆成四层:
- 概率:叫法成立的精确概率(闭式二项分布,不是蒙的)
- 信息:自己手里有几颗有效骰,会怎样改写这个概率
- 信念:对手一路叫什么,能推断他手里大概有货还是在诈
- 决策:成立概率、立刻开的胜率、最终活下来的概率,是三个不同的数,不能混着用
理论部分用 scipy 二项分布右尾逐点校验;实证部分跑了 89,600 局 蒙特卡洛自博弈(7 种策略 × 双人轮换 × 飞/斋)和 440 桌 五人大逃杀,置信区间用 Clopper–Pearson,多对比较做了 Bonferroni 校正。
1. 自己的骰子不是装饰,漏算会开错牌。
5 人飞局、被叫「8 个 5」:如果你手里其实有 4 颗有效支持,真实成立概率是 0.940;如果你假装自己没贡献,会算出 0.339,差了将近 3 倍。按后者会考虑开,按前者绝对不该开。
2. 人越多,同一句叫法越安全;斋局比飞局紧一档。
「6 个某点」在飞局里:3 人桌只有 7.7%,5 人桌已经 70.3%,10 人桌接近 100%。斋局整体左移,5 人桌同一句只剩 10.2%。
3. 纯策略会被打穿,均衡必须带随机。
仿真里,固定阈值、固定风格的启发式代理,会被不可预测的打法显著剥削。双人飞局里随机型胜率 83.8%(95% CI: 82.8%–84.7%)。这支持「不存在纯策略均衡」的理论结论——但不等于「乱叫就是最优」。随机型数字偏高,也和当前启发式代理的实现局限有关,正文第 9.5 节有诚实讨论。
4. 开牌不要用一条死线。
经验校准的分层区(随人数、位置、对手风格浮动,不是普适常数):
| 上家叫法成立概率 (p) | 建议 |
|---|---|
| (p \le 0.15) | 果断开 |
| (0.15)–(0.30) | 比较跟下去还值不值 |
| (0.30)–(0.70) | 通常跟 |
| (0.70)–(0.90) | 谨慎跟 |
| (p \ge 0.90) | 绝不开 |
这些是正文表 18 的压缩版,每条后面都有对应公式或表格。
- 首叫优先叫自己有支持的点数。
- 手里不成对,就用万能面 1 起步(飞局里最模糊,真 1 和伪装分不清)。
- 成立概率 ≥ 0.6、又没远超期望,就跟。
- (p\le 0.15) 果断开,(p\ge 0.90) 绝不开。
- 5 人桌正常节奏大约 3→4→5→6→7;过了 8、9 必须手里有货。
- 有人出局后收一收——场上骰子少了,每颗权重变大。
- 对手一路抬同一面、不换面:大概率有货,别轻易开。
- 对手突然换面或突然加速:警惕诈唬,找他撑不住的面开。
- 后手可以观望一轮;先手把起步价压低一点施压。
- 自己只剩 2 颗骰时极度保守;4–5 颗还能扛一次失败。
- 斋局把叫量整体收紧一档。
- 被连续逼到高价、自己又没支持,及时止损。
5 人飞局安全区速查(期望有效骰 (\approx 8.3) 颗/面):常见安全叫量 (\le 7),危险区 (\ge 10)。
吹牛骰子数学研究/
├── README.md ← 你正在看的这份
├── 吹牛骰子概率博弈最优决策研究.pdf ← 主论文(32 页)
├── 吹牛骰子概率博弈最优决策研究.docx ← 可编辑源
├── Final Report.md ← 终检记录(深化点、表格修复、诚实标注)
├── liars_dice/
│ ├── prob.py ← 闭式概率引擎(可独立使用)
│ └── scripts/
│ ├── plot_figures.py ← 生成 fig1–fig6
│ └── gen_formulas.py ← 渲染论文公式图
├── data/ ← 仿真原始结果与检验表
├── figures/ ← 论文图 1–6
└── formulas/ ← 公式图 eq01、def03、thm04 等
论文附录 D 还描述了一套更完整的源码(游戏引擎、7 类代理、排行榜脚本、1,200,004 项校验)。当前这个目录里,上述引擎和代理尚未收录,但概率模块、论文图、原始数据和主论文都在。已发表的数值都可以对照 data/ 核对;概率表可以用 prob.py 当场重算。
- Python 3
- 只算概率:标准库就够(
prob.py在没有 scipy 时会走纯 Python 求和) - 画论文图:
numpy、scipy、matplotlib
python3 -m pip install numpy scipy matplotlib中文图需要本机有 CJK 字体(脚本默认 Noto Sans CJK SC)。没有的话,图能出,标题可能缺字。
在项目根目录打开 Python:
import sys
sys.path.insert(0, ".")
from liars_dice import prob
# 5 人飞局,上家叫「8 个 5」,我手里是 [1, 1, 3, 5, 5]
p, k = prob.cond_claim_probability(
q=8, n_players=5, my_hand=[1, 1, 3, 5, 5], face=5, mode="fly"
)
print(f"我有 {k} 颗有效骰,成立概率 {p:.3f}")
# 我有 4 颗有效骰,成立概率 0.940 → 绝不开换几个常用问题:
# 完全不看自己的牌,「6 个某点」在不同人数下有多真?
for n in [3, 5, 8, 10]:
p_fly = prob.uncond_claim_probability(6, n, 5, "fly")
p_zhai = prob.uncond_claim_probability(6, n, 5, "chase")
print(f"{n} 人 飞 {p_fly:.3f} 斋 {p_zhai:.3f}")
# 首叫:希望成立概率至少 60%,最多能叫几颗?
q = prob.safe_call_quantity(
0.60, n_players=5, my_hand=[1, 2, 3, 5, 5], face=5, mode="fly"
)
print("安全首叫量", q)没有 scipy 也能算。若已安装 scipy,可跑模块自检(会和二项分布右尾逐点对一下):
python3 liars_dice/prob.pymode 只认两个值:"fly"(飞,1 万能)和 "chase"(斋,1 不万能)。
这是正文第 5 节最重要的澄清。记 (M=(N-1)\times 5) 为对手未知骰数,(k) 为自己手里对该面的有效骰数:
| 符号 | 含义 | 什么时候用 |
|---|---|---|
| (P_0(q)) | 假装自己 0 贡献时的下界 | 只做最保守估计 |
| (P_k(q)) | 已知自己有 (k) 颗支持 | 决策时该用这个 |
| (P_{\mathrm{tot}}(q)) | 谁的牌都不知道 | 开局前的先验,不是你坐下之后该用的数 |
定理(2,793 个格点逐点验证,无一违反):
- 自己每多一颗有效骰,(P_k) 只升不降
- 存在交叉点 (k^*):支持不够时 (P_k) 低于完全先验,支持够了则高于它
- 用 (P_0) 代替 (P_k),永远低估成立概率
对应公式图:formulas/par00.png(基本参数)、formulas/eq01.png(无条件)、formulas/thm04.png(单调性与交叉点)。
| 图 | 文件 | 在说什么 |
|---|---|---|
| 1 | fig1_probability_surface.png |
人数 × 叫量的成立概率曲面 |
| 2 | fig2_fly_chase_comparison.png |
同一句「6 个某点」,飞 vs 斋 |
| 3 | fig3_conditional_vs_unconditional.png |
不同盅型把概率拉高多少 |
| 4 | fig4_threshold_decision_zones.png |
开牌阈值分区 |
| 5 | fig5_dice_pattern_heatmap.png |
盅型战略评分(启发式,不是均衡解) |
| 6 | fig6_leaderboard_bar_ci.png |
五人桌策略排行榜 + 95% CI |
图已经生成好了,直接看 figures/ 即可。若要重画,需要先把脚本里的输出路径从原来的 /outputs/... 改成本仓库的 figures/ 和 data/;plot_figures.py 还引用了论文完整工程里的 liars_dice.agents.base(当前目录没有这个模块),图 5 的评分矩阵目前是脚本内写死的。
data/ 是仿真落盘,不是需要再爬的外部数据集。随机种子在论文附录 B 中固定为 SEED = 20260826。
| 文件 | 内容 |
|---|---|
leaderboard_pairwise_fly.csv / _chase.csv |
双人轮换交锋排行榜 |
leaderboard_tabletop_fly.csv |
五人飞局大逃杀排行榜(每策略 220 局) |
summary_pairwise_fly_2.json / _chase_2.json |
双人赛汇总(总局数、各策略胜率) |
raw_pairwise_fly_2.jsonl / _chase_2.jsonl |
双人赛逐局原始记录 |
z_tests_pairwise_fly.csv / _chase.csv |
成对 Z 检验(Bonferroni 校正) |
expA_population_sensitivity.json |
实验 A:人数敏感性 |
expB_threshold_ablation.json |
实验 B:开牌阈值消融 |
expC_shape_value.csv |
实验 C:盅型价值(安全首叫量) |
五人飞局排行榜(与正文表 11 一致):
| 排名 | 策略 | 胜率 | 95% CI |
|---|---|---|---|
| 1 | random | 0.659 | [0.592, 0.722] |
| 2 | aggressive | 0.164 | [0.117, 0.219] |
| 3 | rational | 0.123 | [0.083, 0.174] |
| 4 | bluff | 0.027 | [0.010, 0.058] |
| 5 | conservative | 0.027 | [0.010, 0.058] |
双人飞局 44,800 局汇总:random 0.838,aggressive 0.610,bluff 0.579,rational 0.571,adaptive 0.479,follow 0.477,conservative 0.447。
- 引言:要回答的决策问题
- 相关工作:Ferguson 二人解析、MCTS、CFR、黄信翰毕业论文
- 规则与形式化:状态 (S=(N,H,B,R,P,\mathrm{mode}))
- 无条件成立概率(表 3a/3b、图 1、图 2)
- 条件概率与压缩效应定理(表 5–6、图 3)
- 贝叶斯信念更新(信任权重 (\tau \approx 0.3)–(0.5))
- 行动价值:成立概率 ≠ 立刻开胜率 ≠ 最终存活率
- 博弈论:纯策略均衡不存在;二人动态规划框架
- Monte Carlo 实证与诚实讨论
- 策略表与 12 条实战法则
- 结论与展望
附录 A 推荐算法伪代码 · 附录 B 复现命令 · 附录 C 文献 · 附录 D 目录索引
- 阈值 0.15 / 0.30 / 0.90 由模拟校准,会随人数、位置、对手风格变,不是放之四海都准的常数。
- 「随机型领先」有两层解释:理论层(纯策略可被剥削)和工程层(启发式代理的延续价值评估有偏)。本文不声称随机叫法本身是最优策略。
- 「完全不诈唬会被剥削」是均衡直觉,具体诈唬频率还没有从均衡计算里给出。
- 8 人以上计算量上升,10 人以上外推要谨慎。
- 严格贝叶斯纳什均衡未求(5 人联合类型空间约 (9\times 10^{18}))。CFR / 自我对弈强化学习列为未来工作。
- 独立研究,未经外部同行评审。
- T. S. Ferguson. Who Solved the Liar's Dice Game?(作者主页;UCLA 原 PDF 已下线,此为互联网档案馆。二人解析框架,本文动态规划的直接来源)
- J. Platt, L. Guo. Liar's Dice and Monte Carlo Tree Search(2018;公开可核的相关工作见 Brown 等 ReBeL,用搜索求解吹牛骰子)
- M. Bowling, N. Burch, M. Johanson, O. Tammelin. Heads-up Limit Hold'em Poker is Solved. Science, 2015. 另见 Burch, Johanson, Bowling. Solving Imperfect Information Games Using Decomposition. AAAI, 2014.(CFR)
- 黄信翰. 吹牛骰子之博弈分析. 国立台湾大学统计学研究所硕士论文.(馆藏也可在台湾博硕士论文知识加值系统检索)
数学研究组. 吹牛骰子(Liar's Dice / 大话骰):概率模型、贝叶斯推断与最优决策策略.
独立研究 v2.0, 2026.
声明:本研究为独立数学工作,未经外部同行评审;概率表、仿真数据和论文图均可在本仓库内核对。

