[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-842":3,"consumer-news-interaction-842":41,"consumer-news-related-842":44},{"detail":4,"item":36},{"card":5,"schemaVersion":23,"fields":24,"content":30},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":15,"href":16,"sourceName":12,"meta":17,"metrics":20,"tags":21,"resolved":22},"NEWS_ARTICLE:842","news","NEWS_ARTICLE",842,"资讯","几何分布：从“等一个结果”开始","博客园","你有没有过这样的经历？ 在游戏里抽卡，抽了多少次才终于出货？ 站在路边等公交车，第几辆来的才是你要坐的那一路？ 给客户打电话，打到第几个才终于接通？ 刷短视频时，刷了多少条才刷到自己想看的内容？ 这些场景背后，都藏着一个共同的概率模型——几何分布（Geometric Distribution）。 几","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F83005\u002F202609\u002F83005-20260902112922617-1277310049.png","","\u002Fnews\u002F842",[18,19],"2026","数据与架构",{},[19],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":25,"categoryName":19,"summary":13,"description":13,"publishTime":26,"updateTime":27,"sourceUrl":28,"language":29},"wang_yb","2026-09-02T11:31","2026-09-02T20:37:48","https:\u002F\u002Fwww.cnblogs.com\u002Fwang_yb\u002Fp\u002F22805161","中文",{"format":31,"policy":32,"normalized":22,"html":33,"text":34,"wordCount":35,"hasBody":22},"HTML","NEWS_CONTENT_V1","\u003Cp>你有没有过这样的经历？\u003C\u002Fp>\n\u003Cul>\n \u003Cli>在游戏里抽卡，\u003Cstrong>抽了多少次才终于出货\u003C\u002Fstrong>？\u003C\u002Fli>\n \u003Cli>站在路边等公交车，\u003Cstrong>第几辆来的才是你要坐的那一路\u003C\u002Fstrong>？\u003C\u002Fli>\n \u003Cli>给客户打电话，\u003Cstrong>打到第几个才终于接通\u003C\u002Fstrong>？\u003C\u002Fli>\n \u003Cli>刷短视频时，\u003Cstrong>刷了多少条才刷到自己想看的内容\u003C\u002Fstrong>？\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这些场景背后，都藏着一个共同的概率模型——\u003Cstrong>几何分布（Geometric Distribution）\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>几何分布\u003C\u002Fstrong>描述的是：\u003Cstrong>在一次次独立的重复试验中，首次成功所需要的试验次数\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>它的核心问题就是--\u003Cstrong>“等到第一次成功，需要等多久？”\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>今天这篇文章，就用最通俗的方式带你搞懂几何分布，然后用 Python 把它用起来。\u003C\u002Fp>\n几何分布到底是什么？\n\u003Ch2>一个最简单的例子\u003C\u002Fh2>\n\u003Cp>想象你正在玩一个\u003Cstrong>抛硬币猜正反\u003C\u002Fstrong>的游戏。你不断抛硬币，直到\u003Cstrong>第一次出现正面\u003C\u002Fstrong>就算赢。\u003C\u002Fp>\n\u003Cul>\n \u003Cli>第 1 次就抛到正面 → 成功（次数 = 1）\u003C\u002Fli>\n \u003Cli>第 1 次反面、第 2 次正面 → 成功（次数 = 2）\u003C\u002Fli>\n \u003Cli>前 2 次反面、第 3 次正面 → 成功（次数 = 3）\u003C\u002Fli>\n \u003Cli>……一直下去\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这里的“首次出现正面所需的抛掷次数”X，就\u003Cstrong>服从几何分布\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>几何分布有三个核心特征：\u003C\u002Fp>\n \u003Col>\n  \u003Cli>每次试验只有两种结果：\u003Cstrong>成功\u003C\u002Fstrong>或\u003Cstrong>失败\u003C\u002Fstrong>\u003C\u002Fli>\n  \u003Cli>每次试验成功的概率 \u003Cstrong>p\u003C\u002Fstrong> 是固定的\u003C\u002Fli>\n  \u003Cli>你一直重复试验，\u003Cstrong>直到第一次成功就停下来\u003C\u002Fstrong>\u003C\u002Fli>\n \u003C\u002Fol>\n\u003C\u002Fblockquote>\n\u003Ch2>概率怎么算？\u003C\u002Fh2>\n\u003Cp>如果每次试验成功的概率是 \u003Cstrong>p\u003C\u002Fstrong>，那么第 \u003Cstrong>k\u003C\u002Fstrong> 次试验才首次成功的概率是：\u003C\u002Fp>\n\u003Cp>$ P(X = k) = (1 - p)^{(k-1)} × p $\u003C\u002Fp>\n\u003Cp>怎么理解这个公式？\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>前 k-1 次全部失败，概率是$ (1-p)^{(k-1)} $；第 k 次终于成功了，概率是 p。\u003C\u002Fp>\n \u003Cp>两者相乘，就是“前 k-1 次都失败、第 k 次成功”的概率。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2>两个重要性质\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>① 期望（平均需要多少次）\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>如果每次成功的概率是 p，那么\u003Cstrong>平均需要 1\u002Fp 次\u003C\u002Fstrong>才能首次成功。\u003C\u002Fp>\n\u003Cp>比如抛硬币（p=0.5），平均抛 2 次就能首次出现正面。抽卡概率如果是 1%（p=0.01），平均需要抽 100 次才能出货——这就是所谓的“保底期望”。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>② 无记忆性（最反直觉的性质）\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>这是几何分布最神奇的地方：\u003Cstrong>你已经失败了多少次，不会改变下一次成功的概率。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>举个例子：你已经连续抛了 10 次都是反面，那么下一次抛到正面的概率仍然是 50%——跟第一次抛的时候一模一样。\u003C\u002Fp>\n \u003Cp>前面 10 次失败“不占额度”，也不增加下一次成功的概率。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>这个性质在现实生活中其实不太“自然”——很多人会认为“都输了这么多次了，下次该赢了吧”，但几何分布告诉我们：\u003Cstrong>不会\u003C\u002Fstrong>。每一次都是全新的开始。\u003C\u002Fp>\n用 Python 计算几何分布\n\u003Ch2>准备工作\u003C\u002Fh2>\n\u003Cp>首先安装并导入必要的库：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import numpy as np\nimport matplotlib.pyplot as plt\nfrom scipy.stats import geom\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>scipy.stats.geom\u003C\u002Fcode> 是 Python 中处理几何分布的核心工具。\u003C\u002Fp>\n\u003Ch2>概率质量函数（PMF）——算“恰好第 k 次成功”的概率\u003C\u002Fh2>\n\u003Cp>假设某款游戏的抽卡出 SSR 概率是 \u003Cstrong>5%\u003C\u002Fstrong>（p=0.05），你想知道\u003Cstrong>恰好第 3 抽才出 SSR\u003C\u002Fstrong> 的概率是多少？\u003C\u002Fp>\n\u003Cpre>\u003Ccode>p = 0.05\nk = 3\n\n# 恰好第 k 次才首次成功\nprob = geom.pmf(k, p)\nprint(f\"P(第 {k} 次才首次成功) = {prob:.4%}\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>P(第 3 次才首次成功) = 4.5125%\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>验证一下公式：前 2 次失败$ （0.95）^2 $× 第 3 次成功（0.05）= 0.045125，完全吻合。\u003C\u002Fp>\n\u003Cp>如果你想看前 20 次每次“恰好首次成功”的概率分布：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>x = np.arange(1, 21)\npmf_values = geom.pmf(x, p)\n\nplt.figure(figsize=(10, 5))\nplt.vlines(x, 0, pmf_values, colors='b', lw=2, alpha=0.7)\nplt.scatter(x, pmf_values, color='red', s=30)\nplt.xlabel('首次成功的试验次数 (k)')\nplt.ylabel('概率')\nplt.title(f'几何分布 PMF (p={p})')\nplt.show()\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>你会看到：\u003Cstrong>次数越靠后，概率越小\u003C\u002Fstrong>——因为要“连续失败很多次”本身就越难发生。\u003C\u002Fp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F83005\u002F202609\u002F83005-20260902112922617-1277310049.png?w=720&amp;quality=65&amp;strip=all\" title=\"\">\n\u003Ch2>累积分布函数（CDF）——“前 k 次内成功的概率”\u003C\u002Fh2>\n\u003Cp>更常见的问题是：\u003Cstrong>“抽 10 次之内能出 SSR 的概率是多少？”\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>这时候用 CDF（累积分布函数）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>p = 0.05\nk = 10\n\n# 10 次以内（含第 10 次）首次成功的概率\nprob_within_10 = geom.cdf(k, p)\nprint(f\"P(前 {k} 次内首次成功) = {prob_within_10:.4%}\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>P(前 10 次内首次成功) = 40.1263%\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>也就是说，只有 \u003Cstrong>40%\u003C\u002Fstrong> 的玩家能在 10 抽以内出货，剩下 60% 的人要等 10 抽以后。\u003C\u002Fp>\n\u003Ch2>生存函数（SF）——“超过 k 次还没成功的概率”\u003C\u002Fh2>\n\u003Cp>反过来问：\u003Cstrong>“抽了 10 次还没出 SSR 的概率是多少？”\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 超过 10 次还没成功\nprob_over_10 = geom.sf(k, p)  # 等价于 1 - geom.cdf(k, p)\nprint(f\"P(超过 {k} 次还没成功) = {prob_over_10:.4%}\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>P(超过 10 次还没成功) = 59.8737%\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这不就是“非酋”的概率吗？将近 60% 的人抽 10 次都出不了货——是不是突然觉得合理多了？\u003C\u002Fp>\n\u003Ch2>期望值——平均需要多少次？\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>mean = geom.mean(p)\nprint(f\"平均需要 {mean:.1f} 次才能首次成功\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>平均需要 20.0 次才能首次成功\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>5% 的概率，平均 20 次出货——\u003Cstrong>期望值 = 1\u002Fp\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch2>随机模拟——生成一批“首次成功次数”\u003C\u002Fh2>\n\u003Cp>用 \u003Ccode>geom.rvs()\u003C\u002Fcode> 可以模拟大量玩家的“首次成功所需次数”：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 模拟 10000 名玩家，每人抽到 SSR 就停\nsamples = geom.rvs(p, size=10000)\n\nprint(f\"模拟平均值: {np.mean(samples):.2f}\")\nprint(f\"模拟方差: {np.var(samples):.2f}\")\n\n# 绘制直方图\nplt.figure(figsize=(10, 5))\nplt.hist(samples, bins=range(1, 60), edgecolor='black', alpha=0.7)\nplt.xlabel('首次成功所需次数')\nplt.ylabel('人数')\nplt.title(f'10000 名玩家首次抽到 SSR 的次数分布 (p={p})')\nplt.show()\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出（每次运行略有不同）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>模拟平均值: 19.98\n模拟方差: 379.45\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>你会发现大部分玩家集中在 1-20 次之间，但也有少数“非酋”超过 50 次甚至 100 次才出货——这就是几何分布的“长尾”特征。\u003C\u002Fp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F83005\u002F202609\u002F83005-20260902112922599-462570399.png?w=720&amp;quality=65&amp;strip=all\" title=\"\">\n生活中的几何分布\n\u003Ch2>场景一：游戏抽卡（上面已经算过了）\u003C\u002Fh2>\n\u003Cp>出卡概率 5%，抽到出为止。你可以用几何分布回答：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>第 3 抽就出的概率是多少？（PMF）\u003C\u002Fli>\n \u003Cli>10 抽以内出的概率是多少？（CDF）\u003C\u002Fli>\n \u003Cli>平均要抽多少次？（期望）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>场景二：等公交车\u003C\u002Fh2>\n\u003Cp>假设某路公交车平均每 10 分钟一班，但具体到达时间随机。你可以把“每一分钟”看作一次试验，\u003Cstrong>车来的概率是 1\u002F10 = 0.1\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>那么：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>恰好第 8 分钟车来的概率\u003C\u002Fstrong>是多少？→ \u003Ccode>geom.pmf(8, 0.1)\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>15 分钟以内能等到车的概率\u003C\u002Fstrong>是多少？→ \u003Ccode>geom.cdf(15, 0.1)\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>平均要等多久\u003C\u002Fstrong>？→ 1\u002F0.1 = 10 分钟\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>场景三：电话销售\u003C\u002Fh2>\n\u003Cp>你是一名电话销售，每次通话的\u003Cstrong>成交概率是 8%\u003C\u002Fstrong>（p=0.08）。\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>打到第 5 个电话才成交的概率\u003C\u002Fstrong>？→ \u003Ccode>geom.pmf(5, 0.08)\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>打 20 个电话以内能成交的概率\u003C\u002Fstrong>？→ \u003Ccode>geom.cdf(20, 0.08)\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>平均要打多少个电话才能成一单\u003C\u002Fstrong>？→ 1\u002F0.08 = 12.5 个\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>场景四：投飞镖\u003C\u002Fh2>\n\u003Cp>你向靶心投飞镖，\u003Cstrong>每次命中靶心的概率是 17%\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>第 6 次投掷才首次命中的概率\u003C\u002Fstrong>？→ \u003Ccode>geom.pmf(6, 0.17)\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>5 次以内命中的概率\u003C\u002Fstrong>？→ \u003Ccode>geom.cdf(5, 0.17)\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n完整代码\n\u003Cp>把上面所有的代码整理在一起，方便你直接运行：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import numpy as np\nimport matplotlib.pyplot as plt\nfrom scipy.stats import geom\n\n# ============ 基础参数 ============\np = 0.05  # 单次成功概率\n\n# ============ PMF：恰好第 k 次成功 ============\nk = 3\nprint(f\"P(第 {k} 次才首次成功) = {geom.pmf(k, p):.4%}\")\n\n# ============ CDF：k 次以内成功 ============\nk = 10\nprint(f\"P(前 {k} 次内首次成功) = {geom.cdf(k, p):.4%}\")\n\n# ============ SF：超过 k 次还没成功 ============\nprint(f\"P(超过 {k} 次还没成功) = {geom.sf(k, p):.4%}\")\n\n# ============ 期望和方差 ============\nprint(f\"期望（平均次数）= {geom.mean(p):.1f}\")\nprint(f\"方差 = {geom.var(p):.2f}\")\n\n# ============ 可视化 PMF ============\nx = np.arange(1, 21)\npmf_values = geom.pmf(x, p)\n\nplt.figure(figsize=(10, 5))\nplt.vlines(x, 0, pmf_values, colors='b', lw=2, alpha=0.7)\nplt.scatter(x, pmf_values, color='red', s=30)\nplt.xlabel('首次成功的试验次数 (k)')\nplt.ylabel('概率')\nplt.title(f'几何分布 PMF (p={p})')\nplt.show()\n\n# ============ 随机模拟 ============\nsamples = geom.rvs(p, size=10000)\nprint(f\"模拟平均值: {np.mean(samples):.2f}\")\nprint(f\"模拟方差: {np.var(samples):.2f}\")\n\nplt.figure(figsize=(10, 5))\nplt.hist(samples, bins=range(1, 60), edgecolor='black', alpha=0.7)\nplt.xlabel('首次成功所需次数')\nplt.ylabel('人数')\nplt.title(f'10000 次模拟的首次成功次数分布 (p={p})')\nplt.show()\n\u003C\u002Fcode>\u003C\u002Fpre>\n总结\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>你想知道的问题\u003C\u002Fth>\n   \u003Cth>用什么函数\u003C\u002Fth>\n   \u003Cth>代码示例\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>恰好第 k 次才首次成功\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.pmf(k, p)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.pmf(3, 0.05)\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>k 次以内（含）首次成功\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.cdf(k, p)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.cdf(10, 0.05)\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>超过 k 次还没成功\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.sf(k, p)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.sf(10, 0.05)\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>平均需要多少次\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.mean(p)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.mean(0.05)\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>模拟一批“首次成功次数”\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.rvs(p, size=n)\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>\u003Ccode>geom.rvs(0.05, size=1000)\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>几何分布的核心就三句话\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n \u003Cli>\u003Cstrong>它回答的是\u003C\u002Fstrong>：“等到第一次成功，需要等多久？”\u003C\u002Fli>\n \u003Cli>\u003Cstrong>概率公式\u003C\u002Fstrong>：$ P(X=k) = (1-p)^{(k-1)} × p $\u003C\u002Fli>\n \u003Cli>\u003Cstrong>平均等待时间\u003C\u002Fstrong>：1\u002Fp 次\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>下次当你在游戏里抽卡、在路边等车、或者刷短视频等一个“想看的内容”时，不妨想一想——\u003Cstrong>你现在经历的，可能正是一个几何分布的现实样本\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>而有了 \u003Ccode>Python\u003C\u002Fcode> 和 \u003Ccode>scipy.stats.geom\u003C\u002Fcode>，你可以把这种“等待”变成精确的计算，让自己对生活中的不确定性多一分掌控感。\u003C\u002Fp>","你有没有过这样的经历？ 在游戏里抽卡，抽了多少次才终于出货？ 站在路边等公交车，第几辆来的才是你要坐的那一路？ 给客户打电话，打到第几个才终于接通？ 刷短视频时，刷了多少条才刷到自己想看的内容？ 这些场景背后，都藏着一个共同的概率模型——几何分布（Geometric Distribution）。 几何分布描述的是：在一次次独立的重复试验中，首次成功所需要的试验次数。 它的核心问题就是--“等到第一次成功，需要等多久？” 今天这篇文章，就用最通俗的方式带你搞懂几何分布，然后用 Python 把它用起来。 几何分布到底是什么？ 一个最简单的例子 想象你正在玩一个抛硬币猜正反的游戏。你不断抛硬币，直到第一次出现正面就算赢。 第 1 次就抛到正面 → 成功（次数 = 1） 第 1 次反面、第 2 次正面 → 成功（次数 = 2） 前 2 次反面、第 3 次正面 → 成功（次数 = 3） ……一直下去 这里的“首次出现正面所需的抛掷次数”X，就服从几何分布。 几何分布有三个核心特征： 每次试验只有两种结果：成功或失败 每次试验成功的概率 p 是固定的 你一直重复试验，直到第一次成功就停下来 概率怎么算？ 如果每次试验成功的概率是 p，那么第 k 次试验才首次成功的概率是： $ P(X = k) = (1 - p)^{(k-1)} × p $ 怎么理解这个公式？ 前 k-1 次全部失败，概率是$ (1-p)^{(k-1)} $；第 k 次终于成功了，概率是 p。 两者相乘，就是“前 k-1 次都失败、第 k 次成功”的概率。 两个重要性质 ① 期望（平均需要多少次） 如果每次成功的概率是 p，那么平均需要 1\u002Fp 次才能首次成功。 比如抛硬币（p=0.5），平均抛 2 次就能首次出现正面。抽卡概率如果是 1%（p=0.01），平均需要抽 100 次才能出货——这就是所谓的“保底期望”。 ② 无记忆性（最反直觉的性质） 这是几何分布最神奇的地方：你已经失败了多少次，不会改变下一次成功的概率。 举个例子：你已经连续抛了 10 次都是反面，那么下一次抛到正面的概率仍然是 50%——跟第一次抛的时候一模一样。 前面 10 次失败“不占额度”，也不增加下一次成功的概率。 这个性质在现实生活中其实不太“自然”——很多人会认为“都输了这么多次了，下次该赢了吧”，但几何分布告诉我们：不会。每一次都是全新的开始。 用 Python 计算几何分布 准备工作 首先安装并导入必要的库： import numpy as np import matplotlib.pyplot as plt from scipy.stats import geom scipy.stats.geom 是 Python 中处理几何分布的核心工具。 概率质量函数（PMF）——算“恰好第 k 次成功”的概率 假设某款游戏的抽卡出 SSR 概率是 5%（p=0.05），你想知道恰好第 3 抽才出 SSR 的概率是多少？ p = 0.05 k = 3 # 恰好第 k 次才首次成功 prob = geom.pmf(k, p) print(f\"P(第 {k} 次才首次成功) = {prob:.4%}\") 输出： P(第 3 次才首次成功) = 4.5125% 验证一下公式：前 2 次失败$ （0.95）^2 $× 第 3 次成功（0.05）= 0.045125，完全吻合。 如果你想看前 20 次每次“恰好首次成功”的概率分布： x = np.arange(1, 21) pmf_values = geom.pmf(x, p) plt.figure(figsize=(10, 5)) plt.vlines(x, 0, pmf_values, colors='b', lw=2, alpha=0.7) plt.scatter(x, pmf_values, color='red', s=30) plt.xlabel('首次成功的试验次数 (k)') plt.ylabel('概率') plt.title(f'几何分布 PMF (p={p})') plt.show() 你会看到：次数越靠后，概率越小——因为要“连续失败很多次”本身就越难发生。 累积分布函数（CDF）——“前 k 次内成功的概率” 更常见的问题是：“抽 10 次之内能出 SSR 的概率是多少？” 这时候用 CDF（累积分布函数）： p = 0.05 k = 10 # 10 次以内（含第 10 次）首次成功的概率 prob_within_10 = geom.cdf(k, p) print(f\"P(前 {k} 次内首次成功) = {prob_within_10:.4%}\") 输出： P(前 10 次内首次成功) = 40.1263% 也就是说，只有 40% 的玩家能在 10 抽以内出货，剩下 60% 的人要等 10 抽以后。 生存函数（SF）——“超过 k 次还没成功的概率” 反过来问：“抽了 10 次还没出 SSR 的概率是多少？” # 超过 10 次还没成功 prob_over_10 = geom.sf(k, p) # 等价于 1 - geom.cdf(k, p) print(f\"P(超过 {k} 次还没成功) = {prob_over_10:.4%}\") 输出： P(超过 10 次还没成功) = 59.8737% 这不就是“非酋”的概率吗？将近 60% 的人抽 10 次都出不了货——是不是突然觉得合理多了？ 期望值——平均需要多少次？ mean = geom.mean(p) print(f\"平均需要 {mean:.1f} 次才能首次成功\") 输出： 平均需要 20.0 次才能首次成功 5% 的概率，平均 20 次出货——期望值 = 1\u002Fp。 随机模拟——生成一批“首次成功次数” 用 geom.rvs() 可以模拟大量玩家的“首次成功所需次数”： # 模拟 10000 名玩家，每人抽到 SSR 就停 samples = geom.rvs(p, size=10000) print(f\"模拟平均值: {np.mean(samples):.2f}\") print(f\"模拟方差: {np.var(samples):.2f}\") # 绘制直方图 plt.figure(figsize=(10, 5)) plt.hist(samples, bins=range(1, 60), edgecolor='black', alpha=0.7) plt.xlabel('首次成功所需次数') plt.ylabel('人数') plt.title(f'10000 名玩家首次抽到 SSR 的次数分布 (p={p})') plt.show() 输出（每次运行略有不同）： 模拟平均值: 19.98 模拟方差: 379.45 你会发现大部分玩家集中在 1-20 次之间，但也有少数“非酋”超过 50 次甚至 100 次才出货——这就是几何分布的“长尾”特征。 生活中的几何分布 场景一：游戏抽卡（上面已经算过了） 出卡概率 5%，抽到出为止。你可以用几何分布回答： 第 3 抽就出的概率是多少？（PMF） 10 抽以内出的概率是多少？（CDF） 平均要抽多少次？（期望） 场景二：等公交车 假设某路公交车平均每 10 分钟一班，但具体到达时间随机。你可以把“每一分钟”看作一次试验，车来的概率是 1\u002F10 = 0.1。 那么： 恰好第 8 分钟车来的概率是多少？→ geom.pmf(8, 0.1) 15 分钟以内能等到车的概率是多少？→ geom.cdf(15, 0.1) 平均要等多久？→ 1\u002F0.1 = 10 分钟 场景三：电话销售 你是一名电话销售，每次通话的成交概率是 8%（p=0.08）。 打到第 5 个电话才成交的概率？→ geom.pmf(5, 0.08) 打 20 个电话以内能成交的概率？→ geom.cdf(20, 0.08) 平均要打多少个电话才能成一单？→ 1\u002F0.08 = 12.5 个 场景四：投飞镖 你向靶心投飞镖，每次命中靶心的概率是 17%。 第 6 次投掷才首次命中的概率？→ geom.pmf(6, 0.17) 5 次以内命中的概率？→ geom.cdf(5, 0.17) 完整代码 把上面所有的代码整理在一起，方便你直接运行： import numpy as np import matplotlib.pyplot as plt from scipy.stats import geom # ============ 基础参数 ============ p = 0.05 # 单次成功概率 # ============ PMF：恰好第 k 次成功 ============ k = 3 print(f\"P(第 {k} 次才首次成功) = {geom.pmf(k, p):.4%}\") # ============ CDF：k 次以内成功 ============ k = 10 print(f\"P(前 {k} 次内首次成功) = {geom.cdf(k, p):.4%}\") # ============ SF：超过 k 次还没成功 ============ print(f\"P(超过 {k} 次还没成功) = {geom.sf(k, p):.4%}\") # ============ 期望和方差 ============ print(f\"期望（平均次数）= {geom.mean(p):.1f}\") print(f\"方差 = {geom.var(p):.2f}\") # ============ 可视化 PMF ============ x = np.arange(1, 21) pmf_values = geom.pmf(x, p) plt.figure(figsize=(10, 5)) plt.vlines(x, 0, pmf_values, colors='b', lw=2, alpha=0.7) plt.scatter(x, pmf_values, color='red', s=30) plt.xlabel('首次成功的试验次数 (k)') plt.ylabel('概率') plt.title(f'几何分布 PMF (p={p})') plt.show() # ============ 随机模拟 ============ samples = geom.rvs(p, size=10000) print(f\"模拟平均值: {np.mean(samples):.2f}\") print(f\"模拟方差: {np.var(samples):.2f}\") plt.figure(figsize=(10, 5)) plt.hist(samples, bins=range(1, 60), edgecolor='black', alpha=0.7) plt.xlabel('首次成功所需次数') plt.ylabel('人数') plt.title(f'10000 次模拟的首次成功次数分布 (p={p})') plt.show() 总结 你想知道的问题 用什么函数 代码示例 恰好第 k 次才首次成功 geom.pmf(k, p) geom.pmf(3, 0.05) k 次以内（含）首次成功 geom.cdf(k, p) geom.cdf(10, 0.05) 超过 k 次还没成功 geom.sf(k, p) geom.sf(10, 0.05) 平均需要多少次 geom.mean(p) geom.mean(0.05) 模拟一批“首次成功次数” geom.rvs(p, size=n) geom.rvs(0.05, size=1000) 几何分布的核心就三句话： 它回答的是：“等到第一次成功，需要等多久？” 概率公式：$ P(X=k) = (1-p)^{(k-1)} × p $ 平均等待时间：1\u002Fp 次 下次当你在游戏里抽卡、在路边等车、或者刷短视频等一个“想看的内容”时，不妨想一想——你现在经历的，可能正是一个几何分布的现实样本。 而有了 Python 和 scipy.stats.geom，你可以把这种“等待”变成精确的计算，让自己对生活中的不确定性多一分掌控感。",4503,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":16,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":40},"2026 · 数据与架构","#2563eb","16 \u002F 10",[19],{"targetType":8,"targetId":9,"likedByMe":42,"likeCount":43,"commentCount":43,"contentLikeCount":43,"contentCommentCount":43,"sourceLikeCount":43,"sourceCommentCount":43},false,0,[45,51,58,64,70,79,85,92],{"id":46,"kind":7,"title":47,"summary":48,"image":15,"href":49,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":50},"NEWS_ARTICLE:884","OSS 文件上传的几个风险点和解决方案","〇、前言 OSS 作为海量数据的承载平台，一旦配置不当，可能引发敏感数据泄露、恶意文件上传、巨额流量盗刷甚至数据被勒索加密等严重后果。 了解这些风险并非杞人忧天，而是帮助开发者和运维人员在使用 OSS 时建立正确的安全思维——从凭证管理、权限控制、访问策略到上传校验，每一个环节都可能在疏忽中成为攻击","\u002Fnews\u002F884",[19],{"id":52,"kind":7,"title":53,"summary":54,"image":55,"href":56,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":57},"NEWS_ARTICLE:892","zg 正式开源：本地检索，不止于关键词","🚀 zg（zvec-grep）正式开源！\n　\n我们打磨了一款面向人与 AI Agent 的「本地检索工具」——  \n默认在本机完成索引与检索，既能理解模糊意图，也保留 rg 的精确与高效。\n　\n🔒 本地优先：文件处理、索引和检索均在设备内完成，代码与文档无需上传，保护隐私与数据安全。\n　\n⚡️","https:\u002F\u002Fintranetproxy.alipay.com\u002Fskylark\u002Flark\u002F0\u002F2026\u002Fpng\u002F24957442\u002F1786498962962-a148a454-6626-4fdc-81ff-e95a9f71c9cd.png","\u002Fnews\u002F892",[19],{"id":59,"kind":7,"title":60,"summary":61,"image":15,"href":62,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":63},"NEWS_ARTICLE:899","C# U9 二次开发","U9 是用友 U9 Cloud，基于BEAS 开发平台，底层 C# + .NET Framework，服务端是 IIS+WCF，数据库 SqlServer；二次开发分：插件扩展、WebService 接口、单据扩展、自定义页面、外部程序调用 U9 接口。 ⚠️ U9 二次开发不建议直接修改 U9 原","\u002Fnews\u002F899",[19],{"id":65,"kind":7,"title":66,"summary":67,"image":15,"href":68,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":69},"NEWS_ARTICLE:925","订单的含金量在分化","复杂的流程，在产品设计阶段就需要综合考虑多方面的建议，前期业务和技术的介入，避免产品层面出现合理但不合适的设计，过繁或者过简都不利于整体的迭代节奏。","\u002Fnews\u002F925",[19],{"id":71,"kind":7,"title":72,"summary":73,"image":74,"href":75,"meta":76,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":77},"NEWS_ARTICLE:827","MHS 三部曲（下）：谁允许 AI 行动？——权力、合规与中国厂商的答卷","我们总在等待一个像 ChatGPT 那样的机器人时刻。但具身智能真正的拐点，也许先发生在更不起眼的地方：一台陌生设备，第一次能把自己的能力、状态和边界完整告诉 AI；一个 Agent，第一次能把试出来的经验固化成可验证、可复用的机器技能。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202608\u002F510-20260830153745229-1536981088.jpg","\u002Fnews\u002F827","2026 · 人工智能",[78],"人工智能",{"id":80,"kind":7,"title":81,"summary":82,"image":15,"href":83,"meta":18,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":84},"NEWS_ARTICLE:829","我不会美工，用 WorkBuddy 1 分钟做出 4 张海报","先说结果：下面这 4 张海报，从我发出指令到拿到图片，大约 1 分钟。 我不会美工，也没有打开 Photoshop。用的工具，是我之前用 WorkBuddy 做的一个海报生成器。这个生成器本身也没花几分钟，具体开发过程我在上一篇文章里写过。 这次我把海报生成器的网址、产品截图和要求一起发给 Work","\u002Fnews\u002F829",[7,8],{"id":86,"kind":7,"title":87,"summary":88,"image":89,"href":90,"meta":18,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":91},"NEWS_ARTICLE:828","一个人抵一个团队的时代，企业级 AI Agent 还需要做什么？","对于企业而言，真正需要的，不是一个“会聊天”的 Agent，而是一套能被多用户、多场景复用，且权限清晰、过程可审计、成本可控制的 Agent 能力体系。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F2232255\u002F202609\u002F2232255-20260902173524728-659996478.png","\u002Fnews\u002F828",[7,8],{"id":93,"kind":7,"title":94,"summary":95,"image":15,"href":96,"meta":97,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":98},"NEWS_ARTICLE:832","用 runtime-async 写一个支持 async\u002Fawait 的轻量脚本引擎","起因：一个好奇 事情的开头很简单。 给 .NET 做过动态脚本的人大概都碰到过同一堵墙：表达式树也好、Reflection.Emit 也好，都很难支持 async\u002Fawait。原因不在语法，而在 await 的实现方式——C# 编译器要为每个 async 方法生成一个状态机结构体，把方法体切成若干片","\u002Fnews\u002F832","2026 · 软件开发",[99],"软件开发"]