7.3 匹配公平性仿真
把评分和段位都用上,最后量一件事:按匹配分把玩家配到一起,对局公不公平。扫描 50 到 800 分的配对窗口,band50 平均实力差 66.8、公平率 92.4%,random 对照公平率仅 44.1%;再用 30 个种子的 B 基准证明强者胜率标准差仅 0.77 个百分点。
tag
把评分和段位都用上,最后量一件事:按匹配分把玩家配到一起,对局公不公平。扫描 50 到 800 分的配对窗口,band50 平均实力差 66.8、公平率 92.4%,random 对照公平率仅 44.1%;再用 30 个种子的 B 基准证明强者胜率标准差仅 0.77 个百分点。
匹配分是给系统看的,段位是给玩家看的。用百分位把 2000 名玩家切成青铜到钻石五段,实测占比 20/24.85/25.15/20/10 贴合目标,段位边界落在 666/1045/1179/1293/1437 分,并量化「评分分段」与「真实实力分段」29.65% 的错位率。
匹配分是「跟谁打」的度量。用 ELO 与 Glicko 两种模型对同一批 2000 名玩家跑 100 局,看评分离真实实力的 RMSE 从 167 收敛到 55.7(ELO)与 47.8(Glicko),并解释为什么 Glicko 多带一个「不确定度」反而收敛更低。
把出货抽数当成随机变量:几何分布的解析期望 33.33 抽、方差 1077.78 与仿真的 33.25 / 1071.86 对照。再按体验区间目标判定纯基础与保底两种设计,并用 30 个种子的蒙特卡洛均值偏差做 B 基准,证明仿真无系统性偏。
纯随机没有记忆,长尾会把少数玩家拖到 150 抽以上。用确定性 PRNG 跑 20000 名玩家对比纯基础与软/硬保底:均值从 33.25 抽降到 24.54,p90 从 76 抽压到 44 抽,硬保底命中人数从 3292 人降到 0 人。
掉落表是一张权重表:千分权重让每一项的数字直接就是千分概率。用确定性 PRNG 跑 60000 次抽条对照理论分布,传说项实测 0.4933% 对理论 0.5%,并用 TypeScript 原型验证 Python 与 TS 两侧逐位一致,权重表即唯一真源。
账面组合强度能不能代表真实强弱?本节把六个阵容放进多栈循环赛,用 4.1 的克制矩阵跑模拟,再用 Spearman 排序一致性做 B 基准:解析分与模拟分的一致性只有 -9%,说明加权战力分排不出强弱。另一半基准是平衡迭代——对最强阵容削弱、对最弱增强,胜率极差从 49% 收敛到 15%。
单兵种克制解决不了「几个兵种怎么搭」。本节把阵容加成写成条件规则:三军齐备、单一兵种、骑兵主力、均衡编队,命中即叠加;再用 TypeScript 原型把「命中加成 → 攻击分/防御分 → 组合强度」算成整数,用 node --test 断言三军齐备拿到 5187 分、枪兵方阵拿到 2878 分。
150% 的单一克制环在骑兵/弓兵这一对直接饱和到 100%/0%,另两对也偏到 86/14、88/15。本节把《王朝纪元》的兵种三角写成 3x3 整数百分比矩阵,用 S 层脚本对每个有序对跑带抖动的确定性战斗,得出胜率矩阵,并校验克制对、被克对与镜像对是否都落在目标带内。
把 3.1 的确定伤害与 3.2 的分布装进回合循环:每回合双方按「存活数 × 单位伤害」同时结算,谁的血量池先见底谁输。复用 core.ts 的 resolveBattle 跑枪兵 300 对骑兵 300,3 回合收敛;再给回放日志算 FNV-1a 指纹,Python 与 TypeScript 哈希同为 0x71e54817。
命中与暴击让伤害从确定值变成分布:85% 命中、25% 暴击、180% 暴击倍率,解析期望恰为 204。用自实现确定性 PRNG(mulberry32,Python 与 TypeScript 同算法同种子)跑 20 万次,实测均值 203.961、偏差仅 0.01%,并说明暴击真正的代价是方差而不是均值。
把 SLG 的伤害从「按比例扣血」还原成一行可判定的整数公式:攻击乘倍率、减去防御、再取保底。用配置驱动的《王朝纪元》护甲扫描(5 档攻击 × 6 档防御 × 3 档地形)复现线性减法模型,演示低攻高防撞上 1 点伤害地板、以及减伤上限为什么必要。
2.2 是从参数推结果,本节反过来:先写下想要的目标体验(累计成本锚点、第几天到几级),再用最小二乘反推曲线参数。我们用 numpy 手写最小二乘比较指数与幂律两个模型,跑出拟合优度与锚点残差,最后反推出达标所需的成本增长率。整个过程只需一份整数配置,全程可复现。
2.1 讲的是「升级变强多少」,本节讲「升级要花多少」。升级成本按整数比复利增长,与每小时有效产出一比,就得到真正的门槛:攒够一级要几小时、满级要几天。我们复用 bastion_core 与伐木场口径逐级对账,并做一组成本增长率的敏感性扫描,看门槛怎么从 8 天翻到 105 天。
成长曲线只有四种基本家族:线性、指数、对数(饱和型)与分段。本节把四族放进同一份整数配置,在 1–30 级上逐级求值,用「末首倍率、加速比、中点占比」三个标量给曲线做体检,并跑出一张四族对比 SVG。指数与分段末值几乎相同,形状却完全相反——这正是选型的关键。
联盟从健康到瓦解不是一夜之间。这一节用「健康 vs 衰退」两个剧本逐日对照,量出谁先亮红灯:贡献率第 27 天、参与率第 29 天就先越线,而流失率要拖到第 52 天才超标——等流失率起来人早就心散了,预警真正该盯的是前两个领先指标,不是流失率。
GVG 是「一群人对一群人」。这一节把联盟总战力配对与三据点战场结算都建成可跑模型:按窗口 5000 配对时战力差 2482、碾压率 0%,窗口放宽到 20000 时碾压率飙到 34.8%;再用 30 个种子的 B 基准证明匹配均衡度与战场时长偏差都稳定。
联盟是 SLG 的社交骨架:一群人的贡献高度不平均,少数核心扛着大多数人。这一节把贡献分布与贡献配额建成可跑模型,扫描 0 到 150 的配额,看联盟在留存率与保留产出率之间怎么权衡——配额 40 只丢 6% 的人,却保住 97.3% 的产出。
把 60 天赛季切成开荒、成长、对抗、收官四段,把每日签到、周常任务、成长竞赛、联盟战、收官冲刺等活动铺到每一天上,算出每日活动负载、峰均比 3000‰ 与收官相对开荒的抬升 4500‰。用一份可跑的排期模型回答:赛季该分几段、活动该排多密,才能既填满节奏、又不把玩家在峰值日压垮。
统计显著不等于值得上线。本节把一次实验结果压成可执行的决策:算提升点估计、两比例 z 检验的 p 值、差值的 95% 置信区间与当前样本量下的最小可检测效应,再用业务门槛与护栏指标给出「回滚 / 继续观察 / 全量」的判定,并算出要越过门槛还差多少样本。