2008-12-04 63 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; 

:)