中EN
概念页

马尔可夫链与状态机概率

Markov Chains & State-Machine Probability

当一个随机过程可能无限进行下去(如"每次 80% 再加 1 点伤害")时,无法枚举所有结果;把它画成以概率转移的状态机,写成转移矩阵,再用列向量反复左乘矩阵(马尔可夫链 (Markov Chain)),就能得到任意回合后的状态分布、稳态、游戏时长的中位数/均值/众数;反向则可用递归把复杂局面化归为已知的简单局面。本页按 Schreiber 与 Romero 第 22 章整理(p.525–556),并核对了书中数字。

问题:概率可以"无限"(p.525–526)

原书开宗明义:第 22 章与第 25 章是全书数学最重的两章,对设计师并非必需,不喜欢矩阵可跳过。此前的概率题都能"数结果 ÷ 可能性空间"精确求解,但有一类问题计数会趋于无穷。例子是一个虚构法术"魔法橡皮筋":造成 1 点伤害,然后掷 d10,1–2 结束,否则再加 1 点并继续掷。伤害为 1 的概率 20%,为 2 的概率 0.8×0.2=16%0.8\times0.2=16\%,为 3 的概率 12.8%……理论上可无限大。可以蒙特卡洛模拟或算前几百项近似,但也有精确方法。

矩阵与列向量(p.526–528)

矩阵就是方括号里的一张数表;列向量是只有一列的矩阵。矩阵乘列向量:结果的第 ii 个元素是矩阵第 ii 行与列向量逐项相乘再求和,例如

[4523130−11][xyz]=[4x+5y+2z3x+y+3z−y+z]\begin{bmatrix}4&5&2\\3&1&3\\0&-1&1\end{bmatrix}\begin{bmatrix}x\\y\\z\end{bmatrix}=\begin{bmatrix}4x+5y+2z\\3x+y+3z\\-y+z\end{bmatrix}

矩阵也可简写线性方程组(第 25 章解非传递机制时会用到)。矩阵运算的一般性质见 齐次坐标与矩阵约定。

状态机(p.528–529)

状态机由状态(圆圈)和带条件的转移(箭头)组成,有初始状态,可能有终止状态。实际使用的都是有限状态机 (FSM),但理论上状态可以无限——魔法橡皮筋就是一个无限状态机:状态 nn 表示已造成 nn 点伤害,每个状态以 80% 进入 n+1n+1、20% 结束。转移条件不一定是概率:原书的潜行游戏守卫在"巡逻→(听到声音)→搜索→(看到玩家)→攻击"之间切换,30 秒没发现/跟丢就退回上一级,没有终止状态。程序实现上的状态机见 状态模式与有限状态机。

把状态机转成转移矩阵(p.529–532)

若所有转移都是概率,状态机可写成矩阵:每一列是当前状态,每一行是下一个状态,元素是从该列转到该行的概率,因此每列之和为 1(任何时刻恰处于一个状态)。原书的三状态例子:状态 1 必定转到 2;状态 2 各以 1/2 转到 1 或 3;状态 3 以 1/3 转到任一状态(含自身)。下图是这个状态机,箭头上是转移概率。

stateDiagram-v2
    [*] --> S1
    S1 --> S2: "100%"
    S2 --> S1: "50%"
    S2 --> S3: "50%"
    S3 --> S1: "1/3"
    S3 --> S2: "1/3"
    S3 --> S3: "1/3"

对应的转移矩阵 MM 与初始列向量(从状态 1 出发):

M=[01213101301213],v0=[100],vn+1=MvnM=\begin{bmatrix}0&\tfrac12&\tfrac13\\1&0&\tfrac13\\0&\tfrac12&\tfrac13\end{bmatrix},\quad v_0=\begin{bmatrix}1\\0\\0\end{bmatrix},\quad v_{n+1}=Mv_n

