Вы можете просто дать ему взвешенную оценку при ранжировании результатов, в отличие от простого отображения среднего числа голосов, пока умноженного на некоторую функцию количества голосов.
Пример на C # (потому что это то, что I знает лучше всего ...), который можно легко перевести на ваш язык:
double avgScore = Math.Round(sum / n);
double rank = avgScore * Math.Log(n);
Здесь я использовал логарифм n
в качестве весовой функции - но он будет работать хорошо только в том случае, если количество голосов не слишком мало или не слишком велико. То, насколько велико значение «оптимально», зависит от того, сколько вы хотите, чтобы количество голосов имело значение.
Если вам нравится логарифмический подход, но базовая 10
на самом деле не работает с вашими подсчетами голосов, вы можете легко использовать другую базу. Например, сделать это в базе 3
вместо:
double rank = avgScore * Math.Log(n, 3);
Какую функцию вы должны использовать для взвешивания, вероятно, лучше всего определяется по порядку числа голосов, которые вы ожидаете получить.
Вы также можете использовать пользовательскую функцию взвешивания, определив
double rank = avgScore * w(n);
, где w(n)
возвращает значение веса в зависимости от количества голосов. Затем вы определяете w(n)
как хотите, например, так:
double w(int n) {
// caution! ugly example code ahead...
// if you even want this approach, at least use a switch... :P
if (n > 100) {
return 10;
} else if (n > 50) {
return 8;
} else if (n > 40) {
return 6;
} else if (n > 20) {
return 3;
} else if (n > 10) {
return 2;
} else {
return 1;
}
}