php - 反向 PHP 函数

标签 php math

我有一个函数可以根据用户的经验返回用户的级别。我该如何扭转这种情况,以便我可以输入级别并获得该级别所需的经验

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/

相关文章:

Java 浮点文字与 C#

java - 乘法是否可以进行短路评估?

javascript - 将 css 框阴影字符串解析为单独的值

php - 关闭站点并踢出用户进行升级的最佳方法是什么?

java - 使用 Java double (或其他任何东西)存储简单分数

php - PHP 命令行性能缓慢 - 这是正常现象还是我有安装问题?

php - 在获取对象上定义新变量 - mysql

java - 从一个原始整数列表生成打乱整数列表的算法

php - Symfony 尾部斜杠重定向丢弃 HTTPS

php - 如何在数据库中正确插入这些值