盲盒概率推测 (Blind-box Clue Probability)
Purpose
用户准备买盲盒(或玩"抽盒"游戏),会拿到一张线索图:图上按盒子排布,每个
盒子标注了两个错误选项(即"这个盒子里一定不是 X、不是 Y")。本 Skill 根据这些
排除线索,穷举所有合法摆放方式,计算每个品种落在每个盒子里的百分比概率,并
输出一张清晰的统计表。若用户额外给出了已确定的分配(如"4 号就是雨"),也一并纳入。
When to use
- 用户发来一张盲盒线索图 / 排除线索,问"每个品种在哪个盒子的概率最大"。
- 用户给出若干盒子、每个盒子排除几个品种,要求推测概率分布。
- 任何需要把"排除法线索"转换为"概率统计表"的盲盒/抽卡/分配类问题。
- 用户已确定想买哪些款式、避开哪些款式,问"应该按什么顺序抽盒最划算 / 最快抽到想要的"。
- 触发语包括:抽盒顺序、最优抽盒、想要 A 不想要 B、先买 A 再买 B、盲盒怎么抽。
Workflow
1. 解析线索(从图片或文字提取约束)
- 若用户提供图片:使用 Read 工具读取该图片(支持多模态),识别:
- 全部品种/产品名称(如 风、雨、阳、电、霞、雪)。
- 盒子编号(1 号、2 号……或任意标签)。
- 每个盒子标注的两个错误选项(被排除的品种)。注意图片可能用"✗""不是"
"排除"等标记,也可能用灰色/划掉的写法,需准确识别。 - 若用户提供文字:直接整理出上述三项。
- 把识别结果先以表格形式复述给用户确认,避免认错线索。
2. 构建约束规格 JSON
按 references/spec_format.md 的格式,写出一份规格,例如:
{
"products": ["风","雨","阳","电","霞","雪"],
"boxes": ["1","2","3","4","5","6"],
"exclusions": {
"1": ["雨","风"],
"2": ["雨","雪"],
"3": ["风","阳"],
"4": ["雪","霞"],
"5": ["风","电"],
"6": ["雨","阳"]
},
"fixed": {}
}
exclusions:每个盒子一定不包含的品种(线索图上的两个错误选项)。fixed(可选):用户明确确定的分配,如"4": "雨"。
3. 运行计算引擎
将规格写入临时文件(如 /tmp/blindbox_spec.json),执行:
python3 scripts/blindbox.py /tmp/blindbox_spec.json
也可从 stdin 传入:echo '{...}' | python3 scripts/blindbox.py。
引擎会输出:
- 满足约束的合法排列总数;
- 每个盒子可能的品种清单;
- 概率分布文本表 + Markdown 统计表。
4. 呈现结果
- 直接把 Markdown 统计表展示给用户。
- 补充"最可能"提示:例如"阳最可能出现在 5 号(47.6%)"。
- 若合法排列数 > 1,说明线索不足以唯一确定,提示用户可补充更多确定项
(如再固定某盒品种)以收敛;若合法排列数 = 0,说明线索自相矛盾,请用户复核图片。
Workflow B — 最优抽盒顺序(基于目标 want / avoid / 顺序)
在 Workflow A(拿到概率表、确认约束正确)的基础上,进一步按用户的购买目标
给出抽盒顺序。目标可由自然语言直接解析,也可结构化传参。
1. 解析用户的购买目标
询问或直接解析用户想要的 / 想避开的款式,以及集齐时是否有优先级:
"我想要 A 或 B"→ 任一模式(want 中抽到任一款即停)"我想要 A 和 B"(及 / 并列)→ 集齐模式(无序)"我想要 先 A 再 B"/"A 然后 B"→ 集齐模式(有序,按声明优先级)"不想要 / 避开 C"→ avoid 惩罚(与上述任意模式叠加)
也可结构化传参:--want A,B --avoid C --mode collect --order A,B。
2. 运行抽盒顺序引擎
将 Workflow A 生成的规格文件与目标的文字一并交给引擎:
# 自然语言目标
python3 scripts/draw_order.py /tmp/spec.json \
--goal-text "我想要背着太阳跑和晚霞棉花糖,不想要雨天小铠甲"
# 结构化目标
python3 scripts/draw_order.py /tmp/spec.json \
--want 背着太阳跑,晚霞棉花糖 --avoid 雨天小铠甲 --mode collect
# 有序 + 限定预算(统计 N 抽内成功率)
python3 scripts/draw_order.py /tmp/spec.json \
--goal-text "我想要先雨天小铠甲再背着太阳跑" --budget 4
3. 引擎输出解读
- 模式解析 与
λ(避开惩罚权重)。 - 期望抽中次数 / 平均撞到 avoid 盒数 / budget 内成功率。
- 推荐第一抽 + 首抽各盒评估表(若以此盒为首抽的期望抽中次数)。
- 首抽应对表:第一抽开出某款时,下一抽建议开哪个盒(自适应策略)。
- 有序模式会额外对比"顺序反过来"的期望次数,印证购买顺序会影响期望次数。
4. 算法要点
- 任一模式 / 集齐无序:在全部合法排列上做 expectimax,每步选"期望代价最低"
的未开盒;代价 = 1(本次抽取)+λ·I(开出 avoid)。 - 集齐有序:严格按声明优先级,每步先开"最可能有当前最高优先级剩余款式"的盒。
因此推荐首抽未必是原始期望最低盒——这正是"先买哪个"带来的优先级权衡。 - 抽盒为不放回,策略是自适应的:每开一盒后根据 revealed 内容更新后验再决定下一抽。
Notes / 边界情况
- 穷举复杂度为 N!(N 为品种数)。日常盲盒 N 通常 ≤ 8,完全可用;若 N 过大
会较慢,可提示用户缩小规模。 - 同一品种在同一张图上既被排除又被固定会触发合法性报错,引擎会拒绝执行。
- 概率表每一行之和 = 100%(每个品种必然落在某个盒子里),可用此校验读图是否漏看。