質問
さて、私はメンバーが1〜5の間に投票できる場所で評価機能を私のアプリケーションに追加することを考えています(これは $rating
)、そして私は次のような平均スコアを表示します $score = $number_of_voters / $rating
. 。どこ $number_of_voters
その特定のアイテムに投票されたメンバーの総カウント、そして $rating
その特定のアイテムの合計評価です。
そうすれば $score
5よりも高くすることはできません(それは外れています)。
しかし、ユーザーのRPGレベル(これは徐々に増加する可能性がある1〜8の数)に応じて投票の強度/力を統合することを考えています。 1平均スコアは、以前のスコアとはあまり変わらないでしょう(あまり影響を与えません)が、それが8のようなものであれば、それはそれに影響しますか? (投票時にRPGレベルが内部的に考慮されることを要約しすぎます)。
ただし、Intial仕様に影響を与えることなく(つまり、スコアが5より高くなりたくない($ score <= 5にしたい)方法(つまり、統合/実装する方法)方法がわかりません。
解決
当面の質問に対処するには、分数重量0-1を掛けることができます。さまざまなレベルがある場合は、ユーザーのレベルを最大レベルで除算することで、この重量を得ることができます。
しかし、コーディングを開始する前に、読む必要があります 平均評価で並べ替えない方法 そのため、この種の投票システムで一般的な落とし穴のいくつかを避けるようにします。
他のヒント
各ユーザーが貢献します (weight)*(rating)
全体的な評価に対して、分子はすべてのユーザーよりもこの合計です。
分母は可能な限り最大スコアです、各ユーザーの場合 (weight)*5
. 。したがって、分母はすべてのユーザーにおけるこの合計です。
次に、スコアを次のように計算します。
sum{ (user i's weight) * (user i's rating) } / sum{ (user i's weight) * 5 }
ただし、これにより0-1の範囲のスコアが得られます。5で正規化できる範囲0〜5のスコアが必要な場合は、分母の因子5を削除します。
2つのアレイがあると仮定します。 私-thアイテムはに対応します 私- ユーザーの評価) $ratings
重みの1つ( 私-thアイテムはに対応します 私-thユーザーのRPGレベル) $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
これは、投票したすべてのユーザーと投票が何であるかを実際に保存していない場合、配列を使用するよりも簡単です。