我们希望创建一个评分算法,对于较短的时间给予更高的分数,对于较长的时间给予较低的分数。唯一需要注意的是时间范围非常广,可以从100毫秒到10分钟甚至更长时间,相应的分数范围为0到50分。感谢您的任何帮助。
f(x) = Ax/(A + x)
,它在x=0处快速增加但随着x的增加而逐渐减缓,直到接近A但从未达到。 (这个函数是增加的,您需要的是减少,但可以通过线性函数来解决——明显的例子是点= A - Ax/(A + x))
。
例如,如果您设置A=10
,则
f(0) = 10 - 10*0/(10 + 0) = 10,
f(1) = 10 - 10/11 = 9 1/11,
f(2) = 10 - 20/12 = 8 1/3,
f(100) = 10 - 1000/110 = 10/11
等等。
我认为你有两个选择:
如果您真的想要能够为任何时间长度分配积分,请选择一个公式,将积分数目除以时间量,例如:
points = [max_number_of_points]/[time]
在这里,time
应该是您最小的测量单位,以便它永远不会小于零。如果您不希望积分数量以那种速度减少,请将 time
除以或乘以某个常数,直到积分分布看起来符合您的要求。
认为实际上,存在一个时间限制,超过该时间的任何事物都应该得到零分。例如,当时间为一亿年与一千亿年时,我怀疑您是否关心积分差异。因此,以这种方式人为地选择一个最大时间,在有限范围内将所有更大的时间分配为零分,然后继续使用您的评分算法。
如果记录集太大,则所有类似的操作都必须有一些延迟。
假设您正在不断地从流中获取每个用户的时间,您要在一段时间内跟踪max
值,并且还有另一个系统可以动态地给分。
为现有的以毫秒为单位的时间记录集(可能存储在链接列表中或可能是动态增长的二维数组)在决定的重复间隔后触发得分计算。
得分计算逻辑:
我们清楚地看到它是时间花费的反比例关系。因此,您知道所有时间值等于上面计算的平均值的记录在1-50的尺度上为25。
因此,对于给定的记录,假设最大值为500 ms,记录为100 ms,则答案将是
50 * (500 - 100 ) / 500
。