嗯,我正在考虑在我的应用程序中添加一个评分功能,成员可以在1-5之间投票(这是$rating),我像$score = $number_of_voters / $rating一样显示平均分数。其中,$number_of_voters是对该特定项目投票的成员总数,$rating是该特定项目的总评分。
这样一来,$score就不能高于5(它不在其中)。
然而,我正在考虑根据用户的RPG级别(这是一个1-8之间的数字,可以逐渐增加-每个成员都分配了)来整合投票强度/力量,所以如果他们投票,他们的RPG级别是1,那么平均得分就不会与之前的有太大不同(不会有太大影响),但是如果是8,那么它会影响更多?(也总结了他们的RPG水平将在投票时在内部考虑)。
但不确定如何在不影响初始规范的情况下进行(如何集成/实现)。我不希望分数高于5(我希望它是$score <= 5)。
发布于 2011-01-12 10:40:27
为了解决你直接的问题,你可以乘以分数权重0-1。如果你有不同的级别,你可以通过将用户的级别除以最大级别来获得这个权重。
但是在开始编码之前,您应该阅读How Not To Sort By Average Rating,这样您就可以避免这种投票系统的一些常见陷阱。
发布于 2011-01-12 10:39:22
每个用户对总体评分贡献(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。
假设您有两个数组,一个是rating(第i个项目对应于第i个用户的评分) $ratings,另一个是weights (第i个项目对应于第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;发布于 2011-01-12 10:52:54
试着做这样的事情...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如果您实际上没有存储每个投票的用户以及他们的投票结果,那么这比使用数组更容易。
https://stackoverflow.com/questions/4664835
复制相似问题