我想知道如果它是可能的,如果我有这样的计算一些数的平均值:

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

这依赖于一个事实,即你的平均值是目前你的总和计分。所以,你只需乘以平均计算得到的总和,通过添加新的价值和鸿沟(计数+ 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)

您可以存储CURRENTCOUNT和sumScore和你计算sumScore / CURRENTCOUNT。

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

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

:)

浮currentScore现在等于(currentScore *(CURRENTCOUNT-1)+ 4.5)/ CURRENTCOUNT?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top