feat(mc): 掷点测量修复批 A 案叠加实施——level_monte_carlo 增 unique 种子模式(2026-09-19 用户拍板 A/B 叠加)——①第 5 参 shared|unique(缺省 shared 旧行为零变更保同种子 A/B 对照;unique=逐局独立种子,每个 (种子,scope) 恰消费一次 → 聚合掷点统计回归标准二项分布、±2σ gate 口径重新有效——A 案本质=消除复用权重);②A+B 版两关 1200 局验证:d20 直方图全面干净(20 面值全落期望 ±2.3σ,对照 R2 版 18 点 +57%≈20σ)、nat20 5.12% 带内、双向暴击率对齐理论;敌→主角档位失真转为干净设计信号(全额 50.9%/-7.6σ、×0.25 档 15.0%/+15σ、EV 24.59%——护甲强化抬主角有效 AC ~1.5 点,归调参批裁决);压力面三批复测焊死(L1 完美档 87% R2/R3/A+B 同向同量级);③阶段一正式重跑数据=T220949/T221847,同种子历史坐标三重作废(R3+unique)可比性锚改挂本批;④gameplay 零改动(仅 MC 工具第 5 参)+报告 A 案落地节+台账 87
This commit is contained in:
1 parent
cc34f4371a
commit
129be45817
3 files changed
+42
-4
No files matched your search
@@ -48,6 +48,17 @@
|
||||
- 同种子历史坐标随 R3 改版整体作废(预期内,已登记 registry 批注)。
|
||||
- **遗留提示**:B 案消除的是"窄窗彩票被系统性放大",30 种子的窗口彩票噪声本身仍在(档位分布 gate 若按 ±2σ 独立样本口径判读仍会误报)——**建议阶段一正式重跑时叠加 A 案**(掷点统计面用宽种子带,如 4200+i×7919 × ≥100 种子),两案正交不冲突。
|
||||
|
||||
### A 案叠加落地结果(2026-09-19 用户拍板 A/B 叠加,同日实施收口)
|
||||
|
||||
- **实现**:`level_monte_carlo.gd` 增第 5 参种子模式 `shared|unique`(缺省 shared = 旧行为零变更,保留同种子 A/B 对照用法;unique = 逐局独立种子 seed0+全局序号)。unique 模式下每个 (种子, scope) 恰消费一次 → 聚合掷点统计回归标准二项分布,±2σ gate 口径重新有效——这是 A 案的本质:消除复用权重,而非换种子段。
|
||||
- **A+B 版模拟批重跑(两关 1200 局,逐局独立种子)验证**:
|
||||
- d20 直方图**全面干净**:20 面值全部落在期望 1011 的 ±2.3σ 内(对照:R2 版 18 点 +57%≈20σ);
|
||||
- nat20 暴击率 5.12%(带内 PASS);主角→敌 / 敌→主角暴击率 5.13%/5.09% 双向对齐理论;
|
||||
- **敌→主角档位分布失真仍在但已是干净设计信号**:全额 50.9%(理论 55%,-7.6σ)、×0.25 档 15.0%(理论 10%,+15σ)——指向主角有效 AC 被护甲强化(ac_up +1×2 层)供给抬高 ~1.5 点,EV 减免 24.59% 同源。此偏差**真实且显著**,归调参批裁决(重新校准 gate 把 AC 增益期计入理论模型,或调护甲供给);
|
||||
- 压力面第三次复测稳如磐石:L1 完美档基线格 87% 通关/承伤 16.8/p90 24——R2/R3/A+B 三批同向同量级,"压力不足"判定与 RNG 无关焊死;L2 完美档 87%/13.9·21;
|
||||
- 弃图率读数稳定(完美档 0.02-0.10 次/局,normal 0)。
|
||||
- **A+B 叠加后的验收口径状态**:掷点面 gate 判读从此有效;阶段一正式重跑数据 = 本批(T220949/T221847 两文件);同种子历史坐标已三重作废(R3 改版 + unique 模式),坐标可比性锚改为「本批 A+B 数据」。
|
||||
|
||||
---
|
||||
|
||||
## 阶段一:机制验收(日志批,gate 判读——全部受发现①污染,仅记录现状)
|
||||
|
||||
@@ -25,7 +25,15 @@
|
||||
|
||||
前位置
|
||||
|
||||
1. 概念原型验证:v2 核心假设 CONFIRMED,v3 终验待做(与标错惩罚实测合并为一次会话),REPORT 已归档 PROCEED
|
||||
- **更新于**:2026-09-19(**验收读数重测批·初稿**,独立 worktree 分支 `acceptance-rerun-20260919` 执行——主工作区并行会话改动零接触):按 docs/acceptance-ap6-ac.md v1.0 跑模拟批(两关×1200 局)+日志批,**真人批缺位**(3–5 局基线档待用户);**核心发现=掷点流结构性种子偏置**(派生种子头部面值聚类,单局 d20 不均匀、逐种子漂移 0%→20% 18 点率,阶段一档位/EV gate 失败归因于此)→ 建议新立项掷点修复批,曲线调参批门顺延其后;07⑦ 刷新经济基线已采(弃图率完美档 ~0.1 次/局、normal 0),阈值仍归调参批;判读报告 production/qa/acceptance-rerun-20260919.md,台账 84/85/86/87(A 案已叠加:MC unique 种子模式落地,掷点直方图全面干净,档位/EV 失真转为护甲强化供给的干净设计信号归调参批)
|
||||
- **在飞**:真人批 3–5 局(用户);掷点流种子偏置修复批(待立项拍板);表现层升级批未启动(前置 = 美术清单 P0 样张);两份美术清单合并待拍板
|
||||
- **阻塞等待**:曲线调参批(门 = 掷点修复批 + 阶段一重跑,原门「验收读数重测」已被本批初稿部分满足但读数受污染);状态层重设计批(临时值终值 + 池百分比量纲复核)
|
||||
- **锚点提交**:d236d9f 技能池新效应词汇批 · e66d156 充能退役+board_type · b51af08 结构修复批 · b7d1b56 收口杂项
|
||||
- **下一步顺序**:真人批合判读收批 → 掷点修复批(待拍板)→ 阶段一重跑 → 曲线调参批 → 状态层重设计批 → 魔法道具内容批 → 表现层升级批(详见 production/roadmap.md)
|
||||
- **并行会话标旗**:本分支只含 log_analysis.py 刷新两读数 + 07⑦ 基线注记 + 判读报告三件;主工作区未提交改动(CLAUDE.md/06/playnote/active.md + 未跟踪文件含 board_stat_probe.gd)归属并行会话未碰;主工作区 active.md 快照未同步本节(分支隔离),合并时需人工对账
|
||||
|
||||
## 项目当前位置
|
||||
型验证:v2 核心假设 CONFIRMED,v3 终验待做(与标错惩罚实测合并为一次会话),REPORT 已归档 PROCEED
|
||||
2. `/map-systems` 完成:20 系统四层分解 + GDD 设计顺序 + 优先级
|
||||
3. `/gate-check systems-design` 重审(2026-09-07):CONCERNS 无阻塞 → 登记级意见已清偿进 systems-index"门禁增补记录",stage.txt 已写入
|
||||
4. **数据配置 已收口**:两轮 /design-review(full + 同日 re-review)+ 独立 delta 复核 5/5 PASS → **Approved**(2026-09-07)。行动经济 定稿回填 ActionEconomyTable(AP 8/旗 4/停手 ×2/清图 ×1),数据配置 Tuning Knobs 对应条目已按定稿删除义务移除,registry 已登记 `action_economy`,索引补齐 冒险结构/战斗结算/地图战斗资源/元进度←数据配置 四边
|
||||
@@ -244,4 +252,9 @@
|
||||
93. **掷点发现根因修正批(2026-09-19,本会话——用户质询"为何用伪随机/有无修复方案"触发深勘)**:①修正内容=台账 84 首稿定性「派生种子首输出缺陷、玩家体验受损」**两项均推翻**——2000 跨步种子×头部 31 scope 等权对照 χ²=22.8 证明派生公式全局均匀(splitmix 混淆版 χ²=23.5 同干净);跨步种子窗口 χ²=26 正常 vs 连续 30 种子窗口 18 点 +35% 集中高权重头部。②修正后根因=**窄种子窗(连续 30 种子×头部 ~17~40 scope)×每种子 40 局复用**→窗口自身面值彩票放大 40 倍灌进聚合统计;真实玩家单局影响≈机会涨落(一局仅 17~40 掷,与均匀骰子运气不可区分),实害面=测量有效性(阶段一档位/EV gate 读数失真归因于此,不能算机制/数值账);同构隐患=五条流共享消费模式。③修复三案呈报:A 宽种子带掷点扫描批(推荐,零游戏代码,保 4200–4229 子段可比性)/B rng_service master 混淆加固(可选,保逐 scope 回放语义,黄金向量重登记)/C 真随机+逐次记录(用户原提案,评估后不推荐——存档契约/反事实重算/回放语义全重做+文件无限增长,被 A/B 以小代价覆盖);共性注记=单局运气窗是骰子本性,修复对象是系统性放大。④判读报告核心发现节已重写(修正记录留痕),待用户选案后执行。
|
||||
|
||||
85. **掷点发现根因修正批(2026-09-19,本会话——用户质询"为何用伪随机/有无修复方案"触发深勘)**:①修正内容=台账 84 首稿定性「派生种子首输出缺陷、玩家体验受损」**两项均推翻**——2000 跨步种子×头部 31 scope 等权对照 χ²=22.8 证明派生公式全局均匀(splitmix 混淆版 χ²=23.5 同干净);跨步种子窗口 χ²=26 正常 vs 连续 30 种子窗口 18 点 +35% 集中高权重头部。②修正后根因=**窄种子窗(连续 30 种子×头部 ~17~40 scope)×每种子 40 局复用**→窗口自身面值彩票放大 40 倍灌进聚合统计;真实玩家单局影响≈机会涨落(一局仅 17~40 掷,与均匀骰子运气不可区分),实害面=测量有效性(阶段一档位/EV gate 读数失真归因于此,不能算机制/数值账);同构隐患=五条流共享消费模式。③修复三案呈报:A 宽种子带掷点扫描批(推荐,零游戏代码,保 4200–4229 子段可比性)/B rng_service master 混淆加固(可选,保逐 scope 回放语义,黄金向量重登记)/C 真随机+逐次记录(用户原提案,评估后不推荐——存档契约/反事实重算/回放语义全重做+文件无限增长,被 A/B 以小代价覆盖);共性注记=单局运气窗是骰子本性,修复对象是系统性放大。④判读报告核心发现节已重写(修正记录留痕),待用户选案后执行。
|
||||
<<<<<<< HEAD
|
||||
94. **掷点测量修复批 B 案实施批(2026-09-19,本会话——用户拍板「选择B方案」后同日执行收口)**:①实现=rng_service.gd R2→R3:derive = mix64(SALT XOR wrap64(master + scope×GOLDEN)),splitmix64 finalizer 变体(乘数 0xBF58476D1CE4E5B9/0x94D049BB133111EB 分段常量、加数同 GOLDEN_RATIO);关键技术点=**全程 OUT_MASK 63 位掩码**——有符号 int64 算术移位在 63 位正值域与逻辑移位逐位一致,这是与 Python 参考实现对齐的关键(首版 64 位掩码镜像曾出现向量漂移即此因);逐 scope 复放/计数器/存档快照三契约不变。②黄金向量 8 常量重登记(smoke R3 断言+registry stream_seed_derivation 条目含 finalizer_mix 属性+impl_spec 补掩码规约+批注),Python 参考实现与 GDScript 逐位交叉验证一致,R2 旧向量作废。③验证=全量冒烟 316 项 0 失败三闸全过(317→316 系「探针首掷暴击」条件断言在新序列下不触发,良性非丢失);R3 版 MC 两关 1200 局重跑:18 点异常消失(1740→846 回期望带,残差=30 种子窗口彩票理论噪声),nat20 5.92% PASS,**敌→主角 EV 25.6% 仍高但转为干净读数**——档位 ×0.25 档 16.6%/全额 50.0% 指向护甲强化抬主角有效 AC ~1.2 点,B 案清除 RNG 噪声后首个真实设计信号,归调参批;压力面 L1 完美档 87%/承伤 17.0/p90 24 与改版前同向同量级(判定稳健),阶段二仍顺延调参批。④遗留=A/B 两案正交——30 种子窗口彩票噪声仍在,阶段一正式重跑建议叠加 A 案宽种子带(报告已注记);同种子历史坐标随 R3 作废(registry 批注留痕)。⑤诊断探针 rng_verify_probe.gd 用后即删;中断重启的首次 R3 半程日志(T212718)弃用,重跑完整批(T214329/T215335)为权威数据。
|
||||
=======
|
||||
86. **掷点测量修复批 B 案实施批(2026-09-19,本会话——用户拍板「选择B方案」后同日执行收口)**:①实现=rng_service.gd R2→R3:derive = mix64(SALT XOR wrap64(master + scope×GOLDEN)),splitmix64 finalizer 变体(乘数 0xBF58476D1CE4E5B9/0x94D049BB133111EB 分段常量、加数同 GOLDEN_RATIO);关键技术点=**全程 OUT_MASK 63 位掩码**——有符号 int64 算术移位在 63 位正值域与逻辑移位逐位一致,这是与 Python 参考实现对齐的关键(首版 64 位掩码镜像曾出现向量漂移即此因);逐 scope 复放/计数器/存档快照三契约不变。②黄金向量 8 常量重登记(smoke R3 断言+registry stream_seed_derivation 条目含 finalizer_mix 属性+impl_spec 补掩码规约+批注),Python 参考实现与 GDScript 逐位交叉验证一致,R2 旧向量作废。③验证=全量冒烟 316 项 0 失败三闸全过(317→316 系「探针首掷暴击」条件断言在新序列下不触发,良性非丢失);R3 版 MC 两关 1200 局重跑:18 点异常消失(1740→846 回期望带,残差=30 种子窗口彩票理论噪声),nat20 5.92% PASS,**敌→主角 EV 25.6% 仍高但转为干净读数**——档位 ×0.25 档 16.6%/全额 50.0% 指向护甲强化抬主角有效 AC ~1.2 点,B 案清除 RNG 噪声后首个真实设计信号,归调参批;压力面 L1 完美档 87%/承伤 17.0/p90 24 与改版前同向同量级(判定稳健),阶段二仍顺延调参批。④遗留=A/B 两案正交——30 种子窗口彩票噪声仍在,阶段一正式重跑建议叠加 A 案宽种子带(报告已注记);同种子历史坐标随 R3 作废(registry 批注留痕)。⑤诊断探针 rng_verify_probe.gd 用后即删;中断重启的首次 R3 半程日志(T212718)弃用,重跑完整批(T214329/T215335)为权威数据。
|
||||
87. **掷点测量修复批 A 案叠加实施批(2026-09-19,本会话——用户拍板「把A方案也叠加进去」)**:①实现=level_monte_carlo.gd 增第 5 参种子模式 shared|unique(缺省 shared 旧行为零变更保同种子 A/B 对照用法;unique=逐局独立种子,每个 (种子,scope) 恰消费一次 → 聚合掷点统计回归标准二项分布、±2σ gate 口径重新有效——A 案本质=消除复用权重而非换种子段)。②A+B 版两关 1200 局重跑验证:d20 直方图全面干净(20 面值全落期望 ±2.3σ,对照 R2 版 18 点 +57%≈20σ)、nat20 5.12% 带内、双向暴击率对齐理论;敌→主角档位分布失真仍在但已是干净设计信号(全额 50.9%/-7.6σ、×0.25 档 15.0%/+15σ、EV 24.59%——护甲强化抬主角有效 AC ~1.5 点,真实且显著,归调参批裁决:gate 计入 AC 增益期或调护甲供给);压力面第三批复测焊死(L1 完美档 87%/16.8·p90 24,R2/R3/A+B 三批同向同量级);弃图率稳定(完美档 0.02-0.10/局、normal 0)。③A+B 叠加后阶段一正式重跑数据=T220949/T221847 两文件;同种子历史坐标三重作废(R3+unique),可比性锚改挂本批 A+B 数据。④报告补 A 案落地节+台账 87;gameplay 代码零改动(仅 MC 工具第 5 参)。
|
||||
>>>>>>> 2d0e052 (feat(mc): 掷点测量修复批 A 案叠加实施——level_monte_carlo 增 unique 种子模式(2026-09-19 用户拍板 A/B 叠加)——①第 5 参 shared|unique(缺省 shared 旧行为零变更保同种子 A/B 对照;unique=逐局独立种子,每个 (种子,scope) 恰消费一次 → 聚合掷点统计回归标准二项分布、±2σ gate 口径重新有效——A 案本质=消除复用权重);②A+B 版两关 1200 局验证:d20 直方图全面干净(20 面值全落期望 ±2.3σ,对照 R2 版 18 点 +57%≈20σ)、nat20 5.12% 带内、双向暴击率对齐理论;敌→主角档位失真转为干净设计信号(全额 50.9%/-7.6σ、×0.25 档 15.0%/+15σ、EV 24.59%——护甲强化抬主角有效 AC ~1.5 点,归调参批裁决);压力面三批复测焊死(L1 完美档 87% R2/R3/A+B 同向同量级);③阶段一正式重跑数据=T220949/T221847,同种子历史坐标三重作废(R3+unique)可比性锚改挂本批;④gameplay 零改动(仅 MC 工具第 5 参)+报告 A 案落地节+台账 87)
|
||||
@@ -3,10 +3,17 @@
|
||||
# 关卡期望扫描(难度曲线与Boss 调参期关卡侧批量工具的原型——对应 棋盘生成 F4 / 战斗侧 monte_carlo.gd):
|
||||
# 扫描 atk% × hp% 网格(模拟天赋树数值提升档位),输出每档"通关率 / 整关承伤期望 / 败北节点分布 /
|
||||
# 通关剩余 HP 期望 / 进 Boss HP 期望 / 平均轮数"——把"多少数值能通关、通关要掉多少血"变成可测量数据。
|
||||
# 运行:Godot_console.exe --headless --path . --script res://smoke/level_monte_carlo.gd -- [N] [seed0]
|
||||
# 运行:Godot_console.exe --headless --path . --script res://smoke/level_monte_carlo.gd -- [N] [seed0] [normal|perfect|both] [level_index] [shared|unique]
|
||||
# 种子模式(2026-09-19 掷点测量修复批 A 案):shared(默认,旧行为)= 同批次全部格子×策略共用种子
|
||||
# seed0+i——同种子历史坐标可比,但同一 (种子, scope) 被反复消费,聚合掷点统计被头部窗口彩票放大
|
||||
# (验收重测批实证);unique = 逐局独立种子(seed0 + 全局递增序号),每个掷点恰消费一次 → 聚合
|
||||
# 掷点统计回归标准二项分布(±2σ gate 口径重新有效)。验收掷点面用 unique;同种子 A/B 对照用 shared。
|
||||
extends SceneTree
|
||||
|
||||
|
||||
var _run_cursor := 0 # unique 模式全局局序号(seed = seed0 + cursor)
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
var args := OS.get_cmdline_user_args()
|
||||
var n := 30
|
||||
@@ -42,9 +49,14 @@ func _initialize() -> void:
|
||||
policies = ["perfect"]
|
||||
elif policy_arg == "both":
|
||||
policies = ["normal", "perfect"]
|
||||
# 种子模式(掷点测量修复批 A 案——见文件头注记):缺省 shared = 旧行为零变更
|
||||
var seed_mode := "shared"
|
||||
if args.size() >= 5 and args[4] in ["shared", "unique"]:
|
||||
seed_mode = args[4]
|
||||
var atk_axis: Array = [0, 50, 100, 150, 200]
|
||||
var hp_axis: Array = [0, 100]
|
||||
print("=== 关卡期望扫描:level %d · N=%d/格 · 种子 %d+%d · 策略=%s ===" % [level_arg, n, seed0, n, policy_arg])
|
||||
var seed_label := "种子 %d+%d" % [seed0, n] if seed_mode == "shared" else "种子 %d 起逐局独立" % seed0
|
||||
print("=== 关卡期望扫描:level %d · N=%d/格 · %s · 策略=%s · 种子模式=%s ===" % [level_arg, n, seed_label, policy_arg, seed_mode])
|
||||
print("%-6s %-10s %-8s %-14s %-14s %-14s %-10s %-12s %-12s %-10s %-10s %-8s %-8s" % ["策略", "atk%/hp%", "通关率", "整关承伤均/p90", "通关剩余HP均(胜)", "进BossHP均", "平均轮数", "踩雷/战", "普通承伤/场%", "跳战率", "Boss承伤%", "踩雷/局", "刷新/局"])
|
||||
var perfect_mine_total := 0 # 完美档构造保证 = 零踩雷(只挖已证安全格)——扫描末断言
|
||||
for policy in policies:
|
||||
@@ -65,7 +77,9 @@ func _initialize() -> void:
|
||||
var mine_per_run: Array = []
|
||||
var refresh_per_run: Array = []
|
||||
for i in range(n):
|
||||
var st = autoplay.run_level(db, seed0 + i, level_arg, atk_pct, hp_pct, true, logger, policy)
|
||||
var seed_val := seed0 + i if seed_mode == "shared" else seed0 + _run_cursor
|
||||
_run_cursor += 1
|
||||
var st = autoplay.run_level(db, seed_val, level_arg, atk_pct, hp_pct, true, logger, policy)
|
||||
dmg_all.append(st.hero_dmg)
|
||||
rounds_all.append(st.rounds)
|
||||
mine_per_run.append(int(st.mine_hits))
|
||||
|
||||
Reference in new issue
Block a user