Могу ли я рассчитать среднее из этих чисел? - PullRequest
7 голосов
/ 04 декабря 2008

Мне было интересно, можно ли рассчитать среднее для некоторых чисел, если у меня есть это:

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 ?????

или это невозможно и мне все еще нужно запомнить список результатов?

Ответы [ 6 ]

20 голосов
/ 04 декабря 2008

Следующие формулы позволяют отслеживать средние значения только по сохраненному среднему значению и количеству, как вы и просили.

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 |
+--------+-------+----------------------+----------------------+
16 голосов
/ 04 декабря 2008

Мне нравится хранить сумму и количество. Это позволяет избежать дополнительного умножения каждый раз.

current_sum += input;
current_count++;
current_average = current_sum/current_count;
3 голосов
/ 04 декабря 2008

Это действительно легко, когда вы смотрите на формулу для среднего: A1 + A2 + ... + AN/N. Теперь, если у вас есть старое среднее и N (число чисел), вы можете легко вычислить новое среднее:

newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1)
2 голосов
/ 04 декабря 2008

или ... если вы хотите быть глупым, вы можете сделать это в одну строку:

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

:)

2 голосов
/ 04 декабря 2008

Вы можете сохранить значения currentCount и sumScore и рассчитать sumScore / currentCount.

1 голос
/ 04 декабря 2008

float currentScore теперь равен (currentScore * (currentCount-1) + 4,5) / currentCount?

...