2008-12-04 27 views
7

me preguntaba si es posible calcular el promedio de algunos números si tengo esto:¿Puedo calcular el promedio de estos números?

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

Ahora, si recibo otra anotación (digamos 4,5), ¿puedo volver a calcular el promedio en lo que sería algo como:

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

o es esto imposible y todavía tengo que recordar la lista de puntuaciones?

Respuesta

20

Las siguientes fórmulas le permiten rastrear los promedios solo a partir de la media y el recuento almacenados, según lo solicitado.

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

Esto se basa en el hecho de que su promedio es actualmente su suma dividida por el recuento. Entonces, simplemente multiplique el recuento por promedio para obtener la suma, agregue su nuevo valor y divida por (recuento + 1), luego aumente la cantidad.

Entonces, digamos que usted tiene los datos {7,9,11,1,12} y lo único que mantiene es el promedio y el recuento. A medida que se añade cada número, se obtiene:

+--------+-------+----------------------+----------------------+ 
| 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 | 
+--------+-------+----------------------+----------------------+ 
+0

No debería ser eso currentScore = (currentScore * currentCount + 4.5)/(currentCount + 1) –

+0

Gracias, @John, no estaba pensando con claridad. – paxdiablo

+0

No se preocupe, es un error fácil de hacer –

16

Me gusta almacenar la suma y el recuento. Evita una multiplicación adicional cada vez.

current_sum += input; 
current_count++; 
current_average = current_sum/current_count; 
+1

Eso es un buen punto sobre el mantenimiento de la suma, sobre todo si se puede diferir el promedio hasta que se resumen todos los números. – paxdiablo

+0

Pero no debemos convertir esto en una sociedad de admiración mutua :-) – paxdiablo

+0

Exactamente; en general, puedes calcular el enésimo momento con sumas de poderes. Por ejemplo, puede calcular std.dev. con sumas de cuadrados, sumas y conteo. Sin embargo, si necesita una transmisión estándar. dev. no hagas eso, haz esto: http://www.cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf –

2

Puede almacenar currentCount y sumScore y calcula sumScore/currentCount.

1

flotador currentScore ahora es igual a (currentScore * (currentCount-1) + 4,5)/currentCount?

3

Es bastante fácil realmente, cuando se mira la fórmula para el promedio: A1 + A2 + ... + AN/N. Ahora bien, si usted tiene la edad media y el N (cuentan los números) se puede calcular fácilmente el nuevo promedio:

newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1) 
2

o ... si quieres ser tonto, lo puede hacer en una sola línea:

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

:)

+0

¿Hay alguna diferencia si hago ++ current_count vs current_count ++ ?? –

+0

Sí. Uno incrementa current_count antes de calcular current_average, el otro lo hace después. – slim

+0

tan ++ incrementos de la cuenta_actual ANTES de que se realice la división, ¿wile cuenta_actual ++ se incrementa DESPUÉS de la división? ¡Ay! solo mirando el código, habría pensado que habría sido ... "y dividir el lado izquierdo por el lado derecho que es (cuenta actual + 1). ¡Me alegro de haberlo hecho! –

Cuestiones relacionadas