dareda 牌谱全量分析

这把怪谁 —— 座2 坏耶这把铁飞

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3, 四人东南战 K = 9 局。Hero = 座2 坏耶这把铁飞,终局 4300 点, 4 位。牌山约定 dead_wall_tail,配牌恒等 9/9 局通过 (牌谱内无杠,岭上牌未验证)。

Hero 终局
4 位
4300 点
权重 A
150k
mortal_150k.pth
steps=150000 · t24011010
权重 B
298k
mortal_298k.pth
steps=298000 · t26031702
生成时间
2026-08-13
20:48 JST · 全部项目已完成

确定性标签 —— A:mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release; B:mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release。 两边同为 CPU 推理、关 AMP,seed = 0。

→ 好牌,打得一般,而且这把运气还背。

这是 diagnose两份权重下逐字相同的那句话 (也就是双击 run.sh 会直接给你的结论)。三项星级:

星级判词A · 150kB · 298k
★★★★☆好牌 均等水平下这个座位期望 2.17 均等水平下这个座位期望 2.10
★★☆☆☆打得一般 你的打法把期望推到 2.30 位(−0.13)EV loss 0.320,四家第 2 低 你的打法把期望推到 2.13 位(−0.03)EV loss 0.224,四家最低
☆☆☆☆☆运气背 你的同水平里,4 位或更差占 10% 你的同水平里,4 位或更差占 10%

以权重 A 为正文口径:牌不错(均等水平下这个座位期望 2.17 位),打法一般 (把期望推到 2.30 位),而运气是压倒性的那一块。名次分解为 牌与座次 +0.33 + 打法 −0.13 + 运气 −1.70 = −1.50, 也就是从中性的 2.5 位掉到实际的 4 位。三项里运气占了绝大部分。

self-luck 的判词是「偏背」:按 hero 自己的水平(标定温度 1.00,即与 Mortal 同档、 不额外加噪)把这副牌山重打 30 次,只有 10% 会打到 4 位 —— 同水平期望顺位 2.30,平均点数 26433, 而实际拿到的是最差的那一档。换句话说这把确实是被运气坑的: 同水平的自己有 90% 会打得比这更好。

两份权重在结论上完全一致,而且 B 比 A 更偏向「不怪你」。权重 B 把同样的 −1.50 拆成牌 +0.40 + 打法 −0.03 + 运气 −1.87,判词同样是「偏背」、4 位概率同样是 10%。 三项归因、判词、4 位概率两边同向且量级接近,这个结论是稳的。 另一条两份权重都成立的硬事实:hero 的 EV loss(A 0.320 / B 0.224)不是四家最差的 —— A 下是四家第 2 低,B 下直接是四家最低,一致率 72% / 74% 也是四家最高档。 这局打得最不干净的是座0 健麻a(EV loss 0.488 / 0.424),而他拿了 3 位。

self-luck

四家总览

每家按自己被标定出的水平(温度越高越随机)重打这副牌山 30 次,看实际顺位落在自家分布的什么位置。 EV loss 是在人类原局上逐决策测的强度,数值越大离 Mortal 越远。下表为权重 A 口径, 标定温度 {0: 1.17, 1: 1.00, 2: 1.00, 3: 1.13}

座 / 玩家决策数一致率EV loss实际同水平期望1位2位3位4位
座0 健麻a9353%0.4883 位3.333%13%30%53%
座1 ただ風を待つ8972%0.2571 位1.5063%23%13%0%
座2 坏耶这把铁飞(hero)7472%0.3204 位2.3020%40%30%10%
座3 刘树德9362%0.3692 位2.8713%23%27%37%

值得单独指出:座0 和座3 是反过来的 —— 座0 同水平期望 3.33 位却拿了 3 位、 座3 期望 2.87 位却拿了 2 位,两家都打在自己分布的好的一侧。真正落在分布尾巴上的只有 hero: 期望 2.30 位、实际 4 位,而 4 位在他自己的分布里只占 10%。

权重 B 下同一张表的数字略有平移但排序不变:座0 EV loss 0.424(期望 3.43 位 / 实际 3 位)、 座1 0.229(1.87 / 1 位)、hero 0.224(2.13 / 4 位)、 座3 0.310(2.57 / 2 位),标定温度 {0: 1.11, 1: 1.00, 2: 1.00, 3: 1.02}。 hero 在 B 下的 EV loss 变成四家最低。

同水平自打分布

Hero 的顺位分布(A 与 B 并排)

把 hero 换成「按标定温度采样的自己」,对手也各按自己的温度,在同一副牌山上重打 30 次的顺位分布。 两份权重都把实际拿到的 4 位放在最薄的那一档(各 10%), 而最厚的一档都在 1~2 位。虚线是等强情况下的 25%。

平均顺位:A 2.30(平均点数 26433) · B 2.13(平均点数 31680)。 实际 4 位 / 4300 点,两边的平均点数都比实际高出 2.2 万以上。

A vs B

两份权重逐项对比

A = mortal_150k.pth(项目默认),B = mortal_298k.pth。同一份牌谱、同一 seed = 0, 只换权重。下表逐项列出两边的结果,分歧的项目会明确标注「不稳」

项目A · 150kB · 298k是否一致
replay — 四家全 Mortal
hero 终局
1 位 / 47000
K′=4,东四击飞终局
2 位 / 35000
K′=9,走完全程
方向一致
都远好于实际的 4 位 / 4300;但名次与终止方式不同 —— 这项细节不稳
counterfactual — 只 hero 换 Mortal
对手照人类原样打
4 位 / −16300
2 位/1 位/4 位/3 位
4 位 / 6800
3 位/2 位/4 位/1 位
一致(都是 4 位)
但保真度低,见下
counterfactual 保真度 中位 51%
1/9 局全程一致
中位 51%
2/9 局全程一致
一致
两边中位数都只有 51% —— 这一项整体不该当真
self-luck — 同水平平均顺位 2.30 位 2.13 位 一致
差 0.17 位,同向;B 更看好 hero
self-luck — 判词 偏背
P(4 位)=10%
偏背
P(4 位)=10%
完全一致
diagnose — 牌与座次 +0.33
均等水平期望 2.17 位
+0.40
均等水平期望 2.10 位
一致
都判「好牌」(★★★★☆)
diagnose — 打法 −0.13
EV loss 0.320,四家第 2 低
−0.03
EV loss 0.224,四家最低
一致
都判「打得一般」(★★☆☆☆),都是小幅负贡献
diagnose — 运气 −1.70 −1.87 一致
都判「运气背」(☆☆☆☆☆),都是三项里最大的一块
diagnose — 合计 −1.50 −1.50 一致
合计恒等于「实际顺位 − 2.5」,不是独立证据

怎么读这张表:唯一实质分歧在 replay(全 Mortal 重打)—— A 下东四就把座3 打到 −1500 提前击飞、hero 收 47000 拿 1 位;B 下九局走完、hero 35000 拿 2 位。 这是「顶尖打法能把这副牌打成什么」的上限估计,两份权重给出不同的路径,具体点数不要当数值结论, 只当「远好于实际」的定性证据。其余各项 —— 归因三分解、判词、4 位概率、counterfactual 名次 —— 两边同向。

montecarlo

蒙特卡洛敏感性

这一节问的是另一个问题,而且必须先说清它到底跑了什么,否则数字会被读反。 命令内部用的是 CounterfactualMonteCarlo —— 它是 counterfactual 的分布版, 不是 replay 的分布版:hero 换成 Mortal(全程 greedy),而三个对手仍然照人类原样出牌, 只有当某个对手脱轨(牌河已经和原局对不上、人类那步动作不再可用)之后, 才回落到 Mortal 接手。三档「强度」调的只是这个脱轨后 fallback 的温度, 温度越高越随机、越弱。

full-mortal 这个档名容易误读:它不等于「四家全 Mortal」。 它的含义是「对手脱轨后的 fallback 是满强度 greedy Mortal」,对手在脱轨之前依旧在复刻人类的实际出牌。 真正的「四家从第一张牌起全是 Mortal」是本报告的 replay 一节,那是另一套东西 —— 两者结果差得很远(A 下 hero 47000 / 1 位 vs −16300 / 4 位),原因就在这里: replay 里对手不再打出人类那些牌,牌河从东一就整个变了;本节里 hero 面对的仍是 那个把他打崩的牌河。

同理,本节与 self-luck 也不是一回事:self-luck(SelfStrengthMonteCarlo) 是四家都按各自标定温度从头重打一局全新的牌,完全不跟随人类日志。 三者的区别一句话:replay = 四家全 Mortal 重开;self-luck = 四家按各自水平重开; 本节 = 钉在人类牌河上的反事实

强度档对手温度n平均顺位平均点数1位2位3位4位
full-mortal
对手脱轨后回落到 greedy Mortal
{0:1.00, 1:1.00, 3:1.00}14.00−163000%0%0%100%
calibrated
fallback = 各自实测水平
{0:1.17, 1:1.00, 3:1.13}203.101632515%10%25%50%
weaker
fallback 更弱(EV loss 翻倍)
{0:1.65, 1:1.29, 3:1.57}203.05161205%25%30%40%
full-mortal{0:1.00, 1:1.00, 3:1.00}14.0068000%0%0%100%
calibrated{0:1.11, 1:1.00, 3:1.02}203.6066805%5%15%75%
weaker{0:1.56, 1:1.21, 3:1.43}203.301198010%15%10%65%

full-mortal 那一档是确定性单次重放,不是 100% 的置信度。对手全 greedy 时整条轨迹完全确定, 工具只跑 1 条(跑 20 条是同一局算 20 遍),所以 n=1、分布显示 100% 4 位 —— 这句话的意思仅仅是「那唯一一条确定轨迹的结果是 4 位」。这一档的终局点数 (A −16300 / B 6800)与本报告 counterfactual 一节 逐字相同,而且是按构造必然相同 —— 两者用的是同一套引擎、同样 greedy 的脱轨 fallback, epsilon = 0 时整条轨迹完全确定。换句话说 full-mortal 档没有提供 counterfactual 之外的新信息, 它的作用是给另外两档当参照系。

