Pregunta

Me preguntaba si es posible calcular el promedio de algunos números si tengo esto:

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

Ahora, si recibo otro puntaje (digamos 4.5), ¿puedo volver a calcular el promedio para que sea algo así como:

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

¿o es esto imposible y todavía necesito recordar la lista de puntajes?

¿Fue útil?

Solución

Las siguientes fórmulas le permiten realizar un seguimiento de los promedios solo del promedio almacenado y contar, según lo solicitó.

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 conteo por el promedio para obtener la suma, agregue su nuevo valor y divida por (conteo + 1), luego aumente el conteo.

Entonces, supongamos que tiene los datos {7,9,11,1,12} y lo único que mantiene es el promedio y el recuento. A medida que se agrega cada número, obtienes:

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

Otros consejos

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;

Realmente es bastante fácil, cuando miras la fórmula para el promedio: A1 + A2 + ... + AN / N . Ahora, si tiene el promedio anterior y la N (recuento de números), puede calcular fácilmente el nuevo promedio:

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

Puede almacenar currentCount y sumScore y calcular sumScore / currentCount.

o ... si quieres ser tonto, puedes hacerlo en una línea:

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

:)

float currentScore ahora es igual a (currentScore * (currentCount-1) + 4.5) / currentCount?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top