2008-12-04 12 views
7

ich mich gefragt, ob es möglich ist, die im Durchschnitt ein paar Zahlen zu berechnen, wenn ich diese haben:Kann ich den Durchschnitt dieser Zahlen berechnen?

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

Nun, wenn ich eine andere Punktzahl erhalten (von 4,5 lassen sagen), ich kann die durchschnittliche neu berechnen, so dass es etwas sein würde, wie:

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

oder ist das unmöglich und ich muss immer noch an die Liste der Ergebnisse erinnern?

Antwort

20

Mit den folgenden Formeln können Sie Durchschnittswerte nur anhand des gespeicherten Durchschnitts nachverfolgen und wie von Ihnen gewünscht zählen.

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

Dies beruht auf der Tatsache, dass Ihre durchschnittliche Zeit Ihre Summe durch die Zählung geteilt ist. Man multipliziert einfach die Anzahl mit dem Durchschnitt, um die Summe zu erhalten, addiert den neuen Wert und dividiert durch (Anzahl + 1) und erhöht dann die Anzahl.

Also, lassen Sie uns sagen, Sie haben die Daten {7,9,11,1,12} und das einzige, was Sie behalten, ist der Durchschnitt und die Anzahl. Da jede Zahl hinzugefügt wird, erhalten Sie:

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

Sollte das nicht currentScore = (currentScore * currentCount + 4.5)/(currentCount + 1) –

+0

Danke, @John, dachte nicht gerade. – paxdiablo

+0

Keine Sorge, es ist ein einfacher Fehler zu machen –

16

Ich mag es, die Summe und die Anzahl zu speichern. Es vermeidet jedes Mal eine zusätzliche Multiplikation.

+1

das über die Aufrechterhaltung der Summe ein guter Punkt ist, besonders wenn man die Mittelung verschieben können, bis Sie alle Zahlen summiert. – paxdiablo

+0

Aber wir sollten das nicht in eine gegenseitige Bewundungsgesellschaft verwandeln :-) – paxdiablo

+0

Genau; im Allgemeinen können Sie den n-ten Moment mit Summen von Mächten berechnen. Zum Beispiel können Sie die std.dev berechnen. mit Summen von Quadraten, Summen und zählen. Allerdings, wenn Sie eine Streaming-Standard benötigen. Entwickler Mach das nicht, tu das: http://www.cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf –

2

Sie können currentCount und sumScore speichern und Sie berechnen sumScore/currentCount.

1

float currentScore jetzt gleich (currentScore * (current-1) + 4,5)/current?

3

Es ist ziemlich einfach wirklich, wenn Sie die Formel für den Durchschnitt betrachten: A1 + A2 + ... + AN/N. Wenn Sie nun die alte Durchschnitt haben und die N (Zahlen zählen) können Sie ganz einfach den neuen Mittelwert berechnen:

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

oder ... wenn Sie albern sein wollen, können Sie es tun in einer Zeile:

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

:)

+0

Macht es einen Unterschied, wenn ich ++ current_count vs current_count ++ mache? –

+0

Ja. Man inkrementiert current_count vor der Berechnung current_average, der andere tut es nach. – slim

+0

so ++ current_count inkrementiert BEVOR die Division fertig ist, wird wile current_count ++ nach der Division inkrementiert? Autsch! nur wenn ich mir den code anschaue, hätte ich geglaubt, dass es gewesen wäre ... "und dividiere die linke Seite durch die rechte Seite, die (aktuelle Zählung + 1). Glad ich fragte! –