2

さて、私はメンバーが1-5の間で投票できる評価機能をアプリケーションに追加することを考えています(これは$rating)、そして私はのような平均スコアを表示し$score = $number_of_voters / $ratingます。$number_of_votersはその特定のアイテムに投票したメンバーの総数であり、はその特定のアイテム$ratingの合計評価です。

そう$scoreすれば、5より高くすることはできません(それは外れています)。

ただし、ユーザーのRPGレベル(各メンバーが割り当てた1〜8の数値で、徐々に増加する可能性があります)に応じて投票の強度/力を統合することを考えています。たとえば、投票した場合、RPGレベルは次のようになります。 1平均スコアは前のスコアとあまり変わらない(あまり影響しない)が、8のようなものであれば、もっと影響するだろうか?(要約しすぎると、投票時にRPGレベルが内部的に考慮されます)。

しかし、最初の仕様に影響を与えずに続行する方法(統合/実装する方法)がわからない(つまり、スコアが5より高くなることを望まない($ score <= 5であることが望まれる))。

4

3 に答える 3

2

差し迫った質問に対処するために、分数の重み0-1を掛けることができます。さまざまなレベルがある場合は、ユーザーのレベルを最大レベルで割ることで、この重みを取得できます。

ただし、コーディングを開始する前に、この種の投票システムでよくある落とし穴のいくつかを回避するために、「平均評価で並べ替えない方法」を読む必要があります。

于 2011-01-12T02:40:26.867 に答える
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番目の項目はi番目のユーザーのRPGレベルに対応)の2つの配列があるとすると、これは次の$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-12T02:39:21.890 に答える
0

次のようなことを試してください...レベル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

これは、投票したすべてのユーザーとその投票内容を実際に保存していない場合は、配列を使用するよりも簡単です。

于 2011-01-12T02:52:53.943 に答える