本节和 self-luck 的数字方向相反,原因是实验根本不同,不是矛盾。 self-luck 说 hero 同水平期望 2.30 位(A)/ 2.13 位(B);本节说 3.10 位(A)/ 3.60 位(B), 比中性的 2.5 位还差。差别在于:self-luck 让四家从头重打一局全新的牌, hero 有机会走上完全不同的路;本节把 hero 钉在人类那条已经崩掉的牌河上 ——对手前半局还在复刻真实出牌(保真度中位数仅 51%),hero 就算换成 Mortal 也是在接一个烂摊子。 再加上 hero 是确定性策略,20 条轨迹的全部方差只来自对手脱轨后的采样,样本又少。 「这把怪谁」的正文口径以 self-luck / diagnose 为准(那才是本工具为归因设计的实验), 本节只作为「对手强度变化时,那条既定牌河上的反事实有多敏感」的参考。

本节内部两份权重也不一致:A 下 calibrated → weaker 几乎没变化(3.10 → 3.05), B 下则明显改善(3.60 → 3.30)。方向上唯一共同点是「对手变弱 hero 不会更差」, 这几乎是同义反复。本节的具体数值不建议当结论用,n=20 的分布抖动足以解释这些差距。

资源账

耗时与内存

每条命令都经 run_step.py 执行,用 os.wait4 逐进程采集 rusage (不是 RUSAGE_CHILDREN 的累计值),所以下表的内存数字是各步骤自己的峰值,互不叠加。 各步骤串行执行,墙钟之间也不互相污染。

CPU Apple M4 逻辑核 10 内存 32.0 GB Python 3.11.13 torch 2.13.0 torch 线程 4 device cpu
每步的墙钟、CPU 时间与峰值常驻内存,os.wait4 逐进程采集
步骤权重墙钟 s用户态 s系统态 sCPU%峰值 MB退出
decode-capture0.180.120.038029.50
verify0.120.090.029420.70
inspect0.090.060.029420.00
replayA · 150k3.442.890.5099430.60
counterfactualA · 150k11.3810.771.51108434.70
diagnoseA · 150k175.66624.1911.50362426.10
replayB · 298k8.427.481.30104436.60
counterfactualB · 298k6.125.510.96106436.70
diagnoseB · 298k177.17609.5414.09352440.50
montecarlo --sensitivityA · 150k104.42341.758.04335428.80
montecarlo --sensitivityB · 298k90.59295.606.67334439.80
合计577.6440.5(峰值)

全部步骤合计墙钟 577.6 s(9.6 分钟),单步峰值常驻内存 440 MB。各步骤串行执行,数字之间不互相污染。

读法:分钟级的只有 diagnose(两份权重各约 176 s)和 montecarlo (104 s / 91 s),两者合计占总墙钟的 95%。它们的用户态 CPU 时间远大于墙钟 (diagnose 约 620 s vs 176 s)—— 这是内部多进程并行的结果,CPU% 在 334%~362%。 replay / counterfactual 是秒级单进程,解析三步(decode / verify / inspect) 合计不到 0.4 s。峰值常驻内存由 torch + 权重决定,凡是加载模型的步骤都在 430 MB 上下,和牌谱长度、trials 数基本无关;不加载模型的解析步骤只要 20~30 MB。

方法与局限

命令原文与该打的折扣

本报告的每一个数字都来自下列命令的日志输出,没有手工估算或跨步骤推算的成分。

dareda decode-capture --capture majsoul-ws-1786618863235.json --out record.json
dareda verify  --record record.json
dareda inspect --record record.json

# 权重 A = models/mortal_150k.pth,权重 B = models/mortal_298k.pth,以下各跑一遍
dareda replay         --record record.json                      --model <权重>
dareda counterfactual --record record.json --hero 2             --model <权重>
dareda diagnose       --record record.json --hero 2 --trials 30 --with-selfluck --model <权重>
dareda montecarlo     --record record.json --hero 2 --trials 20 --sensitivity   --model <权重>

参数:--seed 0(默认值,两份权重保持一致才可比)、--trials 30(diagnose)、 --trials 20(montecarlo)。推理全程 CPU、关 AMP。

三种模拟不是一回事

本报告里出现了三套结果各不相同的模拟,牌山是同一副,但「对手是谁」完全不同, 横向比较之前必须先看这张表(依据:src/dareda/montecarlo.pysrc/dareda/engine/logfollow.py)。

命令hero三个对手内核
replayMortal(greedy) 从第一张牌起也是 Mortal,完全不看人类日志 run_replay + 四个 Mortal 引擎
counterfactual
montecarlo(三档全部)
Mortal(greedy) 照人类原样出牌;某家脱轨后才回落到 Mortal,「强度档」调的只是这个 fallback 的温度 CounterfactualMonteCarlo + LogFollowEngine
self-luck
diagnose
按自己标定温度的 Mortal 各按自己标定温度的 Mortal,从头重打一局全新的牌,不看日志 SelfStrengthMonteCarlo

所以 replay 的 hero 47000 / 1 位(A)和 montecarlo full-mortal 的 −16300 / 4 位 不构成矛盾 —— 前者的对手不再打出人类那些牌,牌河从东一起就是另一局; 后者 hero 仍被钉在那条把他打崩的牌河上。同理,归因结论只该从第三行(self-luck / diagnose)读, 那是唯一一个为「这把怪谁」设计的实验。

该打的折扣

附录

详细模拟结果

正文只取了各步骤的汇总数字。这一节把模拟过程本身摊开:逐局的点数轨迹、 counterfactual 的逐局保真度、以及每条命令的完整日志原文。 报告里的每一个数字都能在这里找到出处。

