盲盒概率推测 · Blind-box Clue Probability
一张盲盒线索图,每个盒子标了两个"错误选项"。本 Skill 据此穷举所有合法摆放, 算出每个品种落在每个盒子的概率;更能按你的购买目标(想要 / 避开 / 购买顺序) 给出最优抽盒顺序,用最少次数抽到想要的款式。
✨ 功能亮点
- 概率统计表:穷举全部合法排列,输出每个品种 × 每个盒子的百分比概率(Markdown 表)。
- 线索图识别:读图片自动识别品种、盒子编号、每盒的两个错误选项(也支持文字线索)。
- 最优抽盒顺序:按目标自动选模式,输出期望抽中次数、平均撞坑次数、budget 成功率、首抽建议与应对表。
- 三种目标模式(从自然语言自动解析):
- 任一模式:
想要 A 或 B→ 抽到任一款即停 - 集齐模式:
想要 A 和 B→ 集齐全部 - 有序集齐:
想要先 A 再 B→ 按声明优先级有序集齐(购买顺序会影响期望次数) - 叠加项:
不想要 / 避开 C→ 尽量避开该款式
- 任一模式:
🎯 适用场景 / 触发词
- 发来盲盒线索图 / 排除线索,问"每个品种在哪个盒子概率最大"
- 问"应该按什么顺序抽盒最划算 / 最快抽到想要的"
- 触发词示例:盲盒概率、线索图推测、抽盒顺序、最优抽盒、想要 A 不想要 B、先买 A 再买 B、blind box probability、optimal draw order
📦 安装
本地安装(从 zip):
- 解压
blindbox-clue-probability.zip。 - 把解压出的
blindbox-clue-probability/目录放到技能目录:- 用户级:
~/.workbuddy/skills/blindbox-clue-probability/ - 项目级:
<项目>/.workbuddy/skills/blindbox-clue-probability/
- 用户级:
- 在 WorkBuddy 的「技能」面板中启用即可。
引擎为纯 Python(仅用标准库
itertools、argparse、json),无需任何第三方依赖。 Python 3.8+ 即可运行。
📂 文件结构
blindbox-clue-probability/
├── SKILL.md # 工作流与算法说明(Agent 读取)
├── README.md # 本文件
├── scripts/
│ ├── blindbox.py # 穷举 + 概率表引擎
│ └── draw_order.py # 最优抽盒顺序引擎(依赖 blindbox.py)
└── references/
└── spec_format.md # 约束规格 JSON 格式与目标参数说明
🚀 快速上手
Workflow A — 概率统计表
- 把线索整理成规格 JSON(见
references/spec_format.md):
{
"products": ["雪人的抱抱","晚霞棉花糖","雨天小铠甲","大风中凌乱","高电量警告","背着太阳跑"],
"boxes": ["1","2","3","4","5","6"],
"exclusions": {
"1": ["雪人的抱抱","晚霞棉花糖"],
"2": ["晚霞棉花糖","雨天小铠甲"],
"3": ["雨天小铠甲","大风中凌乱"],
"4": ["高电量警告","雨天小铠甲"],
"5": ["背着太阳跑","雨天小铠甲"],
"6": ["雪人的抱抱","背着太阳跑"]
},
"fixed": {}
}
- 运行:
python3 scripts/blindbox.py spec.json
# 或:echo '{...}' | python3 scripts/blindbox.py
输出:合法排列总数 + 各盒可能品种 + 概率分布表(每行之和 = 100%)。
Workflow B — 最优抽盒顺序
# 自然语言目标:集齐 A 和 B,避开 C
python3 scripts/draw_order.py spec.json \
--goal-text "我想要背着太阳跑和晚霞棉花糖,不想要雨天小铠甲"
# 结构化参数:有序集齐 + 限定 4 抽内成功率
python3 scripts/draw_order.py spec.json \
--want 雨天小铠甲,背着太阳跑 --mode ordered --order 雨天小铠甲,背着太阳跑 --budget 4
# 单一想要、尽量避开
python3 scripts/draw_order.py spec.json \
--goal-text "我想要背着太阳跑,不想要雨天小铠甲"
输出:模式解析、期望抽中次数、平均撞坑次数、budget 内成功率、推荐第一抽、 首抽各盒评估表、首抽应对表(自适应策略)。有序模式还会对比"顺序反过来"的期望次数。
⚙️ 命令行参数参考(draw_order.py)
| 参数 | 说明 |
|------|------|
| spec | 约束规格 JSON 路径,- 表示从 stdin 读 |
| --goal-text | 自然语言目标,如 我想要A和B,不想要C |
| --want | 逗号分隔的想要款式 |
| --avoid | 逗号分隔的避开款式 |
| --mode | any / collect / ordered |
| --order | 逗号分隔的有序目标(mode=ordered 时用) |
| --lambda | avoid 惩罚权重,默认 1.0,越大越避开 |
| --budget | 最多抽几个盒子,用于统计成功率 |
款式名必须与
products列表完全一致(引擎会告警未知款式)。
🧠 算法要点
- 概率表:对全部
N!排列穷举过滤(N ≤ 8 日常完全可用),统计频次得概率。 - 任一模式 / 集齐无序:在全部合法排列上做 expectimax,每步选"期望代价最低"的未开盒;
代价 = 1(本次抽取)+
λ·I(开出 avoid)。 - 集齐有序:严格按声明优先级,每步先开"最可能有当前最高优先级剩余款式"的盒。 因此推荐首抽未必是原始期望最低盒——这正是"先买哪个"的优先级权衡。
- 抽盒为不放回,策略是自适应的:每开一盒后根据 revealed 内容更新后验再决定下一抽。
⚠️ 边界情况
- 穷举复杂度
O(N!)。品种数过大(N > 10 左右)会明显变慢,建议缩小规模。 - 同一品种在同一盒既被排除又被固定会触发合法性报错。
- 概率表每行之和 = 100%(每个品种必然落在某盒),可用此校验读图是否漏看。
- 合法排列数 > 1 → 线索不足以唯一确定,可补充
fixed收敛;= 0 → 线索自相矛盾。
📄 许可
技能由用户自行创建,供个人使用与分享。
Scan to join WeChat group