PHP интенсивность голосования / сила?

Ну, я думаю о добавлении функции оценки в мое приложение, где участники могут голосовать между 1-5 (это $rating), и я отображаю средний балл как $score = $number_of_voters / $rating, куда $number_of_voters общее количество членов, проголосовавших по этому конкретному пункту, и $rating это общий рейтинг для этого конкретного элемента.

Таким образом, $score не может быть выше 5 (что вне его).

Однако я думаю об интеграции интенсивности / силы голосования в соответствии с уровнем РПГ пользователей (который является числом от 1 до 8, который может постепенно увеличиваться - который назначил каждый участник), так что если, например, они проголосовали, и их уровень РПГ был 1 средняя оценка не будет слишком отличаться от предыдущей (не повлияет ли она на нее слишком сильно), однако, если это будет что-то вроде 8, то это повлияет на нее больше? (слишком резюмируйте, что их уровень RPG будет рассмотрен внутри страны при голосовании).

Но не уверен, как действовать (как интегрировать / реализовать), не влияя на первоначальную спецификацию (т.е. я не хочу, чтобы оценка была выше 5 (хочу, чтобы она была $score <= 5)).

3 ответа

Решение

Чтобы ответить на ваш ближайший вопрос, вы можете умножить на дробный вес 0-1. Если у вас есть различные уровни, вы можете получить этот вес, разделив уровень пользователя на максимальный уровень.

Но прежде чем приступить к написанию кода, вам следует прочитать " Как не сортировать по среднему рейтингу", чтобы избежать некоторых распространенных ошибок в такой системе голосования.

Каждый пользователь вносит свой вклад (weight)*(rating) к общему рейтингу, поэтому числитель это сумма всех пользователей.

Знаменатель - максимально возможная оценка, для каждого пользователя это (weight)*5, Таким образом, знаменатель является суммой этого для всех пользователей.

Затем вычислите счет как:

sum{ (user i's weight) * (user i's rating) } / sum{ (user i's weight) * 5 }

Тем не менее, обратите внимание, что это дает вам оценку в диапазоне 0-1, если вы хотите, чтобы оценка в диапазоне 0-5, вы можете нормализовать на 5, это удаляет коэффициент 5 в знаменателе.

Предположим, у вас есть два массива, один из рейтингов (i-й элемент соответствует рейтингу i-го пользователя) $ratings и один из весов (i-й элемент соответствует уровню RPG i-го пользователя) $weights Вы можете вычислить это как:

$numer = 0;
$denom = 0;
for($i = 0; $i < count($ratings); $i++){
    $numer = $weights[$i]*$ratings[$i];
    $denom = $weights[$i];
}
$avg = $numer / $denom;

Попробуйте сделать что-то вроде этого... Голосование пользователей уровня 1 считается за 1 голос, а голос пользователей уровня 8 считается за 8 голосов:

$thisvote = $level * $vote; 
//a user with a level 5, and a vote of 5...this is 25
$total = ($total + $thisvote) / $level + 1;
//if total was 4, 25+4 = 29, 29 / 6 = 4.83

Это проще, чем использовать массивы, если вы на самом деле не сохраняете каждого проголосовавшего пользователя и его голос.

Другие вопросы по тегам