A.1 逐局点数轨迹

人类原局给的是各局开局时的点数(取自 inspect), 模拟给的是各局结束时的点数(取自 replay / counterfactual), 两者口径差一局,不要横向逐格对比;看的是走势和终点。粗体是 hero(座2)。

人类原局 —— 各局开局点数(inspect),终局 26600 / 37200 / 4300 / 31900
本场座0座1座2(hero)座3
东一座0025000250002500025000
东二座1023000290002350024500
东三座2123000290002350024500
东四座3021700290002350025800
南一座0021700329002350021900
南二座1021700349002150021900
南三座2020400349002150023200
南四座3026600349001530023200
南四座312660034900660031900

注意表里是局始点数,所以 21500 那一行(南三局始)代表前六局打完的状态。 hero 前六局几乎没动(25000 → 21500,−3500),分数是在南三、南四、南四1本这最后三局 掉光的:21500 → 15300 → 6600 → 终局 4300,合计 −17200。这也是为什么归因几乎全落在运气项上 —— 崩盘集中在最后三局。

replay(四家全 Mortal)—— 各局结束点数
权重座0座1座2(hero)座3结果
A · 150k东一23700243002770024300tsumo
A · 150k东二22200233003070023800tsumo
A · 150k东三1本2220023300500004500ron
A · 150k东四192003530047000−1500tsumo · 击飞终局
B · 298k东一23700243002770024300tsumo
B · 298k东二22700311002770018500ron
B · 298k东三1本20600290003400016400tsumo
B · 298k东四17600410003100010400tsumo
B · 298k南一1560045000300009400tsumo
B · 298k南二1410043500305009900ryuukyoku
B · 298k南三1360047500295009400tsumo
B · 298k南四1210046000310009900ryuukyoku
B · 298k南四1本1130045200350008500tsumo

两份权重的东一完全相同(23700/24300/27700/24300,hero 自摸)—— 同一副牌、同一 seed, 两个权重在第一局做出了一致的选择。分歧从东二开始:A 让 hero 在东三1本直接冲到 50000 并在东四击飞座3 提前终局; B 走完九局、hero 稳在 3 万上下。这就是正文说 replay 这项「细节不稳」的依据。

counterfactual(只 hero 换 Mortal,对手照人类原样打)—— 各局结束点数
权重座0座1座2(hero)座3结果
A · 150k东一37000210002100021000tsumo
A · 150k东二37000297002100012300ron
A · 150k东三1本35700297002100013600ron
A · 150k东四3570037700210005600ron
A · 150k南一487003770090004600ron
A · 150k南二508003720087003300tsumo
A · 150k南三482003980087003300ron
A · 150k南四4820039800012000ron
A · 150k南四1本4820056100−1630012000ron
B · 298k东一37000210002100021000tsumo
B · 298k东二28000210003100020000ron
B · 298k东三1本26700210003100021300ron
B · 298k东四23700330002800015300tsumo
B · 298k南一36700330001600014300ron
B · 298k南二36200345001550013800tsumo
B · 298k南三20200345001550029800ron
B · 298k南四2020034500680038500ron
B · 298k南四1本1840034500680040300ron

再强调一次:这张表的保真度只有 51%(中位数),不是可信的数值预测。 它唯一能说明的是「就算把 hero 换成 Mortal、而对手仍按原样出牌,hero 照样是 4 位」—— 两份权重在这一点上一致。注意 A 下 hero 终局 −16300、B 下 6800, 与 montecarlo 的 full-mortal 档按构造是同一次计算(同一套引擎、 同样 greedy 的脱轨 fallback、epsilon = 0 完全确定),所以点数逐字相同。

A.2 counterfactual 逐局保真度

「脱轨@事件」= hero 第一次做出与人类不同的选择发生在该局第几个事件; 忠实比例 = 脱轨点之前的事件占该局全部事件的比例。比例越低,该局的模拟越不该当真。

该局事件数A 脱轨@A 忠实比例B 脱轨@B 忠实比例
东一624979%4979%
东二1452819%2819%
东三1本53全程100%全程100%
东四452351%818%
南一351851%1851%
南二392051%2051%
南三833846%3846%
南四954042%全程100%
南四1本751621%1621%
汇总1/9 局全程一致 · 中位数 51%2/9 局全程一致 · 中位数 51%

东三1本(hero 自己的庄)两份权重都是全程一致 —— Mortal 在这一局的每一个选择都和 hero 相同, 这局 hero 打得无可挑剔。两份权重只在两局上分歧:东四(A 51% / B 18%)和南四(A 42% / B 全程一致)。 崩盘最狠的南四1本,两边都只忠实到 21% 就脱轨了,所以「换 Mortal 能不能守住这一局」这个问题, 本工具其实回答不了

A.3 蒙特卡洛三档的完整分布

正文第 6 节的表已是完整分布(每档 1/2/3/4 位四个百分比 + 平均顺位 + 平均点数),此处不重复。 需要注意 n 列:full-mortal 档 n=1,另两档 n=20

A.4 命令日志原文

以下是 11 条命令的完整 stdout/stderr,由 run_step.py 逐条落盘,未经编辑。 点击标题展开。本报告正文的所有数字都可在这里逐字核对。

