1.Hacker News



Score = (P-1)/(T+2)^G



P表示帖子的得票数,减去1是为了忽略发帖人的投票


T表示距离发帖的时间(单位为小时),加上2是为了防止最新的帖子导致分母过小(之所以选择2,可能是因为从原始文章出现在其他网站,到转贴至Hacker News,平均需要两个小时)。


G表示"重力因子"(gravityth power),即将帖子排名往下拉的力量,默认值为1.8,后文会详细讨论这个值。



2.Reddit



Score = log10^z + gt/45000



这个部分表示,赞成票与反对票的差额z越大,得分越高。




需要注意的是,这里用的是以10为底的对数,意味着z=10可以得到1分,z=100可以得到2分。也就是说,前10个投票人与后90个投票人(乃至再后面900个投票人)的权重是一样的,即如果一个帖子特别受到欢迎,那么越到后面投赞成票,对得分越不会产生影响。




当赞成票等于反对票,z=1,因此这个部分等于0,也就是不产生得分。




这个部分表示,t越大,得分越高,即新帖子的得分会高于老帖子。它起到自动将老帖子的排名往下拉的作用。




分母的45000秒,等于12.5个小时,也就是说,后一天的帖子会比前一天的帖子多得2分。结合前一部分,可以得到结论,如果前一天的帖子在第二天还想保持原先的排名,在这一天里面,它的z值必须增加100倍(净赞成票增加100倍)。




y的作用是产生加分或减分。当赞成票超过反对票时,这一部分为正,起到加分作用;当赞成票少于反对票时,这一部分为负,起到减分作用;当两者相等,这一部分为0。这就保证了得到大量净赞成票的文章,会排在前列;赞成票与反对票接近或相等的文章,会排在后面;得到净反对票的文章,会排在最后(因为得分是负值)。


3.stack overflow

function hot($Qviews, $Qanswers, $Qscore, $Ascores, $date_ask, $date_active)
{
    $Qage = (time() - strtotime(gmdate("Y-m-d H:i:s",strtotime($date_ask)))) / 3600;
    $Qage = round($Qage, 1);
 
    $Qupdated = (time() - strtotime(gmdate("Y-m-d H:i:s",strtotime($date_active)))) / 3600;
    $Qupdated = round($Qupdated, 1);
 
    $dividend = (log10($Qviews)*4) + (($Qanswers * $Qscore)/5) + $Ascores;
    $divisor = pow((($Qage + 1) - ($Qage - $Qupdated)/2), 1.5);
 
    echo $dividend/$divisor . "\n";
}