我有一个根据用户的经验返回用户级别的函数.我将如何扭转这种状况,以便我可以输入级别并获得该级别所需的经验?
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,math
来源: https://codeday.me/bug/20191026/1938078.html