v1=(0,1,0)v_1=(0,1,0),v2=(12,0,12)v_2=(\tfrac12,0,\tfrac12),v3=(16,46,16)v_3=(\tfrac16,\tfrac46,\tfrac16)……反复用"本轮分布 × 同一矩阵"得到下轮分布,就是马尔可夫链(以数学家马尔可夫命名)。约 13 次迭代后收敛到 (0.3,0.4,0.3)(0.3,0.4,0.3),再乘矩阵不再变化,称为稳态 (steady state):长期看 30% 时间在状态 1 和 3、40% 在状态 2——很难凭直觉猜到。若这是潜行游戏守卫的状态、转移是每单位时间的估计概率,就能知道守卫在各状态停留的比例并据此调整。

(本 wiki 核对:稳态满足 Mv=vMv=v,代入 (0.3,0.4,0.3)(0.3,0.4,0.3) 第一行 0.4/2+0.3/3=0.30.4/2+0.3/3=0.3、第二行 0.3+0.1=0.40.3+0.1=0.4,成立。)

案例:蛇梯棋(Chutes & Ladders,p.533–537)

棋盘 1–100 格,掷 d6 前进,停在梯子底爬上、停在滑梯顶滑下,必须恰好落在 100 才赢,掷超了原地不动。传统棋盘 9 架梯子(1→38、4→14、9→31、21→42、28→84、36→44、51→67、71→91、80→100)和 10 条滑梯(16→6、47→26、49→11、56→53、62→19、64→60、87→24、93→73、95→75、98→78)。

  • 状态数:100 格 + 棋盘外起点 − 10 个滑梯顶 − 9 个梯子底(停不住)= 82 个状态,转移矩阵 82×82 且非常稀疏(每列最多 6 个 1/6)。
  • 读出指标:终止状态概率首次大于 0 的回合是最短对局(第 7 回合,极不可能);首次超过 0.5 是中位数(32 回合);把相邻两回合的累积概率相减得到"恰好在该回合结束"的概率,乘回合数求和是均值;该曲线的峰值是众数(22 回合)。均值明显大于中位数和众数,说明有少数极长的对局拉高了均值。
  • 用途:改规则(取消"恰好落在 100")、增删滑梯/梯子后重算即可比较。一般滑梯拉长、梯子缩短游戏,但不绝对——紧挨大梯子之前的滑梯反而可能缩短平均时长。也可以额外统计每条滑梯/梯子的使用频率(对《大富翁》这类玩家根据对手落点概率做决策的游戏更实用)。
  • 多人:上述是单人数据。四人对局在第一个人到达 100 时结束,回合数会显著低于 32,但每回合四人行动,总耗时更长。把四人状态全部纳入矩阵需 4×824≈1.84\times82^4\approx1.8 亿个状态、矩阵约 3.3×10163.3\times10^{16} 个元素,超出普通电脑内存;可行的办法是把单人"在第 nn 回合结束"的分布当作加权骰子,掷四次取最小值并蒙特卡洛重复;若要排出名次则取相应的次序统计量。
  • 棋盘设计(脚注 1):几乎每格都在至少一条滑梯或梯子的射程内,最大的滑梯和梯子各自把玩家放在对方之前,便于大起大落在一两回合内被抹平;90–100 区间有三条滑梯(93、95、98),因"恰好到达"规则玩家会在 98 附近反复停留,是全盘最危险的区域。虽然对成人缺乏能动性,棋盘显然是为最大化戏剧性反转而设计的。
  • 防死循环(脚注 2):蒙特卡洛模拟要加保险(如 500 步未结束就记为 500),正式游戏里也一样:一个"极不可能但可能"的无限循环,调概率时一不小心就会变得常见。

原书问题(均值):原书称平均约 35 回合。本 wiki 用上面列出的同一套棋盘与规则建 101 状态矩阵迭代 3000 回合,得到最短 7 回合、中位数 32 回合、众数 22 回合(与原书一致),但均值约 39.2 回合;约 35.8 回合是取消"恰好落在 100"规则后的均值(此时中位数 29、众数 20)。原书的均值数字可能出自不同的规则设定或截断,读者可用上述梯子/滑梯表自行复算。