decode-capture —— 抓包解码 0.18 s · 峰值 29.5 MB · 退出码 0

dareda decode-capture --capture ~/Downloads/majsoul-ws-1786618863235.json --out .dareda-runs/majsoul-ws-1786618863235/record.json

抓包帧数     : 77(尝试解析 77 帧)
牌谱所在帧   : 62
uuid         : 260812-860b14a0-aa1c-414d-a468-81b51f2e32f3
动作流来源   : inline
动作条数     : 602
RecordNewRound: 9 个小局

已写出 .dareda-runs/majsoul-ws-1786618863235/record.json
下一步: dareda verify --record .dareda-runs/majsoul-ws-1786618863235/record.json
verify —— 配牌恒等自检 0.12 s · 峰值 20.7 MB · 退出码 0

dareda verify --record .dareda-runs/majsoul-ws-1786618863235/record.json

牌谱: majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  K = 9
牌山约定: dead_wall_tail
配牌恒等: 9/9 局通过
  ✓ 全部通过 —— 发牌顺序 / 赤宝编码 / 牌山定点均正确

王牌区布局:
  宝牌指示牌: ✓ 9/9
  里宝指示牌: ✓ 2/2
  岭上牌: 无样本 —— 未验证(牌谱里没开杠)
inspect —— 牌谱序列 0.09 s · 峰值 20.0 MB · 退出码 0

dareda inspect --record .dareda-runs/majsoul-ws-1786618863235/record.json

牌谱: majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3
玩家: 座0 健麻a / 座1 ただ風を待つ / 座2 坏耶这把铁飞 / 座3 刘树德
终局: 26600(3位) / 37200(1位) / 4300(4位) / 31900(2位)
序列 (K=9): 东一 / 东二 / 东三1本 / 东四 / 南一 / 南二 / 南三 / 南四 / 南四1本
  东一       庄=座0  本场=0  立直棒=0  点数=[25000, 25000, 25000, 25000]
  东二       庄=座1  本场=0  立直棒=0  点数=[23000, 29000, 23500, 24500]
  东三1本     庄=座2  本场=1  立直棒=0  点数=[23000, 29000, 23500, 24500]
  东四       庄=座3  本场=0  立直棒=0  点数=[21700, 29000, 23500, 25800]
  南一       庄=座0  本场=0  立直棒=0  点数=[21700, 32900, 23500, 21900]
  南二       庄=座1  本场=0  立直棒=0  点数=[21700, 34900, 21500, 21900]
  南三       庄=座2  本场=0  立直棒=0  点数=[20400, 34900, 21500, 23200]
  南四       庄=座3  本场=0  立直棒=0  点数=[26600, 34900, 15300, 23200]
  南四1本     庄=座3  本场=1  立直棒=0  点数=[26600, 34900, 6600, 31900]
replay(权重 A · 150k)—— 四家全 Mortal 3.44 s · 峰值 430.6 MB · 退出码 0

dareda replay --record .dareda-runs/majsoul-ws-1786618863235/record.json --model models/mortal_150k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  K=9
引擎 mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release

         | 人类原局                     | Mortal replay                
---------+------------------------------+------------------------------
最终名次 | 3位 / 1位 / 4位 / 2位        | 3位 / 2位 / 1位 / 4位        
最终点数 | 26600 / 37200 / 4300 / 31900 | 19200 / 35300 / 47000 / -1500
实际局数 | K = 9                        | K' = 4                       
终止原因 | —                            | 击飞                         

确定性标签: mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release

局           座0      座1      座2      座3  结果
东一      23700   24300   27700   24300  tsumo
东二      22200   23300   30700   23800  tsumo
东三1本   22200   23300   50000    4500  ron
东四      19200   35300   47000   -1500  tsumo
counterfactual(权重 A · 150k)—— 只 hero 换 Mortal 11.38 s · 峰值 434.7 MB · 退出码 0

dareda counterfactual --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --model models/mortal_150k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  K=9
英雄座 2 = 坏耶这把铁飞
引擎 mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2

         | 人类原局                     | Mortal replay                 
---------+------------------------------+-------------------------------
最终名次 | 3位 / 1位 / 4位 / 2位        | 2位 / 1位 / 4位 / 3位         
最终点数 | 26600 / 37200 / 4300 / 31900 | 48200 / 56100 / -16300 / 12000
实际局数 | K = 9                        | K' = 9                        
终止原因 | —                            | 击飞                          

确定性标签: mortal4-b40c192-t24011010|steps=150000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2

保真度(英雄=座2,对手照人类原样打):
  局              脱轨@事件     该局事件           忠实比例
  东一                49       62            79%
  东二                28      145            19%
  东三1本              全程       53     100%(全程一致)
  东四                23       45            51%
  南一                18       35            51%
  南二                20       39            51%
  南三                38       83            46%
  南四                40       95            42%
  南四1本              16       75            21%
  —— 1/9 局全程一致;忠实比例中位数 51%

