我需要创建一个业务逻辑或php函数来计算以下内容:给定一些输入$rank
(这是alexa排名)我需要以{{{}的方式计算一些$points
1}}对于排名靠前的网站来说会很高,并会随着$points
值的增加而减少。
我想象这样的事情:
$rank
如何以{/ p>的方式获得function($rank)
{
$points = x*$rank;
return $points;
}
$points
将为9500或附近。$points
将为6000或附近。$points
将为2或函数将返回的任何内容。规则:如果$points
小于$rank
则应该更多。 $points
的最大值为10000,适用于$points
。
现在随着$rank=1
的增加,$rank
值会相应减少。
答案 0 :(得分:0)
有许多公式可能满足您的要求。
一种可能性:
$points = 10000 * pow(0.993575964272119, pow($rank, 3.16332422407427) - 1)
这为您提供了以下results:
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]
如果你决定使用不同形式的功能,可以采用这种方法。
具有所需属性的可能的不同形式是:
$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)))
虽然这会导致曲线弯曲。
比较上述的这些替代方案:
答案 1 :(得分:0)
function getPoints($rank)
{
$returnValue = -0.005 * $rank * $rank - 0.035 * $rank + 100.040;
if ($returnValue < 0) $returnValue = 0;
return $returnValue;
}
这是我的想法。
函数不分支大值: 它应该至少给大排名一些小的价值...... 如果排名是2000000,那么积分将是2。 Thnx btw