我有一个函数可以根据用户的经验返回用户的级别。我该如何扭转这种情况,以便我可以输入级别并获得该级别所需的经验?
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;
最佳答案
我们需要在这里做一些代数运算。水平的公式是
lvl = floor( sqrt( expr^1.4 - 1.5*expr +1) / 100 + 0.5)
逆向思考
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]
}
上面的伪代码效率很低,因为它检查了每一个可能的经验值。现在的计算机非常高效,因此您可能会发现它的好处高达数百万次。您可能会发现涉及二进制分割的例程应该更快地收敛到这些值。
关于php - 反向 PHP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39791661/