Усреднение возрастающего числа переменных - PullRequest
0 голосов
/ 02 июня 2010

Я должен сообщить среднее значение входящих чисел, как я могу это сделать, не используя какую-либо структуру данных для отслеживания всех значений, а затем вычисляя среднее значение, суммируя их и деля на число значений?

Ответы [ 5 ]

1 голос
/ 02 июня 2010

Если я не полностью ошибаюсь, можно вычислить avg(n+1) также так:

avg(n+1) = (a[1]+ ... + a[n+1]) / (n+1) = 
         = (a[1]+ ... + a[n])/(n+1)   +   a[n+1]/(n+1) = 
         = (n(a[1]+ ... + a[n])/n) / (n+1) + a[n+1]/(n+1) =
         = n*avg(n) / (n+1) + a[n+1]/(n+1) = 

         = n/(n+1) * avg(n) + a[n+1]/(n+1)

, так что умножьте старое среднее значение на n/(n+1) и добавьте новый элемент, разделенный на n+1. В зависимости от того, насколько высоким будет n и насколько велики ваши значения, это может уменьшить ошибки округления ...

РЕДАКТИРОВАТЬ: Конечно, вы должны рассчитать n/(n+1) с использованием чисел с плавающей запятой, иначе он всегда будет отображать 0 ...

1 голос
/ 02 июня 2010

Просто продолжайте подсчитывать сумму и сколько цифр вы получили, это все, что вам нужно для вычисления среднего.

1 голос
/ 02 июня 2010

Если у вас есть цифры a[1] a[2] ... a[n] и вы знаете, что их среднее значение составляет avg(n) = (a[1] + ... + a[n]) / n, то, когда вы получите другое число a[n + 1], вы можете сделать:

avg(n + 1) = (avg(n) * n + a[n + 1]) / (n + 1)

Некоторые ошибки с плавающей запятой неизбежны, но вы должны проверить это и посмотреть, достаточно ли это хорошо.

Чтобы избежать переполнения, сначала можно выполнить деление:

avg(n + 1) = (avg(n) / (n + 1)) * n + (a[n + 1] / (n + 1))

1 голос
/ 02 июня 2010

Сохранить текущую сумму и считать. Обновлять оба на каждый входящий номер.

avg = sum / count.
0 голосов
/ 23 июля 2010

вам не нужно отслеживать общую сумму, только счетчик:

class Averager {
   float currentAverage;
   size_t count;
   float addData (float value) {
       this->currentAverage += (value - this->currentAverage) / ++count;
       return this->currentAverage;
   }
}

from-> предотвращать длительное усреднение от переполнения?

...