基于Excel文件计算彩票中奖概率的Python代码修正需求
问题分析与代码修正
核心计算逻辑
中奖概率的正确推导:
- 总共有
C(25,15)种开奖组合(从25个数字中选15个的组合数),计算结果为3268760 - 对于选了
k个数字的单票,中奖条件是开奖的15个数字完全包含在这k个数字中,符合条件的开奖组合数为C(k,15) - 最终概率公式:
概率 = C(k,15) / C(25,15),转换为分数形式后与官方给出的结果完全匹配
验证官方数据
代入不同 k 值验证:
k=15:C(15,15)/3268760 = 1/3268760→ 匹配官方k=16:C(16,15)/3268760 = 16/3268760 = 1/204298→ 匹配官方k=17:C(17,15)/3268760 = 136/3268760 = 1/24035→ 匹配官方- 其余
k值计算结果均与官方数据一致
Python代码实现
使用 math.comb(Python 3.10+ 支持)计算组合数,结合 pandas 读取并处理Excel文件:
import math import pandas as pd # 预计算总开奖组合数,避免重复计算 TOTAL_COMBINATIONS = math.comb(25, 15) def get_win_probability(k): if not (15 <= k <= 20): return "无效列数" valid_combs = math.comb(k, 15) # 转换为官方格式的分数字符串 return f"1/{round(TOTAL_COMBINATIONS / valid_combs)}" # 读取Excel文件(假设无表头,根据实际情况调整header参数) df = pd.read_excel("your_lottery_data.xlsx", header=None) # 遍历每行计算概率 output = [] for row_idx, row in df.iterrows(): # 过滤空值和非1-25的无效数字 valid_nums = [num for num in row if pd.notna(num) and 1 <= num <= 25] num_count = len(valid_nums) prob = get_win_probability(num_count) output.append({ "行号": row_idx + 1, "有效数字数量": num_count, "中奖概率": prob }) # 打印结果 for item in output: print(f"第{item['行号']}行: {item['有效数字数量']}个数字,中奖概率{item['中奖概率']}") # 保存结果到新Excel result_df = pd.DataFrame(output) result_df.to_excel("lottery_probability_results.xlsx", index=False)
代码说明
- 预计算总组合数提升运行效率
- 过滤无效数字确保统计的
k值准确 - 返回的概率格式与官方完全匹配
- 支持将结果保存为Excel文件,方便批量查看
内容的提问来源于stack exchange,提问作者ROCA
相关产品推荐
相关产品推荐

