有许多公式可以满足您的要求。
嵌套权力
一种可能:
$points = 10000 * pow(0.993575964272119, pow($rank, 3.16332422407427) - 1)
这将为您提供以下结果:
f(1) = 10000
f(2) = 9500
f(4) = 6000
f(9) = 12.065
f(10) = 0.84341
f(200) = 0
因此,您固定的三个值(1、2 和 4)都满足,但 200 的结果表明这可能不是您要寻找的。曲线如下所示:
顺便说一句,我使用 python 和 mpmath 发现了这一点,方法是固定公式的形式并确定具有多位数字的数字:
>>> import mpmath
>>> print(mpmath.findroot((lambda a,b: 10000*a**(2**b - 1) - 9500,
... lambda a,b: 10000*a**(4**b - 1) - 6000),
... (0.995, 2.7)))
[0.993575964272119]
[ 3.16332422407427]
如果您决定使用不同形式的函数,则可能会采用这种方法。
多项式的 Exp
具有所需属性的可能的不同形式是:
$points = exp(9.14265175282929 + $rank*(0.127179575914116 - $rank*0.0594909567672230))
这不会像上面的那样迅速减少:
f( 1) = 10000
f( 2) = 9500
f( 4) = 6000
f( 13) = 2.1002
f( 14) = 0.47852
f(200) = 0
它是通过求解这个方程组得到的:
a + b + c = log(10000)
a + 2b + 4c = log( 9500)
a + 4b + 16c = log( 6000)
以获得多项式的系数a到c。也可以添加另一个度数来匹配f(200)=2
,但在这种情况下,最后一个系数将变为正数,这意味着对于非常大的等级,分数将随着等级开始增加。
如果你也想匹配它f(200)=2
,你可以使用
$points = exp(max(8.86291000469285 - $rank*0.0408488141206645,
9.14265175282929 + $rank*(0.127179575914116 - $rank*0.0594909567672230)))
虽然这会导致你的曲线弯曲。
将这些替代方案与上述方案进行比较: