反转PHP函数

3

我有一个函数根据用户的经验值返回用户的等级。现在我想反过来实现,输入用户的等级,获取达到该等级所需的经验值,应该怎么做呢?

function getLevel($experience)
{
    return round ( sqrt( pow($experience, 1.4) - 1.5*$experience +1) /100 );
}

function getExperienceByLevel($level)
{
    return ???;
}

这是我目前使用普通数学所做的。由于我知道$level,我希望表达式为$experience = XXXX

$level      = sqrt( pow($experience, 1.4) - 1.5*$experience +1) /100;
$level*100  = sqrt( pow($experience, 1.4) - 1.5*$experience +1);

pow($level*100, 2) = pow($experience, 1.4) - 1.5*$experience + 1;

已更新问题。 - Fredrik
另外,我可以使用循环调用getLevel()直到获取级别。但这似乎是一种非常丑陋的方法。 - Fredrik
或者你只需运行该循环一次,并硬编码一个包含lvl => xp的数组,这样你就可以进行简单的查找。 - Gordon
@Gordon 那确实是一种方法。不过,直接解决数学问题会更简洁明了吧? - Fredrik
取决于情况。从智力上讲,硬编码数组肯定更好,但如果您硬编码数组,则可以获得O(1)查找,因此在性能方面可能比进行数学计算更快。虽然我想这并不重要。 - Gordon
显示剩余2条评论
1个回答

4
我们需要进行一些代数运算。级别的公式为:
lvl = floor( sqrt( expr^1.4 - 1.5*expr +1) / 100 + 0.5)

倒推考虑

关于IT技术相关内容
lvl = sqrt( expr^1.4 - 1.5*expr +1) / 100 + 0.5

那么

lvl - 0.5 = sqrt( expr^1.4 - 1.5*expr +1) / 100

并且

100 * lvl - 50 = sqrt( expr^1.4 - 1.5*expr + 1)

正方形

10000 * lvl^2 - 10000 * lvl + 2500 =  expr^1.4 - 1.5*expr + 1
10000 * lvl^2 - 10000 * lvl + 2499 =  expr^1.4 - 1.5*expr

现在让左边由Q代表,那么我们就有:
expr^1.4 - 1.5*expr = Q

这实际上是一个难以代数求解的方程。通过忽略线性部分,可以得到简化的方程来找到近似值。

expr^1.4 = Q

提供
expr = pow(Q, 1/1.4)

实际上这告诉我们最好通过数值计算来解决它。你也可以构建一个查找表。一个简单的方法是

int[] exprForLevel
function generateExprsForLevel() {
    curLevel = 1
    expForLevel[1] = 0
    for(i=0; i< MaxPossibleExperience; ++i) {
        lvl = getLevel(i)
        if(lvl > curLevel) {
            curLevel = lvl
            expForLevel[curLevel] = i
        }
    }

function getExperienceByLevel(level) {   
    return expForLevel[level]
}

上述伪代码效率较低,因为它检查了每个可能的经验值。现在的计算机非常高效,所以你可能会发现它对于几百万的经验是好的。你可以找到一个涉及二进制细分的例程,它应该更快地收敛到这些值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接