案例:Yahtzee 全力追五同(p.537–543)

5d6,可保留任意骰子重掷两次。假设玩家只追求五同(Yahtzee),总是保留"最多相同"的那组、重掷其余,决策完全由局面决定。首掷各牌型的组合数(分母 65=77766^5=7776):

牌型组合数计数方法
五同 AAAAA6六种点数
四同 AAAAB1506×56\times5 种点数 × 5 种"单张"位置
葫芦 AAABB3006×5×(52)6\times5\times\binom52
三同 AAABC12006⋅5⋅46\cdot5\cdot4 种点数 × 5⋅45\cdot4 种位置 ÷ 2(B、C 互换是同一手牌,否则重复计数)
两对 AABBC1800(62)×4×5×(42)\binom62\times4\times5\times\binom42
一对 AABCD3600(63)×3×5⋅4⋅3\binom63\times3\times5\cdot4\cdot3
杂牌 ABCDE720(65)×5!\binom65\times5!

合计正好 7776——这是检查有无重复计数或遗漏的好办法。按"最多相同的骰子数"合并为 5 个状态(1 同/对/三同/四同/五同),转移矩阵为

[720777600005400777612021600015007776802162536001507776152161036560677761216136161]\begin{bmatrix}\tfrac{720}{7776}&0&0&0&0\\ \tfrac{5400}{7776}&\tfrac{120}{216}&0&0&0\\ \tfrac{1500}{7776}&\tfrac{80}{216}&\tfrac{25}{36}&0&0\\ \tfrac{150}{7776}&\tfrac{15}{216}&\tfrac{10}{36}&\tfrac56&0\\ \tfrac{6}{7776}&\tfrac{1}{216}&\tfrac1{36}&\tfrac16&1\end{bmatrix}

对角线以上全为 0(不会退回更低状态);对子重掷 3 颗:三颗都中 1/2161/216,恰中两颗 3⋅16⋅16⋅56=15/2163\cdot\frac16\cdot\frac16\cdot\frac56=15/216,进入三同有两条路——恰中一颗 75/21675/216 或三颗彼此相同但不同于原对子 5/2165/216,共 80/21680/216;留在原状态用 1 减其余得 120/216120/216。三次掷骰后五同概率约 4.6%,四同约四分之一,三同近一半。多给一次重掷(共 4 次)概率翻倍超过 10%;共 10 次时首次超过 50%,即 5d6 凑五同的掷骰次数中位数为 10。(本 wiki 用同一矩阵复算:3 次 4.60%,4 次 10.06%,9 次 48.6%,10 次 55.6%,与原书一致。)

原书问题(脚注 3):一局 13 个类别都追五同,"失败一次的概率是 1 − 0.460 = 0.954"应为 1 − 0.046 = 0.954(成功率是 4.6% 而非 46%);其后 0.95413≈0.5420.954^{13}\approx0.542、至少成功一次约 0.458 的结论正确。另外一对的计数段把第三个位置误写为"B",应为"D"。

案例:《Risk》的递归(p.543–547)

规则前提:进攻获胜后至少要在出发地留 1 支军队、且参战军队都必须移动,所以每块领土里有 1 支军队不计入攻击力,下文的兵力都只算"第一支以外"的军队。进攻方每支额外军队掷 1 颗骰(最多 3 颗),防守方最多 2 颗,最大点与最大点、次大点与次大点比较,平局算防守方赢。可能性空间最多 65=77766^5=7776,可以在电子表格里暴力枚举(脚注 4:小问题暴力法精确、易写、少 bug,不必嫌它不优雅)。单次掷骰结果:

进攻 \ 防守2d61d6
3d6防守失 2:2890/7776;各失 1:2611/7776;进攻失 2:2275/7776防守失:855/1296;进攻失:441/1296
2d6295/1296;420/1296;581/1296125/216;91/216
1d6防守失:55/216;进攻失:161/21615/36;21/36

