Php 将递增秩映射到递减但非负的点
我需要创建一个业务逻辑或php函数来计算以下内容:给定一些输入Php 将递增秩映射到递减但非负的点,php,function,math,business-logic,Php,Function,Math,Business Logic,我需要创建一个业务逻辑或php函数来计算以下内容:给定一些输入$rank(这是alexa排名),我需要计算一些$points,这样$points对于排名靠前的网站来说会很高,并且会随着$rank值的增加而降低 我想象这样的情况: function($rank) { $points = x*$rank; return $points; } 我如何获得$积分 如果排名为1,则返回的分数为最大值(例如10000) 如果排名为2,则返回的$points将为9500或附近 如果排名为4
$rank
(这是alexa排名),我需要计算一些$points
,这样$points
对于排名靠前的网站来说会很高,并且会随着$rank
值的增加而降低
我想象这样的情况:
function($rank)
{
$points = x*$rank;
return $points;
}
我如何获得$积分
- 如果排名为1,则返回的分数为最大值(例如10000)
- 如果排名为2,则返回的
将为9500或附近$points
- 如果排名为4,则返回的
将为6000或附近$points
- 如果秩为200,则返回的$points将为2或函数将返回的任何值
$rank
小于,则$points
应大于。$points
的最大值为10000,表示$rank=1
现在随着
$rank
的增加,$points
的值应该相应减少。有许多公式可以满足您的要求
嵌套幂
一种可能性:
$points = 10000 * pow(0.993575964272119, pow($rank, 3.16332422407427) - 1)
这将为您提供以下信息:
因此,您确定的三个值(1、2和4)都是满意的,但是200的结果表明这可能不是您想要的。曲线如下所示:
function($rank)
{
$points = x*$rank;
return $points;
}
顺便说一句,我使用python和mpmath找到了这一点,通过修正公式的形式并用数字确定数字:
导入mpmath
>>>打印(mpmath.findroot)(λa,b:10000*a**(2**b-1)-9500,
…λ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)))
尽管这会导致曲线弯曲
要将这些备选方案与上述方案进行比较:
function getPoints($rank)
{
$returnValue = -0.005 * $rank * $rank - 0.035 * $rank + 100.040;
if ($returnValue < 0) $returnValue = 0;
return $returnValue;
}
函数获取点($rank)
{
$returnValue=-0.005*$rank*$rank-0.035*$rank+100.040;
如果($returnValue<0)$returnValue=0;
return$returnValue;
}
这是我的想法
函数没有为大值分叉:
它至少应该给大等级的人一些小的价值。。。
比如,如果排名是2000000,那么分数将是2。
Thnx btw您要求
$points
为正还是非负?“你认为它是完整的吗?”维布斯在我的帖子中添加了另一个选项。请务必记住最后一次。