7

私がこれを持っているならば、私はいくつかの数の平均を計算することが可能であるかどうか疑問に思いました:

int currentCount = 12;
float currentScore = 6.1123   (this is a range of 1 <-> 10).

ここで、別のスコア(たとえば、4.5)を受け取った場合、平均を再計算して、次のようにすることはできますか?

int currentCount now equals 13
float currentScore now equals ?????

または、これは不可能であり、スコアのリストを覚えておく必要がありますか?

4

6 に答える 6

19

次の数式を使用すると、要求に応じて、保存されている平均とカウントから平均を追跡できます。

currentScore = (currentScore * currentCount + newValue) / (currentCount + 1)
currentCount = currentCount + 1

これは、現在の平均が合計をカウントで割ったものであるという事実に依存しています。したがって、カウントに平均を掛けて合計を取得し、新しい値を追加して (カウント + 1) で割ってから、カウントを増やします。

それで、データが{7,9,11,1,12}あり、保持しているのは平均とカウントだけだとしましょう。各数値が追加されると、次のようになります。

+--------+-------+----------------------+----------------------+
| Number | Count |   Actual average     | Calculated average   |
+--------+-------+----------------------+----------------------+
|      7 |     1 | (7)/1           =  7 | (0 * 0 +  7) / 1 = 7 |
|      9 |     2 | (7+9)/2         =  8 | (7 * 1 +  9) / 2 = 8 |
|     11 |     3 | (7+9+11)/3      =  9 | (8 * 2 + 11) / 3 = 9 |
|      1 |     4 | (7+9+11+1)/4    =  7 | (9 * 3 +  1) / 4 = 7 |
|     12 |     5 | (7+9+11+1+12)/5 =  8 | (7 * 4 + 12) / 5 = 8 |
+--------+-------+----------------------+----------------------+
于 2008-12-04T12:14:59.443 に答える
16

合計とカウントを保存するのが好きです。毎回余分な乗算を回避します。

current_sum += input;
current_count++;
current_average = current_sum/current_count;
于 2008-12-04T12:13:41.427 に答える
3

平均の式を見ると、非常に簡単ですA1 + A2 + ... + AN/N。ここで、古い平均と N (数値のカウント) があれば、新しい平均を簡単に計算できます。

newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1)
于 2008-12-04T12:15:48.710 に答える
2

currentCount と sumScore を格納して、sumScore/currentCount を計算できます。

于 2008-12-04T12:14:14.047 に答える
2

または...愚かになりたい場合は、1行で実行できます。

 current_average = (current_sum = current_sum + newValue) / ++current_count;

:)

于 2008-12-04T12:45:34.890 に答える
1

float currentScore は (currentScore * (currentCount-1) + 4.5)/currentCount ?

于 2008-12-04T12:15:09.163 に答える