算法与规则

我们把算法完整公开在这里。没有黑箱、没有随机数,你填什么就得到什么分数,换个人填同样的数据,分数一模一样。

牛马指数怎么算

每个榜单由若干维度组成(比如通勤榜有「单程时长」「换乘次数」「拥挤程度」……)。 每个维度有自己的取值范围和权重,计算分三步:

第 1 步 · 归一化到 0~1
norm = (值 − 最小值) ÷ (最大值 − 最小值) → 截断到 [0, 1]
若该维度是「越低越牛马」,则 norm = 1 − norm
第 2 步 · 放大成百分制
维度得分 = norm × 100
第 3 步 · 按权重加权求和
牛马指数 = Σ(权重 × 维度得分) ÷ Σ(权重)

关于「没填的项」:求和时只会把「已填且有权重」的维度算进去,分母同步变小(权重自动重新归一)。 也就是说,少填几项不会把你的分数拉低,只是不参与计算。 但为了榜单公平,正式榜单要求该榜所有维度都填完才能提交。

综合榜是怎么来的

综合榜不直接采集数据,而是把你四个分榜的指数当成四个维度,再走一遍上面的算法: 通勤 30%、工资 30%、加班 25%、会议 15%。 只填了其中两个榜也能算,权重同样会自动重新归一。

等级划分
分数区间为左闭右开,例如 79.9 分是「资深牛马」,80.0 分就是「牛马之王」。
数据与反作弊
  • ① 你点提交之前,数据不会离开浏览器。测算过程全部在本地完成,只有你主动点「提交上榜」,数据才会写入服务器。
  • ② 服务端会重新算一遍。前端上报的分数只用于比对,一旦与服务端复算结果偏差超过 0.05 分,以服务端为准并标记该条为待审核。
  • ③ 有限流保护。同一 IP 每天提交次数有上限,超出会被拒绝;异常高频提交会进入人工审核队列。
  • ④ 不做实名核验。所有数据由用户自行填写,我们无法核实真实性,榜单结果仅供娱乐参考,不构成任何薪酬或职场建议。
  • ⑤ 可以要求删除。如果你提交后发现填错了或想撤下,带上成绩单链接联系站长即可删除。
常见问题
有些项我没动,为什么也算进分数了?
每个维度都有一个预填的默认值(比如「单程通勤时长」默认 45 分钟), 进页面时就会写进计算并算分。带着「默认」角标说明这一项还是我们替你填的, 改成你自己的真实情况才有意义;改过之后角标就消失了。 如果不想要默认值,把「清空重填」换成手动填一遍即可。
为什么我只填了一项,就 100 分了?
因为权重会自动重新归一:只填一项时,这一项的权重就变成了 100%。 这是「少填几项不拉低分数」的必然代价。不过正式榜单要求填满才能提交,所以这种情况不会出现在排行榜上。
分数越高越好还是越低越好?
「牛马指数」衡量的是被压榨程度——分数越高越牛马。所以 0 分是人间理想,100 分是牛马传说。 这个产品是自嘲用的,不是招聘参考。
同分怎么排名?
采用竞赛排名:同分共享同一名次,后面的名次跳号(例如 1、1、1、4、5)。 同分时按提交时间先后稳定排序,分页不会出现记录跳变。
换手机会丢数据吗?
「我的战绩」是靠浏览器本地的一个匿名标识关联的,没有账号体系。换设备或清理浏览器数据后就找不回来了, 所以建议提交后保存海报或收藏成绩单链接。
时薪是怎么算的?
折算时薪 = 税前月薪 ÷ 月总工时,保留 1 位小数。它不单独填写,由你填的月薪和月工时自动推出, 是工资榜里权重最高的一项(35%)。

算法版本 — · 想调整权重?改 web/js/config.js 与后端 niuma_board 表即可。