【发布时间】:2023-03-23 13:20:01
【问题描述】:
我们希望创建一种评分算法,以更少的时间奖励更高的分数,并为更长的时间奖励更少的分数。需要注意的是,没有实际范围,因此时间范围可以从 100 毫秒到 10 分钟或更长,点范围为 0 到 50。
感谢您的帮助。
【问题讨论】:
我们希望创建一种评分算法,以更少的时间奖励更高的分数,并为更长的时间奖励更少的分数。需要注意的是,没有实际范围,因此时间范围可以从 100 毫秒到 10 分钟或更长,点范围为 0 到 50。
感谢您的帮助。
【问题讨论】:
您可以使用以下等式简单地将其设为线性映射:
points = 50 * 100/time_in_ms
这会给你:
time_in_ms=100ms => 50 积分...time_in_ms=10min => 0.0083 积分...time_in_ms=+∞ => 0 积分如果时间和点的范围发生变化,您可以轻松调整上述公式。
【讨论】:
100。例如,如果您使用points = 50 * 10 / sqrt(time),您仍然会在 100 毫秒内获得 50 分,而 5 秒将获得大约 7 分。直到 250 秒或刚刚超过 4 分钟,它才会达到 1 分。
您可以在应用线性映射之前以某种方式转换延迟,以便更早地更快地给出点并且稍后给出点。一种选择是采用到目前为止时间的对数。另一种选择是函数f(x) = Ax/(A + x),它在 x=0 时从 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 除以或乘以某个常数,直到点数分布符合您的要求。
确定确实存在一个限制,即时间如此之长,以至于超过该时间的任何内容都应该得到零分。例如,我怀疑您是否关心时间为 1 亿年与 1000 亿年相比的点差。因此,以这种方式人为地选择一个最大时间,分配所有大于零的时间点,然后在有限范围内继续您的评分算法。
【讨论】:
如果记录集太大,这样的事情必须延迟一些时间才能完成。
假设您在一段时间内跟踪max 值的流中持续获取每个用户花费的时间,并且您还有另一个动态评分系统。
在以毫秒为单位的现有记录集的确定重复间隔后触发点的计算(可能存储在链表中,也可能是动态增长的二维数组。
积分计算逻辑:
我们清楚地将其视为所用时间的反线性关系。所以你知道所有时间值等于上面计算的平均值的记录在 1 - 50 的范围内得到 25。
因此对于给定的记录假设 100 毫秒,最大值为 500 毫秒,答案将是
50 * (500 - 100 ) / 500
【讨论】: