0

以下を計算するためのビジネス ロジックまたは php 関数を作成する必要があります。入力$rank(アレクサ ランキング) が与えられると、トップ ランキングの Web サイトでは高くなり、価値が高くなるにつれて減少する$pointsような方法でいくつかを計算する必要があります。$points$rank

私は次のようなものを想像します:

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

どうすれば$pointsそのような方法で取得できますか

  • ランクが 1 の場合、返されるポイントは最大 (10000 など) です。
  • ランクが 2 の場合は$points、9500 またはその近くが返されます。
  • ランクが 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になります。Thnxbtw

于 2012-11-18T18:20:38.283 に答える
0

あなたの要件を満たすかもしれない多くの公式があります。

ネストされたパワー

1 つの可能性:

$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

したがって、修正した 3 つの値 (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)

多項式の係数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 に答える