任何情况下多掷骰都对自己有利,因此总是掷满。整场战斗的胜率用递归:把当前局面按每种结果化归为更小的局面,直到已知情形(1 对 1 胜率 15/36)。例如 2 攻 1:125216+91216⋅1536≈0.754\frac{125}{216}+\frac{91}{216}\cdot\frac{15}{36}\approx0.754;2 对 2:2951296+4201296⋅1536≈0.36\frac{295}{1296}+\frac{420}{1296}\cdot\frac{15}{36}\approx0.36;7 对 5 = 28907776W(7,3)+26117776W(6,4)+22757776W(5,5)\frac{2890}{7776}W(7,3)+\frac{2611}{7776}W(6,4)+\frac{2275}{7776}W(5,5)。在表格里写好前几行列后向下、向右填充即可。

部分结果(进攻方胜率):1v1 0.417、2v2 0.363、3v3 0.470、4v4 0.477、5v5 0.506、4v2 0.785、4v3 0.642、6v4 0.745、6v5 0.638、10v10 0.568。结论:

  • 兵力相等时,4 对 4 以下防守方占优(赢平局),5 对 5 以上进攻方占优(3 对 2 掷骰的微弱优势累积);兵力更多时进攻方甚至在略少时占优,如 17 攻 19。(本 wiki 递归复算:17v19 胜率约 0.504,10×10 表与原书逐项一致。)
  • 增援决策:一支援军放在"4 攻 2"变成"4 攻 3"使进攻胜率降约 14%,放在"6 攻 4"变"6 攻 5"只降约 11%,前者更划算。这类计算正是数字版 AI 应做的。
  • 设计含义:小规模战斗利于防守,开局各方倾向于占据边界少的大洲(南美、澳洲)固守吃奖励;后期大量援军使概率偏向进攻,形成把游戏推向结束的正反馈(见 反馈回路)。

练习中的要点(p.547–555)

  • 讨论题 1–3:自建一个五状态 FSM(标出初始/终止状态与转移概率),转成转移矩阵,再用马尔可夫链看是否到达稳态、何时到达终止状态的概率超过 50%。
  • 讨论题 4–6:押 1 美元抛硬币,正面输掉、反面赌注翻三倍并可选择离开或继续,只能玩一次——建成无限状态机并用马尔可夫链追踪期望收益;每次继续的期望值都为正,但一直继续必然输光,留作悖论讨论。
  • 讨论题 7–10:找一个自己玩过、可用本章方法分析的系统,提出具体问题(如完成任务的平均回合数、某行动的平均收益),建状态机与转移矩阵并求解。(提取文本缺第 7 题,本 wiki 渲染 PDF 第 589 页核对补全。)
  • 支线引言:马尔可夫链是"正向"推进重复转移,递归是"反向"把复杂事件化归为简单事件;不只用于纯运气游戏,在可能性空间已知、未来局面未知的策略游戏里也可用来构造最优 AI。
  • 支线 22.1《雷暴 (Thunderstorm)》(德国儿童骰子游戏):状态 = 罚分 0–5 × 骰子数 1–6 再加终止状态;只剩一颗骰子时(原书称)平均失败约四次才有人掷出 1 让全部骰子回到场上,简单规则却有张弛起伏的节奏(节奏见第 12 章)。练习:单人版以"被淘汰前掷骰总次数"为分数求均值/中位数/众数;替代挑战只以骰子数为状态求稳态和每回合吃罚分的概率,并用 NN 人局总罚分介于 6(N−1)6(N-1) 与 6(N−1)+56(N-1)+5 之间估计局长;终极挑战比较两人及多人局各座次的先后手优劣。
  • 支线 22.2《Hi Ho! Cherry-O》:d7 转盘(+1~+4、−1、−2、清零),11 个状态;终极挑战是改权重或改效果使单人中位数为 10 回合,并比较哪种方法更容易。
  • 支线 22.3:魔法橡皮筋的代数解 D=1+0.8D⇒D=5D=1+0.8D\Rightarrow D=5(本 wiki 求解:几何分布期望 1/0.2=51/0.2=5)。
  • 支线 22.4:把第 17 章 Kill the Elf(战士每回合必中 1 伤,法师 1/6 概率打 6 伤)改用状态机(状态 = 法师命中次数)精确求解,找出 1–1000 之间使双方胜率最接近 1:1 的目标伤害。
  • 支线 22.5:50d6 赛马(首掷一方 6、一方 1)的精确解,状态为两人点差,首掷后在状态 5,每回合变化 −5~+5;50 回合版有 −240 到 250 共 491 个状态,十回合简化版有 −40 到 50 共 91 个状态,画出"首掷 6 者"胜率随回合的变化。
  • 支线 22.6:6 张牌(3 黑 3 红)中出现连续两张黑牌的概率,状态 =(剩余黑, 剩余红, 当前连黑数),用递归累加到达终止状态的概率(本 wiki 递归求得答案为 4/5);终极挑战是 8 副牌鞋里出现连续 10 张"十点牌"的概率,需编程递归求解。

