0

我需要创建一个业务逻辑或 php 函数来计算以下内容:给定一些输入$rank(这是 alexa 排名),我需要以$points这样一种方式计算一些,$points对于排名靠前的网站来说将很高,并且会随着$rank价值的增加而减少。

我想象这样的事情:

function($rank)
{
    $points = x*$rank;
    return $points;
}

我怎样才能$points以这样的方式得到

  • 如果排名为 1,则返回的点数为最大值(例如 10000)。
  • 如果 rank 为 2 则$points返回 9500 或附近。
  • 如果 rank 为 4 则$points返回 6000 或附近。
  • 如果排名为 200,则$points返回 2 或函数返回的任何值。

规则:如果$rank少则$points应该多。的最大值$points是 10000,即$rank=1.

现在随着$rank增加,$points值应该相应减少。

4

2 回答 2

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

于 2012-11-18T18:20:38.283 回答
0

有许多公式可以满足您的要求。

嵌套权力

一种可能:

$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)

以获得多项式的系数ac。也可以添加另一个度数来匹配f(200)=2,但在这种情况下,最后一个系数将变为正数,这意味着对于非常大的等级,分数将随着等级开始增加。

如果你也想匹配它f(200)=2,你可以使用

$points = exp(max(8.86291000469285 - $rank*0.0408488141206645,
    9.14265175282929 + $rank*(0.127179575914116 - $rank*0.0594909567672230)))

虽然这会导致你的曲线弯曲。

将这些替代方案与上述方案进行比较:

功能比较

于 2012-11-14T18:39:52.517 回答