局           座0      座1      座2      座3  结果
东一      37000   21000   21000   21000  tsumo
东二      37000   29700   21000   12300  ron
东三1本   35700   29700   21000   13600  ron
东四      35700   37700   21000    5600  ron
南一      48700   37700    9000    4600  ron
南二      50800   37200    8700    3300  tsumo
南三      48200   39800    8700    3300  ron
南四      48200   39800       0   12000  ron
南四1本   48200   56100  -16300   12000  ron
diagnose --with-selfluck(权重 A · 150k) 175.66 s · 峰值 426.1 MB · 退出码 0

dareda diagnose --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 30 --with-selfluck --model models/mortal_150k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  hero=座2(坏耶这把铁飞)  并行 4 进程

[1/3] 测四家强度...

[2/3] 均等水平基线 —— 这副牌本身值几位

  1/30
  2/30
  3/30
  4/30
  5/30
  6/30
  7/30
  8/30
  9/30
  10/30
  11/30
  12/30
  13/30
  14/30
  15/30
  16/30
  17/30
  18/30
  19/30
  20/30
  21/30
  22/30
  23/30
  24/30
  25/30
  26/30
  27/30
  28/30
  29/30
  30/30
[3/3] 真实水平 —— 加上各家实际打法

  1/30
  2/30
  3/30
  4/30
  5/30
  6/30
  7/30
  8/30
  9/30
  10/30
  11/30
  12/30
  13/30
  14/30
  15/30
  16/30
  17/30
  18/30
  19/30
  20/30
  21/30
  22/30
  23/30
  24/30
  25/30
  26/30
  27/30
  28/30
  29/30
  30/30
对手强度(相对 Mortal,在人类原局上测):
  座   玩家             决策     一致率   EV loss
  0   健麻a            93     53%     0.488
  1   ただ風を待つ         89     72%     0.257
  2   坏耶这把铁飞         74     72%     0.320
  3   刘树德            93     62%     0.369

=== 这把怪谁?  座2 坏耶这把铁飞 ===

  牌   ★★★★☆  好牌    均等水平下,这个座位期望 2.17 位
  打   ★★☆☆☆  打得一般  你的打法把期望推到 2.30 位(-0.13)   ← EV loss 0.32(四家第 2 低)
  运   ☆☆☆☆☆  运气背   你的同水平里,4 位或更差占 10%

  → 好牌,打得一般,而且这把运气还背。

  名次分解(以 2.5 位为中性起点,正数=对你有利):
    牌与座次 +0.33  +  打法 -0.13  +  运气 -1.70  =  -1.50
    (每条基线 30 次蒙特卡洛)

  这副牌上,你的名次概率(横条按 1/2/3/4 位切分,▲=实际):
  你的真实水平  [①①①①①①①②②②②②②②②②②②②②②③③③③③③③③③③③④④④④]  20%  40%  30%  10%  (实际 4 位)
                  1位       2位       3位       4位       

============================================================
同水平自打(= self-luck,复用上面第 3 步的轨迹,没有额外开销)
标定温度: {0: 1.17, 1: 1.0, 2: 1.0, 3: 1.13}

座  玩家           EV loss    实际     同水平期望     1位     2位     3位     4位
0  健麻a            0.488    3位     3.33     3%    13%    30%    53%
1  ただ風を待つ         0.257    1位     1.50    63%    23%    13%     0%
2  坏耶这把铁飞         0.320    4位     2.30    20%    40%    30%    10% ←你
3  刘树德            0.369    2位     2.87    13%    23%    27%    37%

座2 同水平自打分布  n=30  平均顺位 2.30  平均点数 26433
    1位  20.0%  ███████
    2位  40.0%  █████████████
    3位  30.0%  ██████████
    4位  10.0%  ███

实际 4 位;同水平自打期望 2.30 位。
  P(打到4位)=10%  P(≤4位,即这么差或更差)=10%  P(比4位更好)=90%
  判断:偏背 —— 你的同水平只有 10% 会打到 4 位或更差
replay(权重 B · 298k)—— 四家全 Mortal 8.42 s · 峰值 436.6 MB · 退出码 0

dareda replay --record .dareda-runs/majsoul-ws-1786618863235/record.json --model models/mortal_298k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  K=9
引擎 mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release

         | 人类原局                     | Mortal replay               
---------+------------------------------+-----------------------------
最终名次 | 3位 / 1位 / 4位 / 2位        | 3位 / 1位 / 2位 / 4位       
最终点数 | 26600 / 37200 / 4300 / 31900 | 11300 / 45200 / 35000 / 8500
实际局数 | K = 9                        | K' = 9                      
终止原因 | —                            | 走完                        

确定性标签: mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release

局           座0      座1      座2      座3  结果
东一      23700   24300   27700   24300  tsumo
东二      22700   31100   27700   18500  ron
东三1本   20600   29000   34000   16400  tsumo
东四      17600   41000   31000   10400  tsumo
南一      15600   45000   30000    9400  tsumo
南二      14100   43500   30500    9900  ryuukyoku
南三      13600   47500   29500    9400  tsumo
南四      12100   46000   31000    9900  ryuukyoku
南四1本   11300   45200   35000    8500  tsumo
counterfactual(权重 B · 298k)—— 只 hero 换 Mortal 6.12 s · 峰值 436.7 MB · 退出码 0

dareda counterfactual --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --model models/mortal_298k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  K=9
英雄座 2 = 坏耶这把铁飞
引擎 mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2

         | 人类原局                     | Mortal replay               