原书问题(支线 22.6):

  1. 状态 (a,b,c)(a,b,c) 中 a,b∈{0..3}a,b\in\{0..3\}、c∈{0..2}c\in\{0..2\},最多 4×4×3=484\times4\times3=48 个状态,原书写成 "= 192";其后的编号 12a+3b+c12a+3b+c 最大为 47,也与 48 一致。
  2. 8 副牌共 416 张,32 张 A + 256 张 2–9 = 288 张"非十点牌"(原书自己在括号里也写了 288 个 0),所以初始状态应为 (128, 288, 0) 而不是原书的 (128, 256, 0)。状态数约 129×289×10≈37129\times289\times10\approx37 万,与原书"约 40 万"量级一致。

原书问题(支线 22.1):"只剩一颗骰子时平均约失败四次"与几何分布不符。每次成功率 p=1/6p=1/6,首次成功前失败次数的均值为 (1−p)/p=5(1-p)/p=5;中位数为 3(1−(5/6)4≈0.5181-(5/6)^4\approx0.518)。"约四次"既不是均值也不是中位数,作为粗略说法可以,但若当作平均值应为 5 次(本 wiki 计算)。

取舍与适用场景

  • 马尔可夫链适合无记忆(下一步只取决于当前状态)的随机过程:棋盘移动、守卫 AI 状态、重掷类机制、伤害链。需要记忆的东西必须编进状态(如支线 22.6 的"当前连黑数"),状态数会随之膨胀。
  • 多人组合状态呈指数爆炸(蛇梯棋四人约 1.8 亿状态),此时改用单人分布 + 蒙特卡洛。
  • 正向迭代(马尔可夫链)回答"nn 步后在哪";反向递归回答"从这里出发最终赢的概率"。小空间直接暴力枚举最可靠。
  • 无限过程在实现中要设上限,防止意外的死循环。
  1. Game_Balance_-_Ian_Schreiber_Brenda_Romero.pdf
  2. Ian Schreiber & Brenda Romero《Game Balance》第 1 版(CRC Press, 2022, ISBN 978-1-4987-9957-7)第 22 章 Infinite Probability(印刷页 p.525–556)

相关页面

