【免费下载链接】github-stats-extended
Dynamically generate GitHub stats for your READMEs.
如果你在用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 档:
| 等级 | S | A+ | A | A- | B+ | B | B- | 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 |
|---|---|---|---|
| commits | 250(开启include_all_commits时为 1000) | 2 | 指数分布 |
| PR | 50 | 3 | 指数分布 |
| Issues | 25 | 1 | 指数分布 |
| Reviews | 2 | 1 | 指数分布 |
| Stars | 50 | 4(最高) | 对数正态近似 |
| Followers | 10 | 1 | 对数正态近似 |
最终的全局排名公式为:
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 级的性价比路线很清晰:
- 优先刷 Stars(权重 4):开源一个小而精的工具库,让项目被更多人 star,收益最大;
- 保持稳定的 PR 输出(权重 3):给开源项目持续贡献,50 个 PR 只是中位数起点;
- commits 是基本盘(权重 2):250 commits 仅为及格线,S 级玩家通常以千计;
- Reviews / Issues / Followers 权重虽低但不可缺:它们决定你能否稳定越过 1% 这条线;
- 开启
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.
相关推荐
什么是 GitHub Stats Extended?全面解析这个接管 github-readme-stats 的新一代 GitHub 统计卡片神器
什么是 GitHub Stats Extended?全面解析这个接管 github readme stats 的新一代 GitHub 统计卡片神器 GitHub
GitHub Stats Extended Stats 卡片参数完全参考:hide、show、rank 等 20+ 自定义选项详解
GitHub Stats Extended Stats 卡片参数完全参考:hide、show、rank 等 20+ 自定义选项详解 想在 GitHub Prof
Gemma 4-31B编程能力实战:10个代码生成与调试示例
Gemma 4 31B编程能力实战:10个代码生成与调试示例 Gemma 4 31B是由Google DeepMind开发的开源多模态模型,具备强大的代码生成与
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考