0

0

计算大数二项分布概率的高效纯Python实现

聖光之護

聖光之護

发布时间:2026-02-22 10:39:10

|

558人浏览过

|

来源于php中文网

原创

计算大数二项分布概率的高效纯Python实现

本文介绍如何在不依赖任何外部模块的前提下,高效、稳定地计算大规模参数(如 n=10000, m=5000)下的二项分布概率,通过乘法递推公式避免阶乘溢出与栈溢出问题。

本文介绍如何在不依赖任何外部模块的前提下,高效、稳定地计算大规模参数(如 n=10000, m=5000)下的二项分布概率,通过乘法递推公式避免阶乘溢出与栈溢出问题。

传统实现常直接调用阶乘函数(如 n! / (m! (n−m)!)),但该方式存在三大缺陷:

  • 整数爆炸:10000! 是约 35660 位的超大整数,虽 Python 支持任意精度整数,但后续除法转为浮点时会因精度丢失或 OverflowError 失败;
  • 栈溢出:递归阶乘(即使带 memoization)在 n=100000 时触发深度递归,超出默认递归限制;
  • 性能低下:重复计算大量中间阶乘,时间复杂度达 O(n),空间开销高。

✅ 正确解法是采用二项系数的乘法递推公式(Multiplicative Formula):

$$ \binom{n}{m} = \prod_{i=1}^{\min(m,\,n-m)} \frac{n - i + 1}{i} $$

该公式优势显著:

  • 全程整数运算:利用 // 整除确保每一步结果仍为整数,避免浮点误差累积;
  • 最小化迭代次数:仅循环 min(m, n−m) 次(例如 binomial(10000, 5000) 只需 5000 次迭代);
  • 零内存缓存依赖:无需 memo 字典或递归调用,彻底规避栈溢出;
  • 数值稳定:分子分母同步约简,有效抑制中间值增长。

以下是完整、健壮的实现:

ExcelFormulaBot
ExcelFormulaBot

在AI帮助下将文本指令转换为Excel函数公式

下载

立即学习Python免费学习笔记(深入)”;

def binomial_coefficient(n, m):
    """计算组合数 C(n, m),支持大整数,无模块依赖"""
    if m < 0 or m > n:
        return 0  # 统一返回 0 表示未定义(比字符串更利于数值计算)
    if m == 0 or m == n:
        return 1
    # 利用对称性 C(n,m) == C(n, n-m),取较小者减少循环次数
    m = min(m, n - m)
    result = 1
    for i in range(1, m + 1):
        result = result * (n - i + 1) // i  # 关键:先乘后整除,保持整数性
    return result

def binomial_pmf(n, m, p=0.5):
    """计算二项分布概率质量函数 P(X = m) = C(n,m) * p^m * (1-p)^(n-m)"""
    if n < 0 or m < 0 or m > n:
        return 0.0
    # 对于公平硬币(p = 1/2),可简化为 C(n,m) / 2^n
    coeff = binomial_coefficient(n, m)
    # 使用 pow(2, n) 避免 2**n 在极大 n 下生成超长整数(但 Python 中仍安全)
    # 更稳妥做法:直接用 float 除法(coeff 自动转为 float)
    return coeff / (1 << n)  # 等价于 coeff / (2**n),位运算略快且语义清晰

# 示例验证
print(binomial_pmf(10_000, 5_000))   # 输出: 0.007978646139382154
print(binomial_pmf(100_000, 50_000)) # 可稳定运行(约数百毫秒)

⚠️ 注意事项:

  • 不要使用 `(1/2)n计算分母**:该表达式生成极小浮点数(如n=10000时约为1e-3010),导致下溢(underflow)为0.0,最终结果为inf或nan;应始终用1 / (2**n)或1 / (1
  • // 运算符不可替换为 /:/ 返回浮点数,会引入舍入误差并破坏整数累积;// 在整数间运算时等价于数学整除,且 Python 保证 a // b * b == a 当 b 整除 a(此处恒成立)。
  • 若需扩展至非公平硬币(p ≠ 0.5),建议改用对数域计算(如 log(C(n,m)) + m*log(p) + (n−m)*log(1−p)),但本题明确禁止导入模块(无法用 math.log),故推荐场景限定为 p = 0.5。

总结:面对大数二项概率计算,核心在于避开显式阶乘,转向递推组合数 + 精确整数运算。该方法兼具正确性、效率与鲁棒性,是纯 Python 环境下的最优实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1556

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

238

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

177

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

13

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

41

2025.12.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

421

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

594

2023.08.10

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号