---------+------------------------------+-----------------------------
最终名次 | 3位 / 1位 / 4位 / 2位        | 3位 / 2位 / 4位 / 1位       
最终点数 | 26600 / 37200 / 4300 / 31900 | 18400 / 34500 / 6800 / 40300
实际局数 | K = 9                        | K' = 9                      
终止原因 | —                            | 走完                        

确定性标签: mortal4-b40c192-t26031702|steps=298000|device=cpu|amp=False|torch=2.13.0|libriichi=0.1.0/release|hero=2

保真度(英雄=座2,对手照人类原样打):
  局              脱轨@事件     该局事件           忠实比例
  东一                49       62            79%
  东二                28      145            19%
  东三1本              全程       53     100%(全程一致)
  东四                 8       45            18%
  南一                18       35            51%
  南二                20       39            51%
  南三                38       83            46%
  南四                全程       95     100%(全程一致)
  南四1本              16       75            21%
  —— 2/9 局全程一致;忠实比例中位数 51%

局           座0      座1      座2      座3  结果
东一      37000   21000   21000   21000  tsumo
东二      28000   21000   31000   20000  ron
东三1本   26700   21000   31000   21300  ron
东四      23700   33000   28000   15300  tsumo
南一      36700   33000   16000   14300  ron
南二      36200   34500   15500   13800  tsumo
南三      20200   34500   15500   29800  ron
南四      20200   34500    6800   38500  ron
南四1本   18400   34500    6800   40300  ron
diagnose --with-selfluck(权重 B · 298k) 177.17 s · 峰值 440.5 MB · 退出码 0

dareda diagnose --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 30 --with-selfluck --model models/mortal_298k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  hero=座2(坏耶这把铁飞)  并行 4 进程

[1/3] 测四家强度...

[2/3] 均等水平基线 —— 这副牌本身值几位

  1/30
  2/30
  3/30
  4/30
  5/30
  6/30
  7/30
  8/30
  9/30
  10/30
  11/30
  12/30
  13/30
  14/30
  15/30
  16/30
  17/30
  18/30
  19/30
  20/30
  21/30
  22/30
  23/30
  24/30
  25/30
  26/30
  27/30
  28/30
  29/30
  30/30
[3/3] 真实水平 —— 加上各家实际打法

  1/30
  2/30
  3/30
  4/30
  5/30
  6/30
  7/30
  8/30
  9/30
  10/30
  11/30
  12/30
  13/30
  14/30
  15/30
  16/30
  17/30
  18/30
  19/30
  20/30
  21/30
  22/30
  23/30
  24/30
  25/30
  26/30
  27/30
  28/30
  29/30
  30/30
对手强度(相对 Mortal,在人类原局上测):
  座   玩家             决策     一致率   EV loss
  0   健麻a            93     57%     0.424
  1   ただ風を待つ         89     72%     0.229
  2   坏耶这把铁飞         74     74%     0.224
  3   刘树德            93     61%     0.310

=== 这把怪谁?  座2 坏耶这把铁飞 ===

  牌   ★★★★☆  好牌    均等水平下,这个座位期望 2.10 位
  打   ★★☆☆☆  打得一般  你的打法把期望推到 2.13 位(-0.03)   ← EV loss 0.22(四家最低)
  运   ☆☆☆☆☆  运气背   你的同水平里,4 位或更差占 10%

  → 好牌,打得一般,而且这把运气还背。

  名次分解(以 2.5 位为中性起点,正数=对你有利):
    牌与座次 +0.40  +  打法 -0.03  +  运气 -1.87  =  -1.50
    (每条基线 30 次蒙特卡洛)

  这副牌上,你的名次概率(横条按 1/2/3/4 位切分,▲=实际):
  你的真实水平  [①①①①①①①①①①①②②②②②②②②②②②②②③③③③③③③③④④④④]  30%  37%  23%  10%  (实际 4 位)
                  1位       2位       3位       4位       

============================================================
同水平自打(= self-luck,复用上面第 3 步的轨迹,没有额外开销)
标定温度: {0: 1.11, 1: 1.0, 2: 1.0, 3: 1.02}

座  玩家           EV loss    实际     同水平期望     1位     2位     3位     4位
0  健麻a            0.424    3位     3.43     3%    13%    20%    63%
1  ただ風を待つ         0.229    1位     1.87    47%    33%     7%    13%
2  坏耶这把铁飞         0.224    4位     2.13    30%    37%    23%    10% ←你
3  刘树德            0.310    2位     2.57    20%    17%    50%    13%

座2 同水平自打分布  n=30  平均顺位 2.13  平均点数 31680
    1位  30.0%  ██████████
    2位  36.7%  ████████████
    3位  23.3%  ████████
    4位  10.0%  ███

实际 4 位;同水平自打期望 2.13 位。
  P(打到4位)=10%  P(≤4位,即这么差或更差)=10%  P(比4位更好)=90%
  判断:偏背 —— 你的同水平只有 10% 会打到 4 位或更差
montecarlo --sensitivity(权重 A · 150k) 104.42 s · 峰值 428.8 MB · 退出码 0

