Skip to content

Releases: fcy10012/-Probability-calculator

版本 v1.1.0 - 重要错误修复

19 Dec 04:53
f8dd52f

Choose a tag to compare

Pre-release
修复内容:
1. 修复probability_calculator.py中的语法错误(多余的}括号)
2. 修复JSON序列化导致的KeyError问题(字符串/整数键兼容性)
3. 修复interactive_app.py中的KeyError: 'discard_bag'错误
4. 添加对discard_hand和discard_bag操作类型的完整支持
5. 更新操作类型映射和显示逻辑

此版本解决了用户遇到的关键运行时错误,确保程序稳定运行。

zip文件

18 Dec 13:13

Choose a tag to compare

多袋摸球概率计算器 🎲

这是一个用于计算复杂多袋摸球问题概率的专业工具。支持精确计算和蒙特卡洛模拟两种方法。

🌟 功能特点

  • 通用性: 支持任意数量的袋子和球颜色
  • 灵活操作: 支持摸球、丢球、放回三种操作类型
  • 双计算模式:
    • 🔢 精确计算: 使用组合数学进行精确计算(状态空间遍历)
    • 🎲 蒙特卡洛模拟: 使用随机模拟进行快速近似
  • 交互界面: 提供友好的命令行交互界面
  • 配置保存: 支持保存和加载问题配置
  • 结果导出: 计算结果保存为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

这将启动用户友好的配置向导,引导您:

  1. 设置问题描述
  2. 自定义袋子:指定袋子数量和每种颜色的球数
  3. 配置操作序列:最多10步操作,包括:
    • 从袋子摸球
    • 从袋子丢球
    • 从手中丢球
    • 放回球到袋子
  4. 自动验证:检查配置有效性
  5. 保存配置:生成JSON配置文件
  6. 立即计算:选择计算方法并直接计算

方法2: 从配置文件计算

python calculate_from_file.py user_problem.json

从现有的配置文件计算概率。支持:

  • exact:精确计算 - python calculate_from_file.py 文件.json exact
  • monte:蒙特卡洛模拟 - 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摸两个球
  2. 从袋子1丢掉两个球
  3. 再从袋子1摸一个球
  4. 从袋子2摸一个球
  5. 从袋子3摸一个球
  6. 将自己手中的球放回袋子3一个
  7. 从袋子4摸两个球
  8. 放回一个球到袋子1
  9. 再从袋子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虚拟环境

📝 技术实现细节

核心算法:

  1. 状态表示:

    • 使用字典表示袋子状态:{颜色: 数量}
    • 使用Counter表示手中球状态
  2. 精确计算:

    • 递归遍历所有可能的状态转移
    • 使用组合数学计算每一步的概率
    • 合并相同状态以减少状态空间
  3. 蒙特卡洛模拟:

    • 随机抽样模拟整个过程
    • 使用大数定律逼近真实概率
    • 提供进度显示
  4. 优化策略:

    • 状态剪枝:当状态过多时,只保留概率最高的状态
    • 缓存机制:避免重复计算
    • 惰性计算:只在需要时展开状态

🧪 测试与验证

系统内置验证功能:

  • 配置有效性检查
  • 概率总和验证(应接近1.0)
  • 边界情况处理

🔍 常见问题

Q: 精确计算太慢怎么办?

A: 对于复杂问题,建议使用蒙特卡洛模拟。增加模拟次数可以提高精度。

Q: 总概率不等于1怎么办?

A: 可能原因:

  1. 蒙特卡洛模拟的统计误差(增加模拟次数)
  2. 精确计算的舍入误差(正常现象)
  3. 程序错误(检查配置)

Q: 可以处理多少个袋子?

A: 理论上无限制,但状态空间随袋子和操作数量指数增长。

Q: 支持哪些颜色?

A: 任意字符串作为颜色标识,如"红"、"蓝"、"Y"、"W"等。

📄 许可证

本项目仅供学习和研究使用。

🤝 贡献

欢迎提出问题、建议和改进!

📞 支持

如有问题,请查看代码注释或直接运行程序查看帮助信息。


开始使用: python main.pypython interactive_app.py

Happy Calculating! 🎲🧮📊

Full Changelog: https://github.com/fcy10012/-Probability-calculator/commits/release