<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>风险管理 on 文艺技术笔记</title><link>https://wenyiblog.top/tags/%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86/</link><description>Recent content in 风险管理 on 文艺技术笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>文艺技术笔记 | 软件工程师文艺</copyright><lastBuildDate>Tue, 23 Jun 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>蒙特卡洛模拟量化项目风险：用10000次概率计算替代拍脑袋估工期</title><link>https://wenyiblog.top/2026/06/monte-carlo-project-risk/</link><pubDate>Tue, 23 Jun 2026 18:00:00 +0800</pubDate><guid>https://wenyiblog.top/2026/06/monte-carlo-project-risk/</guid><description>&lt;h2 id="引言为什么你的项目工期永远在延期"&gt;&lt;a href="#%e5%bc%95%e8%a8%80%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%a0%e7%9a%84%e9%a1%b9%e7%9b%ae%e5%b7%a5%e6%9c%9f%e6%b0%b8%e8%bf%9c%e5%9c%a8%e5%bb%b6%e6%9c%9f" class="header-anchor"&gt;&lt;/a&gt;引言：为什么你的项目工期永远在延期？
&lt;/h2&gt;&lt;p&gt;每个做过项目管理的人，大概都经历过这样的场景——立项会上，领导问「这个项目多久能交付？」，会议室里沉默几秒，有人说了个数字，其他人点头附和，工期就这么定了。&lt;/p&gt;
&lt;p&gt;这个「拍脑袋」的过程，听起来荒诞，却是绝大多数组织里项目估算的真实写照。即便团队稍微专业一点，使用了PERT三点估算法（最乐观时间、最可能时间、最悲观时间做加权平均），结果依然经常翻车。问题出在哪里？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PERT的根本局限在于：它给出的是一个点估计值。&lt;/strong&gt; 加权平均之后，你得到一个确定的天数，比如「预计42天完成」。但这个42天背后的不确定性完全被隐藏了——你不知道42天完成的概率到底是50%还是80%，也不知道延期到60天的可能性有多大。当项目包含十几个甚至上百个任务、任务之间存在复杂的依赖关系时，单个任务的误差会在关键路径上层层叠加，最终导致实际工期远远偏离估算值。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一位资深PMO曾这样说：「传统估算给你的是一张静态照片，而项目执行是一部动态电影。你拿照片去预测电影的结局，不翻车才怪。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;除此之外，PERT还有一个更隐蔽的问题：它假设每个任务的工期是独立分布的，简单地将加权平均值相加得到总工期。但现实项目中，任务之间往往存在复杂的依赖关系——任务B必须等任务A完成才能开始，任务C和任务D共享同一组开发资源。这些依赖关系会导致误差在关键路径上不断累积，而PERT对此无能为力。&lt;/p&gt;
&lt;p&gt;这正是蒙特卡洛模拟要解决的问题。它不给你一个确定的数字，而是给你一条完整的概率曲线——告诉你「在多少天内完成的概率是多少」。当你拿着这条曲线去跟管理层沟通时，对话方式会发生根本性的改变。你不再需要拍着胸脯给出一个自己都不确定的数字，而是可以坦率地说出每种可能性的概率，让决策者基于风险偏好来做出选择。&lt;/p&gt;
&lt;h2 id="蒙特卡洛模拟的核心思想"&gt;&lt;a href="#%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b%e6%a8%a1%e6%8b%9f%e7%9a%84%e6%a0%b8%e5%bf%83%e6%80%9d%e6%83%b3" class="header-anchor"&gt;&lt;/a&gt;蒙特卡洛模拟的核心思想
&lt;/h2&gt;&lt;p&gt;蒙特卡洛方法的名字来源于摩纳哥的蒙特卡洛赌场，因为它的核心逻辑和赌博有异曲同工之处：&lt;strong&gt;通过大量随机试验，用频率逼近概率。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;举个最简单的例子：你想知道一枚不均匀硬币正面朝上的概率。理论上你可以去推导物理公式，但更直接的做法是——抛一万次，数一下正面朝上出现了多少次。如果出现了6127次正面，那么正面朝上的概率大约是61.27%。抛的次数越多，这个估计就越精确。&lt;/p&gt;
&lt;p&gt;把这个思路迁移到项目工期估算上，逻辑完全一样：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;为每个任务定义一个概率分布&lt;/strong&gt;，而不是一个固定值。比如任务A的工期可能在5到15天之间，最可能是8天。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从每个任务的分布中随机抽样一次&lt;/strong&gt;，得到一组具体的工期值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按照任务间的依赖关系计算这次模拟的总工期&lt;/strong&gt;（通常是关键路径的长度）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复步骤2和3，跑上一万次&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计这一万次结果的分布&lt;/strong&gt;，你就得到了项目总工期的概率分布。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个过程的关键洞见是：&lt;strong&gt;单次模拟毫无意义，但一万次模拟的统计结果极其可靠。&lt;/strong&gt; 每一次抽样都是随机的、不可预测的，但当样本量足够大时，统计规律会稳定地浮现出来。这就是概率论中大数定律的威力。&lt;/p&gt;
&lt;h3 id="为什么pert分布特别适合蒙特卡洛模拟"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88pert%e5%88%86%e5%b8%83%e7%89%b9%e5%88%ab%e9%80%82%e5%90%88%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b%e6%a8%a1%e6%8b%9f" class="header-anchor"&gt;&lt;/a&gt;为什么PERT分布特别适合蒙特卡洛模拟？
&lt;/h3&gt;&lt;p&gt;在蒙特卡洛模拟中，你可以使用任何概率分布来描述任务的工期：正态分布、均匀分布、三角分布、对数正态分布……但在项目管理领域，PERT分布几乎是事实上的标准选择。&lt;/p&gt;
&lt;p&gt;PERT分布是项目管理中最常用的工期分布模型，它只需要三个参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最乐观值（Optimistic）&lt;/strong&gt;：一切顺利时的最短工期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最可能值（Most Likely）&lt;/strong&gt;：正常情况下的预期工期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最悲观值（Pessimistic）&lt;/strong&gt;：各种不顺时的最长工期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三个值，恰好是项目经理最容易给出的估算。你不需要让团队成员去理解正态分布的标准差或者Beta分布的形状参数，只需要问三个问题：最快多久、最可能多久、最慢多久。PERT分布会用这三个参数生成一个右偏的概率分布——这很符合现实，因为工期延误的概率通常远大于工期提前的概率。&lt;/p&gt;
&lt;h2 id="实战案例用python跑一个项目工期的蒙特卡洛模拟"&gt;&lt;a href="#%e5%ae%9e%e6%88%98%e6%a1%88%e4%be%8b%e7%94%a8python%e8%b7%91%e4%b8%80%e4%b8%aa%e9%a1%b9%e7%9b%ae%e5%b7%a5%e6%9c%9f%e7%9a%84%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b%e6%a8%a1%e6%8b%9f" class="header-anchor"&gt;&lt;/a&gt;实战案例：用Python跑一个项目工期的蒙特卡洛模拟
&lt;/h2&gt;&lt;p&gt;下面用一个真实可运行的例子来演示整个过程。假设你有一个包含10个任务的项目，每个任务都有PERT三点估算值，任务按顺序串行执行（简化模型，实际项目中可以建模为有向无环图）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 设置随机种子，确保结果可复现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 定义10个任务的PERT三点估算（单位：天）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 格式：(最乐观, 最可能, 最悲观)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;需求分析&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;系统设计&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;数据库建模&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;后端开发&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;前端开发&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;接口联调&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;单元测试&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;集成测试&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;用户验收&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;部署上线&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pert_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 从PERT分布中抽样。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; PERT分布的均值 = (o + 4*m + p) / 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 这里用Beta分布来近似PERT分布的形状。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 用Beta分布近似，alpha和beta由均值和范围推导&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1e-10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;beta_param&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1e-10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;beta_param&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beta_param&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 抽样并映射到[o, p]区间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;samples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beta_param&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 蒙特卡洛模拟：跑10000次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;n_simulations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_simulations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_simulations&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project_duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;task_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pert_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project_duration&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 串行累加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_duration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 统计结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;p50&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;p80&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;p95&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mean_duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== 蒙特卡洛模拟结果（&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n_simulations&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;次）===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;平均总工期: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mean_duration&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;P50（中位数）: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p50&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;P80: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p80&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;P95: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p95&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;最短模拟工期: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;最长模拟工期: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_durations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 天&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;运行这段代码后，你会得到类似这样的输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== 蒙特卡洛模拟结果（10000次）===
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;平均总工期: 82.0 天
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P50（中位数）: 81.8 天
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P80: 86.1 天
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P95: 90.5 天
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;最短模拟工期: 64.3 天
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;最长模拟工期: 101.8 天
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意看这组数据：如果你用传统的PERT加权平均来算每个任务的工期，然后简单相加，可能得到一个70天左右的数字。但蒙特卡洛模拟告诉你，70天完成的概率大概只有30%左右——因为各个任务同时取乐观值的概率极低，而多个任务同时偏悲观的情况并不罕见。&lt;/p&gt;
&lt;h2 id="如何解读模拟结果p50p80p95到底意味着什么"&gt;&lt;a href="#%e5%a6%82%e4%bd%95%e8%a7%a3%e8%af%bb%e6%a8%a1%e6%8b%9f%e7%bb%93%e6%9e%9cp50p80p95%e5%88%b0%e5%ba%95%e6%84%8f%e5%91%b3%e7%9d%80%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;如何解读模拟结果：P50、P80、P95到底意味着什么？
&lt;/h2&gt;&lt;p&gt;模拟跑完了，面对一串百分位数字，很多项目经理会困惑：我该用哪个数字去汇报？&lt;/p&gt;
&lt;h3 id="三个关键百分位的含义"&gt;&lt;a href="#%e4%b8%89%e4%b8%aa%e5%85%b3%e9%94%ae%e7%99%be%e5%88%86%e4%bd%8d%e7%9a%84%e5%90%ab%e4%b9%89" class="header-anchor"&gt;&lt;/a&gt;三个关键百分位的含义
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;P50（中位数）&lt;/strong&gt;：有50%的概率在81.8天内完成，也有50%的概率超期。这相当于「硬币的正反面」——如果你对管理层说82天，本质上就是在赌。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P80&lt;/strong&gt;：有80%的概率在86.1天内完成。这意味着你有五分之四的把握按时交付，只有五分之一的概率延期。对于大多数内部项目来说，这是一个合理的承诺基准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P95&lt;/strong&gt;：有95%的概率在90.5天内完成。这几乎是「铁承诺」——只有二十分之一的概率超期。适合用于对外合同或对延期零容忍的场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="应急储备怎么算"&gt;&lt;a href="#%e5%ba%94%e6%80%a5%e5%82%a8%e5%a4%87%e6%80%8e%e4%b9%88%e7%ae%97" class="header-anchor"&gt;&lt;/a&gt;应急储备怎么算？
&lt;/h3&gt;&lt;p&gt;应急储备的计算变得非常直观。假设你选择P50作为基准工期（81.8天），那么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向P80看齐的应急储备&lt;/strong&gt; = 86.1 - 81.8 = 4.3天&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向P95看齐的应急储备&lt;/strong&gt; = 90.5 - 81.8 = 8.7天&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;传统做法中，应急储备往往也是拍脑袋——「加个20%的buffer吧」。蒙特卡洛模拟让这个数字有了坚实的概率基础：你清楚地知道每一天的储备对应多大的风险覆盖率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在实际项目中，应急储备的选取通常取决于组织的风险偏好：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;风险偏好型组织&lt;/strong&gt;（如互联网初创公司）：可能选择P50甚至P40作为承诺基准，接受较高的延期概率以换取更快的市场响应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险中性型组织&lt;/strong&gt;（如大多数中型企业）：通常选择P70到P80之间，在确定性和效率之间取得平衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险厌恶型组织&lt;/strong&gt;（如金融、医疗、政府项目）：倾向于使用P90甚至P95，宁可多留余量也不愿承受延期的声誉损失。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="蒙特卡洛-vs-传统估算方法一张表说清楚"&gt;&lt;a href="#%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b-vs-%e4%bc%a0%e7%bb%9f%e4%bc%b0%e7%ae%97%e6%96%b9%e6%b3%95%e4%b8%80%e5%bc%a0%e8%a1%a8%e8%af%b4%e6%b8%85%e6%a5%9a" class="header-anchor"&gt;&lt;/a&gt;蒙特卡洛 vs 传统估算方法：一张表说清楚
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;拍脑袋估算&lt;/th&gt;
&lt;th&gt;PERT三点估算&lt;/th&gt;
&lt;th&gt;蒙特卡洛模拟&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;输出形式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;单一数字&lt;/td&gt;
&lt;td&gt;单一加权平均值&lt;/td&gt;
&lt;td&gt;完整概率分布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;不确定性表达&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;有限（有三点值但结果仍为点估计）&lt;/td&gt;
&lt;td&gt;充分（每个工期值都有对应概率）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;任务依赖处理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;忽略&lt;/td&gt;
&lt;td&gt;简单相加&lt;/td&gt;
&lt;td&gt;可建模复杂依赖关系&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;风险量化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;直接给出各百分位工期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;应急储备依据&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;经验直觉&lt;/td&gt;
&lt;td&gt;标准差公式（仅单任务）&lt;/td&gt;
&lt;td&gt;基于模拟结果的概率计算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;向管理层汇报&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;「大概3个月」&lt;/td&gt;
&lt;td&gt;「预计85天」&lt;/td&gt;
&lt;td&gt;「有80%概率在86天内完成」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;实施成本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;几乎为零&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;中等（需要工具和培训）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;适用项目规模&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;极小项目&lt;/td&gt;
&lt;td&gt;中小项目&lt;/td&gt;
&lt;td&gt;中大型及复杂项目&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从这张表可以看出，蒙特卡洛模拟并不是要取代传统方法，而是在传统方法的基础上增加了一个维度——&lt;strong&gt;概率维度&lt;/strong&gt;。PERT的三点估算依然是蒙特卡洛模拟的输入基础，两者是互补关系而非替代关系。&lt;/p&gt;
&lt;h2 id="适用场景与局限性"&gt;&lt;a href="#%e9%80%82%e7%94%a8%e5%9c%ba%e6%99%af%e4%b8%8e%e5%b1%80%e9%99%90%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;适用场景与局限性
&lt;/h2&gt;&lt;h3 id="蒙特卡洛模拟最适合的场景"&gt;&lt;a href="#%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b%e6%a8%a1%e6%8b%9f%e6%9c%80%e9%80%82%e5%90%88%e7%9a%84%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;蒙特卡洛模拟最适合的场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务数量较多&lt;/strong&gt;（超过15-20个独立任务）：任务越多，随机误差的叠加效应越明显，模拟的价值越大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工期不确定性高&lt;/strong&gt;：创新型项目、研发项目、涉及新技术的项目，三点估算的乐观值和悲观值差距很大，模拟能帮你量化这种不确定性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目有明确的里程碑约束&lt;/strong&gt;：比如必须在某个日期前上线，你需要知道按时交付的概率到底有多大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要量化的应急储备和管理储备&lt;/strong&gt;：组织要求用数据说话，而不是凭经验拍buffer。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="蒙特卡洛模拟的局限性"&gt;&lt;a href="#%e8%92%99%e7%89%b9%e5%8d%a1%e6%b4%9b%e6%a8%a1%e6%8b%9f%e7%9a%84%e5%b1%80%e9%99%90%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;蒙特卡洛模拟的局限性
&lt;/h3&gt;&lt;p&gt;任何方法都有边界，蒙特卡洛模拟也不例外：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入质量决定输出质量&lt;/strong&gt;。如果你的三点估算本身就是瞎编的，那跑一百万次模拟也只是「精确的错误」。垃圾进，垃圾出，这条铁律对任何模型都适用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任务依赖关系建模复杂&lt;/strong&gt;。真实项目中任务之间往往不是简单的串行或并行，存在条件依赖、资源竞争、反馈回路等复杂关系。简化模型会损失精度，而完整建模又需要大量工作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无法预测黑天鹅事件&lt;/strong&gt;。模拟基于历史经验和当前认知来设定参数范围。如果项目遇到了前所未见的风险（比如供应链突然断裂、政策突变），这些极端情况不在模型的概率分布内。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对团队的数据素养有要求&lt;/strong&gt;。如果团队成员不理解概率分布的含义，可能会把P80工期当成「保证完成的时间」来理解，造成沟通偏差。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pmo如何用模拟结果向管理层汇报"&gt;&lt;a href="#pmo%e5%a6%82%e4%bd%95%e7%94%a8%e6%a8%a1%e6%8b%9f%e7%bb%93%e6%9e%9c%e5%90%91%e7%ae%a1%e7%90%86%e5%b1%82%e6%b1%87%e6%8a%a5" class="header-anchor"&gt;&lt;/a&gt;PMO如何用模拟结果向管理层汇报
&lt;/h2&gt;&lt;p&gt;这可能是整篇文章最实用的部分。因为再好的分析工具，如果无法转化为有效的管理决策，就只是技术人员的自娱自乐。&lt;/p&gt;
&lt;h3 id="从大概3个月到概率化沟通"&gt;&lt;a href="#%e4%bb%8e%e5%a4%a7%e6%a6%823%e4%b8%aa%e6%9c%88%e5%88%b0%e6%a6%82%e7%8e%87%e5%8c%96%e6%b2%9f%e9%80%9a" class="header-anchor"&gt;&lt;/a&gt;从「大概3个月」到概率化沟通
&lt;/h3&gt;&lt;p&gt;传统汇报方式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「这个项目大概需要3个月，可能有些风险，我们尽量赶。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;管理层听到这句话的真实理解是：3个月，但不确定，可能延期，延多久不知道。&lt;/p&gt;
&lt;p&gt;使用蒙特卡洛模拟后的汇报方式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「基于10000次蒙特卡洛模拟，这个项目的工期分布如下：有50%的概率在82天内完成，有80%的概率在86天内完成。如果我们选择86天作为目标工期，需要预留约4天的应急储备来覆盖80%的风险场景。建议向客户承诺91天（P95），内部管控以86天为基准。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两种汇报的区别，不仅仅是精确度的差异，更是&lt;strong&gt;管理思维的跃迁&lt;/strong&gt;。前者是一个模糊的承诺加一个隐含的免责声明，后者是一个有风险边界条件的决策建议。管理层可以基于这个信息做出有意识的风险选择：「我们要不要接受更高的延期风险来换更快的交付？」&lt;/p&gt;
&lt;h3 id="汇报时的几个实用技巧"&gt;&lt;a href="#%e6%b1%87%e6%8a%a5%e6%97%b6%e7%9a%84%e5%87%a0%e4%b8%aa%e5%ae%9e%e7%94%a8%e6%8a%80%e5%b7%a7" class="header-anchor"&gt;&lt;/a&gt;汇报时的几个实用技巧
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要展示原始数据，展示决策选项。&lt;/strong&gt; 管理层不需要看一万次模拟的散点图，他们需要的是：「方案A承诺82天，成功概率50%；方案B承诺86天，成功概率80%。您选哪个？」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把概率翻译成业务语言。&lt;/strong&gt; 不要说「P95是91天」，要说「如果我们对客户承诺91天，只有5%的概率会违约」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用模拟结果驱动资源决策。&lt;/strong&gt; 「如果增加2个开发人员，模拟显示P80工期可以从86天降到78天，投入产出比是否划算？」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期更新模拟参数。&lt;/strong&gt; 项目执行过程中，已完成任务的实际工期应该反馈到模型中，重新跑模拟。这样你每个迭代都能给管理层一个更新后的概率预测，而不是在项目启动时做一次就再也不看了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当PMO能够持续提供概率化的项目预测，组织的风险管理文化会逐步从「事后救火」转向「事前量化」。管理层不再追问「到底能不能按时完成」这种二元问题，而是开始思考「我们愿意承受多大的延期风险」这种决策问题。这才是蒙特卡洛模拟带给项目管理最深层的价值——不是更精确的数字，而是更好的决策框架。&lt;/p&gt;</description></item></channel></rss>