2008-12-04 50 views
7

我想知道,如果它是可以計算的一些數字的平均值,如果我有這樣的:我可以計算這些數字的平均值嗎?

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

現在,如果我收到再得一分(假設4.5),我可以重新計算平均所以這將是什麼如:

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

或者這是不可能的,我仍然需要記住分數列表?

回答

20

以下公式允許您根據您的要求僅根據存儲的平均值和計數來跟蹤平均值。

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

這取決於您的平均值是您的總和除以計數的事實。所以你只需乘以平均數來得到總和,加上你的新值併除以(count + 1),然後增加count。

因此,假設您有數據{7,9,11,1,12},唯一保留的是平均值和數量。隨着每個數字的增加,您將得到:

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

我喜歡存儲總和和計數。它避免了每次多餘的乘法。

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

這是對維護總和,特別是如果你可以推遲平均直到你總結出所有的數字好點。 – paxdiablo 2008-12-04 12:22:43

+0

但我們不應該把它變成一個相互欽佩的社會:-) – paxdiablo 2008-12-04 12:23:15

+0

沒錯;一般來說,你可以用權力總和來計算第n個時刻。例如,你可以計算std.dev。與正方形,總數和數量相加。但是,如果您需要流式標準。開發。不要這樣做,這樣做:http://www.cs.berkeley.edu/~mhoemmen/cs194-fall2007/Tutorials/variance.pdf – 2008-12-04 12:26:07

2

您可以存儲currentCount和sumScore,並計算sumScore/currentCount。

1

float currentScore now等於(currentScore *(currentCount-1)+ 4.5)/ currentCount?

3

當你看到平均值的公式時,這真的很容易:A1 + A2 + ... + AN/N。現在,如果你有舊平均值和N(數字計算),你可以很容易地計算新的平均值:

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

或...如果你想成爲愚蠢的,你可以做一個行:

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

:)