dareda montecarlo --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 20 --sensitivity --model models/mortal_150k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  hero=座2(坏耶这把铁飞)
测对手强度(在人类原局上)...
对手强度(相对 Mortal,在人类原局上测):
  座   玩家             决策     一致率   EV loss
  0   健麻a            93     53%     0.488
  1   ただ風を待つ         89     72%     0.257
  2   坏耶这把铁飞         74     72%     0.320
  3   刘树德            93     62%     0.369

=== 强度档 [full-mortal] 对手温度 {0: 1.0, 1: 1.0, 3: 1.0} ===
  四家全 greedy,轨迹完全确定 —— 只跑 1 条(跑 N 条是同一局算 N 遍)

  轨迹 1/1
座2 @ full-mortal  n=1  平均顺位 4.00  平均点数 -16300
    1位   0.0%  
    2位   0.0%  
    3位   0.0%  
    4位 100.0%  █████████████████████████████████

=== 强度档 [calibrated] 对手温度 {0: 1.17, 1: 1.0, 3: 1.13} ===

  轨迹 1/20
  轨迹 2/20
  轨迹 3/20
  轨迹 4/20
  轨迹 5/20
  轨迹 6/20
  轨迹 7/20
  轨迹 8/20
  轨迹 9/20
  轨迹 10/20
  轨迹 11/20
  轨迹 12/20
  轨迹 13/20
  轨迹 14/20
  轨迹 15/20
  轨迹 16/20
  轨迹 17/20
  轨迹 18/20
  轨迹 19/20
  轨迹 20/20
座2 @ calibrated  n=20  平均顺位 3.10  平均点数 16325
    1位  15.0%  █████
    2位  10.0%  ███
    3位  25.0%  ████████
    4位  50.0%  █████████████████

=== 强度档 [weaker] 对手温度 {0: 1.65, 1: 1.29, 3: 1.57} ===

  轨迹 1/20
  轨迹 2/20
  轨迹 3/20
  轨迹 4/20
  轨迹 5/20
  轨迹 6/20
  轨迹 7/20
  轨迹 8/20
  轨迹 9/20
  轨迹 10/20
  轨迹 11/20
  轨迹 12/20
  轨迹 13/20
  轨迹 14/20
  轨迹 15/20
  轨迹 16/20
  轨迹 17/20
  轨迹 18/20
  轨迹 19/20
  轨迹 20/20
座2 @ weaker  n=20  平均顺位 3.05  平均点数 16120
    1位   5.0%  ██
    2位  25.0%  ████████
    3位  30.0%  ██████████
    4位  40.0%  █████████████
montecarlo --sensitivity(权重 B · 298k) 90.59 s · 峰值 439.8 MB · 退出码 0

dareda montecarlo --record .dareda-runs/majsoul-ws-1786618863235/record.json --hero 2 --trials 20 --sensitivity --model models/mortal_298k.pth

牌谱 majsoul:260812-860b14a0-aa1c-414d-a468-81b51f2e32f3  hero=座2(坏耶这把铁飞)
测对手强度(在人类原局上)...
对手强度(相对 Mortal,在人类原局上测):
  座   玩家             决策     一致率   EV loss
  0   健麻a            93     57%     0.424
  1   ただ風を待つ         89     72%     0.229
  2   坏耶这把铁飞         74     74%     0.224
  3   刘树德            93     61%     0.310

=== 强度档 [full-mortal] 对手温度 {0: 1.0, 1: 1.0, 3: 1.0} ===
  四家全 greedy,轨迹完全确定 —— 只跑 1 条(跑 N 条是同一局算 N 遍)

  轨迹 1/1
座2 @ full-mortal  n=1  平均顺位 4.00  平均点数 6800
    1位   0.0%  
    2位   0.0%  
    3位   0.0%  
    4位 100.0%  █████████████████████████████████

=== 强度档 [calibrated] 对手温度 {0: 1.11, 1: 1.0, 3: 1.02} ===

  轨迹 1/20
  轨迹 2/20
  轨迹 3/20
  轨迹 4/20
  轨迹 5/20
  轨迹 6/20
  轨迹 7/20
  轨迹 8/20
  轨迹 9/20
  轨迹 10/20
  轨迹 11/20
  轨迹 12/20
  轨迹 13/20
  轨迹 14/20
  轨迹 15/20
  轨迹 16/20
  轨迹 17/20
  轨迹 18/20
  轨迹 19/20
  轨迹 20/20
座2 @ calibrated  n=20  平均顺位 3.60  平均点数 6680
    1位   5.0%  ██
    2位   5.0%  ██
    3位  15.0%  █████
    4位  75.0%  █████████████████████████

=== 强度档 [weaker] 对手温度 {0: 1.56, 1: 1.21, 3: 1.43} ===

  轨迹 1/20
  轨迹 2/20
  轨迹 3/20
  轨迹 4/20
  轨迹 5/20
  轨迹 6/20
  轨迹 7/20
  轨迹 8/20
  轨迹 9/20
  轨迹 10/20
  轨迹 11/20
  轨迹 12/20
  轨迹 13/20
  轨迹 14/20
  轨迹 15/20
  轨迹 16/20
  轨迹 17/20
  轨迹 18/20
  轨迹 19/20
  轨迹 20/20
座2 @ weaker  n=20  平均顺位 3.30  平均点数 11980
    1位  10.0%  ███
    2位  15.0%  █████
    3位  10.0%  ███
    4位  65.0%  ██████████████████████