我想知道如果我有这些数字,是否可以计算它们的平均值:
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 ?????
或者这是不可能的,我仍然需要记住分数列表吗?
currentScore = (currentScore * currentCount + newValue) / (currentCount + 1)
currentCount = currentCount + 1
这取决于您的平均值当前是您的总和除以计数。因此,您只需将计数乘以平均值即可获得总和,添加新值并除以(count + 1),然后增加计数。
假设您有数据{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 |
+--------+-------+----------------------+----------------------+
我喜欢存储总数和计数,这样可以避免每次多余的乘法运算。
current_sum += input;
current_count++;
current_average = current_sum/current_count;
其实很简单,只需看平均数的公式:A1 + A2 + ... + AN/N
。如果你已知旧平均数和数字数量N,那么可以轻松地计算出新的平均数:
newScore = (currentScore * currentCount + someNewValue)/(currentCount + 1)
或者,如果你想要有趣一点,你可以在一行代码中完成:
current_average = (current_sum = current_sum + newValue) / ++current_count;
:)
现在,浮点数变量currentScore等于(currentScore * (currentCount-1) + 4.5)/currentCount?