我有一个功能可以根据用户的体验返回用户的级别。我该如何改变这一点,以便我可以输入级别并获得该级别所需的体验?
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;
答案 0 :(得分:4)
我们需要在这里做一些代数。等级的公式是
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]
}
上述伪代码效率非常低,因为它检查每个可能的经验值。如今计算机非常高效,因此您可能会发现其数百万的经验。您可能会发现涉及二进制细分的例程应该更快地收敛到值。