|
|
|
| Есть код из CMS LiveStreet. Код отвечает за начисление рейтинга пользователю при голосовании за него. Нужен подробный комментарий по коду: что там делается (в плане зачем, почему логарифмы, почему именно такие формулы), почему примерно такие значения выбираются...
/**
* Начисляем силу автору коммента, используя логарифмическое распределение
*/
$skill=$oUser->getSkill();
$iMinSize=0.004;
$iMaxSize=0.5;
$iSizeRange=$iMaxSize-$iMinSize;
$iMinCount=log(0+1);
$iMaxCount=log(500+1);
$iCountRange=$iMaxCount-$iMinCount;
if ($iCountRange==0) {
$iCountRange=1;
}
if ($skill>50 and $skill<200) {
$skill_new=$skill/70;
} elseif ($skill>=200) {
$skill_new=$skill/10;
} else {
$skill_new=$skill/130;
}
$iDelta=$iMinSize+(log($skill_new+1)-$iMinCount)*($iSizeRange/$iCountRange);
|
| |
|
|
|
|
|
|
|
для: Sturmvogel
(13.05.2011 в 00:35)
| | Для оценки рейтинга используется логарифмический рост. Если экспоненциальное распределение идет от нуля до бесконечности по нарастающей (сначала медленно, потом все быстрее и быстрее), то логарифмическое идет от нуля до бесконечности (сначала быстро, потом все медленее и медленее). Т.е. у новичков рейтинг растет быстро, а у тех у кого какой рейтинг повыше - медленее, и чем выше рейтинг, тем медленее он растет. Так как автора не очень удовлетворял слишком быстрый логарифмический рост на первых этапах, вероятно разброс был слишком велик, он ввел весовые коэффициенты, до 50 пунктов рейтинг делится на 130, от 50 до 200 на 70, а выше на 10. Т.е. рост получается более плавный, чем логарифмический, но все-равно имеет тенденцию логарифмического роста. | |
|
|
|
|
|
|
|
для: cheops
(13.05.2011 в 12:08)
| | огромное спасибо! | |
|
|
|
|
|
|
|
для: Sturmvogel
(13.05.2011 в 00:35)
| | а зачем нужен код:
if ($iCountRange==0) {
$iCountRange=1;
}
|
если известно, что log(0+1) != log(500+1)? | |
|
|
|
|
|
|
|
для: Sturmvogel
(20.05.2011 в 19:34)
| | Вы правы, вероятно это подстраховка, чтобы предотвратить от деления на 0, возможно от старого кода осталась. | |
|
|
|