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

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

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

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

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


person newbtophp    schedule 12.01.2011    source источник
comment
$score = $number_of_voters / $рейтинг? что это значит... вы имеете в виду $score = $number_of_voters(рейтинг=1)/1 + $number_of_voters(рейтинг=2)/2 и т. д.   -  person Jason    schedule 12.01.2011
comment
@Jason Джейсон, я отредактировал свой первоначальный вопрос / сообщение с дополнительной информацией - пожалуйста, посмотрите :)   -  person newbtophp    schedule 12.01.2011


Ответы (3)


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

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

person Jim    schedule 12.01.2011

Каждый пользователь вносит (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< /em>-й элемент соответствует i-му уровню RPG пользователя) $weights вы можете вычислить это как:

$numer = 0;
$denom = 0;
for($i = 0; $i < count($ratings); $i++){
    $numer = $weights[$i]*$ratings[$i];
    $denom = $weights[$i];
}
$avg = $numer / $denom;
person Mark Elliot    schedule 12.01.2011
comment
Приветствую Марка за быстрый ответ, однако я немного запутался в том, как интегрировать ваш метод, не могли бы вы уточнить, что такое $ratings и $weights (я понимаю их массивы, но не уверен, какие данные они содержат), пожалуйста? - person newbtophp; 12.01.2011

Попробуйте сделать что-то вроде этого... Голос пользователя уровня 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

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

person Mike L.    schedule 12.01.2011