☰
为什么你的 GitHub Stats Extended 卡片是 S 级?Rank 排名算法的数学原理与代码实现详解
2026/10/12 3:56:39 网站建设 项目流程

【免费下载链接】github-stats-extended

Dynamically generate GitHub stats for your READMEs.

项目地址:https://gitcode.com/gh_mirrors/gi/github-stats-extended
点击查看免费下载

如果你在用github-stats-extended动态生成 GitHub Stats 卡片,一定见过卡片角落里那个醒目的等级徽章:S、A+、A、B+……这个Rank 排名算法并不是拍脑袋打分,而是用指数分布、对数正态分布的累积分布函数(CDF)对 commits、PR、Issues、Stars、粉丝数加权计算出的百分位结果。本文带你彻底搞懂S 级 Rank 是怎么算出来的,以及为什么绝大多数人是 C。

Rank 到底在衡量什么?

Stats 卡片会展示你的 stars、commits、pull requests、issues 等 GitHub 活跃度数据,并给出一个整体等级(官方说明见 stats.md)。这套等级参照了日本学术评分体系,共 9 档:

等级SA+AA-B+BB-C+C
含义前 1%前 12.5%前 25%前 37.5%前 50%前 62.5%前 75%前 87.5%其余所有人

核心结论先说:S 级 = 全局百分位进入前 1%,而不是"各项数据都第一"。卡片上等级圆环显示的进度,正是100 - 全局百分位。

数学原理:两个分布函数打底

算法核心只有一个文件:calculateRank.ts,其中定义了两个"分布函数",把任意指标值转换成 0~1 之间的百分位估计:

指数分布 CDF:衡量"越努力越接近 1"

function exponential_cdf(x: number): number { return 1 - 2 ** -x; // 1 - 2^(-x) }

这是以中位数为刻度的指数分布 CDF:当x = 1(即你的数量达到中位数)时,函数值正好是 0.5,表示"超过了 50% 的人";数量翻倍再翻倍,值就快速逼近 1,但永远到不了 1。它用来衡量commits、PR、issues、reviews这类"干活型"指标。

对数正态 CDF:给 Stars 和粉丝一个"天花板更软"的模型

function log_normal_cdf(x: number): number { return x / (1 + x); // 近似公式 }

Stars 和 followers 的分布极端偏斜(少数人拿走了绝大多数),所以改用这个近似公式:输入中位数的 1 倍同样得 0.5,但增长更平缓,避免"明星效应"把整个排名带偏。它专门用于stars 和 followers这两项"社交型"指标。

加权求和:中位数与权重的设定

每种指标都有自己的中位数(代表"普通用户"的水平)和权重,见 calculateRank.ts:

指标中位数权重使用的 CDF
commits250(开启include_all_commits时为 1000)2指数分布
PR503指数分布
Issues251指数分布
Reviews21指数分布
Stars504(最高)对数正态近似
Followers101对数正态近似

最终的全局排名公式为:

rank = 1 - (Σ 权重ᵢ × CDFᵢ(指标ᵢ / 中位数ᵢ)) / 总权重(12)

两个值得注意的设计:

  • 权重越高越重要:Stars 权重为 4,是最重的单项,说明社区认可度被放在 C 位;而 Reviews、Issues、Followers 都是 1。
  • rank 数值越小越强:rank本质是百分位(percentile)。测试用例里一位"sindresorhus 级别"的用户(commits 1300 / PR 1500 / Stars 60 万 / 粉丝 5 万)算出percentile ≈ 0.46,即前 0.46%,稳稳 S 级(见 calculateRank.test.ts)。

S、A+、C 九档是如何划分的?

算出 rank 后,只需对照一组固定阈值即可定档(calculateRank.ts):

const THRESHOLDS = [1, 12.5, 25, 37.5, 50, 62.5, 75, 87.5, 100]; const LEVELS = ["S", "A+", "A", "A-", "B+", "B", "B-", "C+", "C"]; const level = LEVELS[THRESHOLDS.findIndex((t) => rank * 100 <= t)];

也就是说:只要rank × 100 ≤ 1(前 1%),就是 S 级;≤ 12.5是 A+……一直到≤ 100兜底为 C。测试文件里也验证了完整梯度——新用户全 0 得 C,"中位数用户"(250 commits / 50 PR / 50 Stars 等)恰好落在 46% 附近拿到 B+(calculateRank.test.ts)。

普通人如何从 B 冲向 S 级?

结合权重表,冲 S 级的性价比路线很清晰:

  1. 优先刷 Stars(权重 4):开源一个小而精的工具库,让项目被更多人 star,收益最大;
  2. 保持稳定的 PR 输出(权重 3):给开源项目持续贡献,50 个 PR 只是中位数起点;
  3. commits 是基本盘(权重 2):250 commits 仅为及格线,S 级玩家通常以千计;
  4. Reviews / Issues / Followers 权重虽低但不可缺:它们决定你能否稳定越过 1% 这条线;
  5. 开启include_all_commits参数后,commits 中位数从 250 提高到 1000,排名基准会自动对齐"全量提交"的口径。

卡片上 Rank 的三种展示方式

在前端配置向导里,你可以选择 Rank 的显示风格(default/percentile/github/hide_rank),相关组件见 StatsRankSection.tsx。选择percentile时,卡片会直接展示你的百分位数字而不是字母等级。

总结

  • github-stats-extended 的Rank 算法= 六项指标各自的 CDF 百分位 × 权重,加权平均后取反;
  • S 级 = 全局前 1%,Stars 权重最高(4),PR 次之(3);
  • 想看完整实现,直接阅读 packages/core/src/calculateRank.ts,想验证算法行为,翻阅 packages/core/tests/calculateRank.test.ts;
  • 想隐藏或更换 Rank 显示样式,使用hide_rank、rank_icon等卡片参数即可(详见 stats.md)。

理解了这个算法,你就知道:与其焦虑字母等级,不如把权重表当作开源路线图——按权重排序投入精力,S 级只是时间问题。

【免费下载链接】github-stats-extended

Dynamically generate GitHub stats for your READMEs.

项目地址:https://gitcode.com/gh_mirrors/gi/github-stats-extended
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询