Question

Je me demandais s'il était possible de calculer la moyenne de certains nombres si j'avais ceci:

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

Maintenant, si je reçois un autre score (disons 4,5), puis-je recalculer la moyenne pour que ce soit quelque chose comme:

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

ou est-ce impossible et je dois encore me souvenir de la liste des scores?

Était-ce utile?

La solution

Les formules suivantes vous permettent de suivre les moyennes uniquement à partir de la moyenne et du nombre enregistrés, comme vous le souhaitez.

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

Cela repose sur le fait que votre moyenne correspond actuellement à votre somme divisée par le nombre. Il vous suffit donc de multiplier le nombre par la moyenne pour obtenir la somme, d'ajouter votre nouvelle valeur et de la diviser par (nombre + 1), puis d'augmenter le nombre.

Supposons que vous ayez les données {7,9,11,1,12} et que vous ne gardiez que la moyenne et le nombre. A chaque numéro ajouté, vous obtenez:

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

Autres conseils

J'aime stocker la somme et le compte. Cela évite une multiplication supplémentaire à chaque fois.

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

C’est vraiment très facile, quand on regarde la formule de la moyenne: A1 + A2 + ... + AN / N . Maintenant, si vous avez l'ancienne moyenne et le N (nombre de chiffres), vous pouvez facilement calculer la nouvelle moyenne:

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

Vous pouvez stocker currentCount et sumScore et calculer sumScore / currentCount.

ou ... si vous voulez être stupide, vous pouvez le faire en une seule ligne:

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

:

float currentScore est maintenant égal à (currentScore * (currentCount-1) + 4.5) / currentCount?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top