只有投票数发生变化时才需要重新计算得分。这减少了对数据库的更改次数,并使在数据被复制时容易实现一致性。(所以任何基于文章年龄越久得分越低的评分系统都不好)。
如果两个故事的年龄相等,则获得更多赞成票的那个更高。(所以需要从投票中得出贡献)。
故事获得的赞成票越多,它就越长时间地保持在排名前列。
即使旧故事得到很多赞成票,也不能永远停留在排名前列。很快(一两天后),新故事就需要超过它们。 (因此需要根据日期计算贡献,这必须在很短的时间内比由于投票而导致的得分大,无论某个事物得到多少票)。
得到的反对票比赞成票多的故事根本不应出现在排名中。
现在让我们看看公式:log z + yt/45000 如何满足这些要求。
如果投票数没有改变,则 z 、 y 和 t 都未更改。所以得分没有变化。这满足了需求(1)。
如果两个故事的年龄相同,则它们具有 t 的相同值。但是获得更多赞成票的故事具有更高的 z 值,并且由于对数单调性,它具有更高的得分。这满足需求(2)。
故事得到的赞成票越多,其 z 值就越高,因此它需要更长的时间才能被具有较高 t 的其他故事超越。这满足了需求(3)。
对数是一种随着其变大而增长得更慢的函数(看看它的图形)。因此,故事需要随着时间的推移获得越来越多的赞成票才能跟上更新的故事。这满足了需求(4)。
如果故事获得的反对票比赞成票多,则 z = 1, y = -1,因此得分为负数。这满足了需求(5)。
常数45,000是一个比例因子,用于平衡赞成票和年龄。一天有86,400秒,所以每天t会增加这么多。将t除以45,000得到1.92,这意味着一天的相对新度价值为101.92 = 83票,而两天的相对新度大约价值7,000票。
这些并非来自某个绝对真理或需要证明的东西,只是一种以最合理方式量化某个属性的方式,由开发团队决定。
当您想让某个因素成为次要因素(尽管较大的值确实在增长,但增长速度非常缓慢)时,可以使用对数。但同样道理,他们也可以选择立方根。
这些公式只是表征那些我们可以假定属于“热点”的因素,并将它们以适当的比例组合起来的一种表示方法(例如,我们会平方那些非常重要的值,并对那些不太重要的值取对数)。
一旦他们得出了公式,他们可能会尝试用10或15种不同类型的帖子插入数字,并发现这在各方面都很有意义,所以坚持使用该公式。事实上,他们最初的几次尝试可能效果不佳,经过一些调整数字后才得到该公式。