Короткий ответ
Вы можете использовать 4.328085 * Math.log(0.00519842 * xp + 1.259921045)
как очень хорошее приближение соответствующего уровня.
Если вам нужно точное значение, вы можете перебирать все уровни, пока не найдетежелаемый диапазон, как в этом ответе .
Длинном ответе
Слегка измененная функция
Не думаю, что можно найти точный, выражение в замкнутой форме для обратной функции.Это возможно, если вы немного измените getExperience(level)
.
- Во-первых, вы можете заметить, что
x
растет намного медленнее, чем 2 ** (x / 3)
. - Тогда
Math.floor
не имеет большого влияния на большие числа.
Так что давайте удалим их!Вот немного измененная функция:
function getExperienceEstimate(level) {
let a = 0;
for (let x = 1; x < level; x += 1) {
a += 200 * (2 ** (x / 3));
}
return a / 4;
}
Преимущество этого метода состоит в том, что теперь он представляет собой геометрический ряд , поэтому можно вычислять сумму напрямую , безлюбой цикл:
function getExperienceEstimate(level) {
let a = 50;
let r = 2 ** (1 / 3);
return a * (r**level - r) / (r - 1);
};
getExperienceEstimate(50)
возвращает 20011971.993575357
, что всего на 0,0015% меньше, чем getExperience(50)
.
Обратная функция
Согласно Wolfram Alpha , вот обратная функция getExperienceEstimate
:
function getLevelEstimate(xp){
let a = 50;
let r = 2 ** (1 / 3);
return Math.log(xp * (r - 1) / a + r) / Math.log(r);
};
С небольшой потерей точности вы можете еще больше упростить ее:
function getLevelEstimate(xp){
return 4.328085 * Math.log(0.00519842 * xp + 1.259921045)
};
Это только оценка,но он работает довольно хорошо и не требует никакого цикла!
Test
Для 20012272 XP приблизительная обратная функция возвращает 50.00006263463371
, что должно быть хорошей отправной точкой, если вы хотитенайти точный результат.
function getExperience(level) {
let a = 0;
for (let x = 1; x < level; x += 1) {
a += Math.floor(x + (200 * (2 ** (x / 3))));
}
return Math.floor(a / 4);
}
function getLevelEstimate(xp){
return 4.328085 * Math.log(0.00519842 * xp + 1.259921045)
};
for (var i = 1; i < 100; i++) {
console.log(`Level ${i} (XP = ${getExperience(i)}). Estimated level : ${getLevelEstimate(getExperience(i))}`);
}