Hacker News
Hacker News 是一個可以發(fā)布帖子的網(wǎng)絡社區(qū),每個帖子前面有一個向上的三角形,如果用戶覺得這個內(nèi)容好,點擊一下即可投票。根據(jù)得票數(shù),系統(tǒng)自動統(tǒng)計出熱門文章排行榜。
Hacker News 使用分數(shù)計算公式如下:
其中, 表示帖子的得票數(shù),減去
表示忽略發(fā)帖人的投票;
表示當前距離發(fā)帖的時間(單位為小時),加上
是為了防止最新的帖子分母過??;
為重力因子,即將帖子排名被往下拉的力量,默認值為
。
在其他條件不變的情況下,更多的票數(shù)可以獲得更高的分數(shù),如果不希望“高票數(shù)”帖子和“低票數(shù)”帖子之間差距過大,可以上面公式的分子中添加小于 的指數(shù),例如:
。
在其他條件不變的情況下,隨著時間不斷流逝,帖子的分數(shù)會不斷降低,經(jīng)過 24 小時后,幾乎所有帖子的分數(shù)都將小于 。重力因子對于分數(shù)的影響如下圖所示:

值越大,曲線越陡峭,排名下降的速度越快,意味著排行榜的更新速度越快。
不同于 Hacker News , Reddit 根據(jù)投票結(jié)果,計算出最新的熱點文章排行榜。

Reddit 網(wǎng)站的計算分數(shù)統(tǒng)計代碼可以總結(jié)如下
from datetime import datetime, timedelta
from math import log
epoch = datetime(1970, 1, 1)
def epoch_seconds(date):
td = date - epoch
return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
def score(ups, downs):
return ups - downs
def hot(ups, downs, date):
s = score(ups, downs)
order = log(max(abs(s), 1), 10)
sign = 1 if s > 0 else -1 if s < 0 else 0
seconds = epoch_seconds(date) - 1134028003
return round(order + sign * seconds / 45000, 7)
分數(shù)的計算過程大致如下:
1. 計算贊成票和反對票的差值
2. 計算中間分數(shù)
其中,取
和
的最大值是為了避免當
時,無法計算
。贊成票與反對票差值越大,得分越高。取以
為底的對數(shù),表示當
時,這部分為
,只有
時才為
,這樣設置是為了減緩差值增加對總分的影響程度。
3. 確定分數(shù)的方向
4. 計算發(fā)貼時間距離 2005 年 12 月 8 日 7:46:43 的秒數(shù)
5. 計算最終分數(shù)
將時間除以 45000 秒(即 12.5 個小時),也就是說當前天的帖子會比昨天的帖子多約 2 分。如果昨天的帖子想要保持住之前的排名,則
值需要增加 100 倍才可以。
Reddit 評分排名算法決定了 Reddit 是一個符合大眾口味的社區(qū),而不是一個適合展示激進想法的地方。
Stack Overflow
Stack Overflow 是世界排名第一的程序員問答社區(qū) , 創(chuàng)始人之一的 Jeff Atwood 的評分排名的計算公式如下:
其中:
-
表示問題的瀏覽次數(shù)越多,得分越高,同時利用
減緩了隨著瀏覽量增大導致得分變高的程度。
-
表示問題的得分(贊成票和反對票之差)越高,回答的數(shù)量越多,分數(shù)越高。采用乘積的形式意味著即使問題本身的分數(shù)再高,沒有人回答的問題也算不上熱門問題。
-
表示問題回答的總分數(shù)?;卮鹂偡植捎昧撕唵蔚募雍停珜嶋H上一個正確的回答要勝過多個無用的回答,簡答的加和無法很好的區(qū)分這兩種不同的情況。
-
可以改寫為
,
和
分別表示問題和最近一次回答的時間(單位為小時),也就是說問題時間越久遠,最近一次回答時間約久遠,分母就會越大,從而得分就會越小。
Stack Overflow 的評分排名算法考慮了參與程度(問題瀏覽次數(shù)和回答次數(shù))、質(zhì)量(問題分數(shù)和回答分數(shù))、時間(問題時間和最近一次回答時間)等多個維度。
