@olezhenka

Как сделать, чтобы меньшие числа давали больше очков?

Я вычитаю время размещения поста на настоящее время (пример:1493490780-1493487180) и мне надо сделать сортировку по самым актуальным постам, это я могу, но мне надо сделать очки по алгоритму "чем меньше, тем лучше"

вычитание дает равенство например
до 3600 то очков будет 50000
от 3601 до 7200 очков 25000
от 7201 до 10800 очков 10000
  • Вопрос задан
  • 365 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Буквально ваши правила реализуются подобным JavaScript кодом – с условиями:
function getPostScore(time) {
  var diff = Math.floor((new Date()).getTime()/1000) - time;
  if( diff <= 3600) return 50000;
  else if( diff <= 7200) return 25000;
  else if( diff <= 10800) return 10000;
  else return 0;
}

getPostScore(1493487180); // 10000


Но ступенчатость значений, наверное, не вполне оправдана и лучше будет какой-то гладкой функцией. Например, вида y = k / x
af5c49df83bb430f9f7ba91b2c6bc147.png
С коэффициентом k = 50000 * 3600 она удачно захватывает и вторую точку. Но плоха тем, что ближе к нулю зашкаливает в +бесконечность.

Наверное, для вашей задачи уместнее S-образная кривая – сигмоида, задаваемая формулой вида y = 1 / (1 + e-x) Примерно подобрал коэффициенты:
ecd0f96a15224fe2ac9fb125e7305b8f.png
function getPostSigma(time){
  var diff = Math.floor((new Date()).getTime()/1000) - time;
  return Math.round( 10000 + 40000 / (1 + Math.exp((diff-6800)/700)));
}

getPostSigma(1493531780); // 49998
getPostSigma(1493522780); // 11545
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
HIGHEST*exp(-diff/SPEED)
где
HIGHEST - константа максимального значения очков (за размещение 0 секунд назад)
SPEED - константа скорости убывания

например,
50000*exp(-diff/4500)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы