Releases: fcy10012/-Probability-calculator
Releases · fcy10012/-Probability-calculator
版本 v1.1.0 - 重要错误修复
修复内容: 1. 修复probability_calculator.py中的语法错误(多余的}括号) 2. 修复JSON序列化导致的KeyError问题(字符串/整数键兼容性) 3. 修复interactive_app.py中的KeyError: 'discard_bag'错误 4. 添加对discard_hand和discard_bag操作类型的完整支持 5. 更新操作类型映射和显示逻辑 此版本解决了用户遇到的关键运行时错误,确保程序稳定运行。
zip文件
多袋摸球概率计算器 🎲
这是一个用于计算复杂多袋摸球问题概率的专业工具。支持精确计算和蒙特卡洛模拟两种方法。
🌟 功能特点
- 通用性: 支持任意数量的袋子和球颜色
- 灵活操作: 支持摸球、丢球、放回三种操作类型
- 双计算模式:
- 🔢 精确计算: 使用组合数学进行精确计算(状态空间遍历)
- 🎲 蒙特卡洛模拟: 使用随机模拟进行快速近似
- 交互界面: 提供友好的命令行交互界面
- 配置保存: 支持保存和加载问题配置
- 结果导出: 计算结果保存为JSON格式
📁 项目结构
.
├── 📄 config_wizard.py # ✅ NEW! 配置向导程序(用户友好界面)
├── 📄 calculate_from_file.py # ✅ NEW! 从配置文件计算
├── 📄 main.py # 主程序入口(直接运行原始问题)
├── 📄 interactive_app.py # 交互式应用程序
├── 📄 probability_calculator.py # 核心计算引擎
├── 📄 example_config.py # 示例问题配置
├── 📄 requirements.txt # 依赖说明
└── 📄 README.md # 本文件
🆕 新功能介绍
1. config_wizard.py - 配置向导
交互式配置摸球问题,支持:
- 自定义袋子数量和内容
- 分步配置操作序列(最多10步)
- 四种操作类型:摸球、丢袋球、丢手球、放回球
- 自动验证和保存配置
- 支持立即计算或稍后计算
2. calculate_from_file.py - 文件计算器
从JSON配置文件计算概率,支持:
- 命令行参数控制
- 精确计算和蒙特卡洛模拟两种模式
- 结果自动保存为JSON文件
🚀 快速开始
方法1: 使用配置向导(推荐)
python config_wizard.py这将启动用户友好的配置向导,引导您:
- 设置问题描述
- 自定义袋子:指定袋子数量和每种颜色的球数
- 配置操作序列:最多10步操作,包括:
- 从袋子摸球
- 从袋子丢球
- 从手中丢球
- 放回球到袋子
- 自动验证:检查配置有效性
- 保存配置:生成JSON配置文件
- 立即计算:选择计算方法并直接计算
方法2: 从配置文件计算
python calculate_from_file.py user_problem.json从现有的配置文件计算概率。支持:
exact:精确计算 -python calculate_from_file.py 文件.json exactmonte:蒙特卡洛模拟 -python calculate_from_file.py 文件.json monte 100000
方法3: 直接运行原始问题
python main.py这将直接计算您提出的复杂4袋摸球问题。
方法4: 交互式应用程序
python interactive_app.py这将启动交互式界面,您可以:
- 查看示例问题
- 自定义新问题
- 选择计算方法
- 保存和加载配置
🎯 原始问题描述
袋子配置:
- 袋子1: 3个黄球(Y),5个白球(W)
- 袋子2: 1个蓝球(B),1个紫球(P)
- 袋子3: 2个蓝球(B),1个黄球(Y)
- 袋子4: 1个黄球(Y),5个蓝球(B)
操作步骤:
- 从袋子1摸两个球
- 从袋子1丢掉两个球
- 再从袋子1摸一个球
- 从袋子2摸一个球
- 从袋子3摸一个球
- 将自己手中的球放回袋子3一个
- 从袋子4摸两个球
- 放回一个球到袋子1
- 再从袋子1摸一个球
📊 计算方法
1. 精确计算(组合数学)
- 使用状态空间遍历
- 计算所有可能结果的精确概率
- 适用于状态空间较小的问题
- 结果100%准确
2. 蒙特卡洛模拟
- 使用随机抽样进行模拟
- 可指定模拟次数(默认100,000次)
- 适用于复杂问题,状态空间太大时
- 结果为近似值,但精度可通过增加模拟次数提高
🛠️ 自定义问题
袋子配置格式:
bags_config = {
1: {"红": 3, "蓝": 5}, # 袋子1: 3红球, 5蓝球
2: {"绿": 2, "黄": 4}, # 袋子2: 2绿球, 4黄球
3: {"白": 1, "黑": 2}, # 袋子3: 1白球, 2黑球
}操作序列格式:
operations = [
{"bag_id": 1, "draw_count": 2, "operation_type": "draw"}, # 从袋子1摸2个球
{"bag_id": 1, "draw_count": 1, "operation_type": "discard"}, # 从袋子1丢1个球
{"bag_id": 2, "draw_count": 1, "operation_type": "draw"}, # 从袋子2摸1个球
{"bag_id": 1, "draw_count": 1, "operation_type": "return"}, # 放回1个球到袋子1
]操作类型:
"draw": 从指定袋子摸球"discard": 从指定袋子丢球(随机丢)"return": 从手中随机放回一个球到指定袋子
📈 输出结果
程序会输出:
- 总状态数
- 总概率(应该接近1.0)
- 手上球的最终分布(按概率降序排列)
- 不同结果的数量
- 期望的各颜色球数(精确计算时)
结果示例:
🏆 手上球的最终分布:
1. 2Y+3W+3B : 0.127046 (12.70%)
2. 2Y+3W+2B+1P : 0.083806 (8.38%)
3. 3Y+3W+2B : 0.063842 (6.38%)
...
📋 总共的不同结果: 39种手上球的组合
⚙️ 系统要求
- Python 3.7+
- 无需额外安装包(使用标准库)
- 推荐使用Python虚拟环境
📝 技术实现细节
核心算法:
-
状态表示:
- 使用字典表示袋子状态:{颜色: 数量}
- 使用Counter表示手中球状态
-
精确计算:
- 递归遍历所有可能的状态转移
- 使用组合数学计算每一步的概率
- 合并相同状态以减少状态空间
-
蒙特卡洛模拟:
- 随机抽样模拟整个过程
- 使用大数定律逼近真实概率
- 提供进度显示
-
优化策略:
- 状态剪枝:当状态过多时,只保留概率最高的状态
- 缓存机制:避免重复计算
- 惰性计算:只在需要时展开状态
🧪 测试与验证
系统内置验证功能:
- 配置有效性检查
- 概率总和验证(应接近1.0)
- 边界情况处理
🔍 常见问题
Q: 精确计算太慢怎么办?
A: 对于复杂问题,建议使用蒙特卡洛模拟。增加模拟次数可以提高精度。
Q: 总概率不等于1怎么办?
A: 可能原因:
- 蒙特卡洛模拟的统计误差(增加模拟次数)
- 精确计算的舍入误差(正常现象)
- 程序错误(检查配置)
Q: 可以处理多少个袋子?
A: 理论上无限制,但状态空间随袋子和操作数量指数增长。
Q: 支持哪些颜色?
A: 任意字符串作为颜色标识,如"红"、"蓝"、"Y"、"W"等。
📄 许可证
本项目仅供学习和研究使用。
🤝 贡献
欢迎提出问题、建议和改进!
📞 支持
如有问题,请查看代码注释或直接运行程序查看帮助信息。
开始使用: python main.py 或 python interactive_app.py
Happy Calculating! 🎲🧮📊
Full Changelog: https://github.com/fcy10012/-Probability-calculator/commits/release