游戏策划独立随机与骰子概率Independent Randomness & Dice ProbabilitySchreiber 与 Romero 第 17 章(第二部分"平衡的数学"首章)讲独立随机:骰子记法与等价随机器、概率/赔率/机会三个词的区别、用计数求概率、乘法与加法法则、取反、期望值、排列、大数定律,并用 Kill the Elf、50d6 赛马、Pig 与 TCG 稀有度四个案例说明短期波动与"稀有"陷阱(p.431–454)。游戏策划相依随机与抽牌概率Dependent Randomness & Card DrawsSchreiber 与 Romero 第 18 章讲相依随机:以不放回抽牌为典型,已知一个结果会改变后续事件的概率。内容包括"揭示信息才改变概率"、两张牌成对、组合与排列公式、扑克牌型计数、《万智牌》洗牌计数,以及蒙提霍尔问题(含节目中的真实规则与一般化)和假阳性悖论(p.455–475)。游戏策划概率与期望值Chance & Expected Value机会 (chance) 是 Schell 七类机制的最后一类(第 3 版第 12 章 Mechanic 7: Chance;第 1 版为第 10 章、六类中的第六类),涉及其他五类之间的交互:机会意味着不确定,不确定意味着惊喜,而惊喜是乐趣的秘密成分。设计师要掌握十条概率规则、会算期望值 (expected value),并同时考虑实际概率与玩家的感知概率,以及技能与运气的五种纠缠(第 10 章)。游戏开发状态模式与有限状态机State Pattern & Finite State Machines状态模式 (State Pattern) 把对象“依赖状态的行为”分散到各个状态类中,对象只持有指向当前状态的指针并把调用委托给它,状态切换就是换指针。它是实现有限状态机 (Finite State Machine, FSM) 的一种方式。FSM 能用很强的结构约束理清一团乱麻的标志位代码;状态组合爆炸、需要复用和需要“回到之前状态”时,分别用并发状态机、分层状态机和下推自动机来扩展。游戏策划反馈回路Feedback Loops反馈回路 (Feedback Loop):系统某部分变化的效果在稍后回过头来影响同一部分。负反馈 (Negative Feedback) 抑制变化、产生均衡;正反馈 (Positive Feedback) 放大变化、制造军备竞赛或下行螺旋。Adams & Dormans 把反馈回路视为涌现的三大结构特征之一(第 3 章)、经济形状的主要成因(第 4 章),并在第 6 章给出反馈的七种属性与篮球、《大富翁》等案例分析。游戏数学齐次坐标与矩阵约定Homogeneous Coordinates & Matrix Conventions实时渲染用 4×4 矩阵和四元素齐次坐标统一表示点和方向:方向向量 w=0,点 w=1。这样线性变换与平移可以合成为仿射变换并连乘。RTR4 采用列向量记法、右手观察坐标系;DirectX 采用行向量记法,书中强调这只是记法差异。游戏策划收益矩阵与非传递机制求解Payoff Matrices & Solving Intransitive Mechanics非传递机制没有成本曲线可用,它的"解"是各选项的使用比例。Schreiber 与 Romero 第 25 章(p.603–638)用收益表 → 剔除被占优选项 → 找最优反应循环 → 列方程(同一玩家所有可行选项收益相等,概率之和为 1)→ 化三角矩阵求解的流程,求解了带成本、不完全胜负、非对称、五选项、四选项、Game of Malkav 与三人版的石头剪刀布。本页按原书整理,并用线性规划复核:其中 Game of Malkav 与三人版的结果有误,正确值见文中"原书问题"。游戏策划电子表格平衡技法Spreadsheet Techniques for Game BalanceSchreiber 与 Romero《Game Balance》第三部分(第 26–37 章,p.639–738)是一套面向数值策划的电子表格教程,示例以 Google Sheets 为主,目标是从"从没听说过"到"熟练自如"。本页整理其中与表格本身的搭建和组织有关的部分(第 26–30、33、34、36 章):基本操作、公式填充与趋势线、相对/绝对引用、成本曲线表的布局与条件格式、单元格类型的配色约定、日期函数和图表,最后列出已经过时或说法有误的地方。随机与统计函数、穷举与蒙特卡洛、洗牌与掉落表、逐回合模拟和矩阵运算(第 31、32、35、37 章)内容较多,单独整理在 电子表格中的随机模拟游戏策划电子表格中的随机模拟与矩阵求解Spreadsheet Simulation & Matrix Solving《Game Balance》第三部分里与"算概率、做模拟"有关的四章:第 31 章随机、统计与条件函数及"穷举还是蒙特卡洛",第 32 章洗牌与加权掉落表,第 35 章用迭代计算或逐行展开做逐回合模拟,第 37 章在表格里跑马尔可夫链、解收益矩阵和用规划求解。表格的布局、格式与组织规范见 电子表格平衡技法;本页对照原书逐段核对,并标出已过时或有误的说法。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原