我必须报告传入数字的平均值,如果不使用某种数据结构来跟踪所有值,然后通过对它们求和并除以值的数量来计算平均值,我怎么能做到这一点?
问问题
185 次
5 回答
1
如果我没有完全弄错,avg(n+1)
也可以这样计算:
avg(n+1) = (a[1]+ ... + a[n+1]) / (n+1) =
= (a[1]+ ... + a[n])/(n+1) + a[n+1]/(n+1) =
= (n(a[1]+ ... + a[n])/n) / (n+1) + a[n+1]/(n+1) =
= n*avg(n) / (n+1) + a[n+1]/(n+1) =
= n/(n+1) * avg(n) + a[n+1]/(n+1)
所以将旧的 avg 乘以n/(n+1)
并加上新元素除以n+1
。根据将获得多高n
以及您的值有多大,这可以减少舍入误差......
编辑:当然,您必须n/(n+1)
使用浮点数进行计算,否则它将始终呈现 0 ...
于 2010-06-02T08:59:20.900 回答
1
如果你有数字a[1] a[2] ... a[n]
并且你知道它们的平均值是avg(n) = (a[1] + ... + a[n]) / n
,那么当你得到另一个数字时,a[n + 1]
你可以这样做:
avg(n + 1) = (avg(n) * n + a[n + 1]) / (n + 1)
一些浮点错误是不可避免的,但您应该对此进行测试,看看它是否足够好。
为避免溢出,您可以先进行除法:
avg(n + 1) = (avg(n) / (n + 1)) * n + (a[n + 1] / (n + 1))
于 2010-06-02T08:49:36.990 回答
1
保持当前的总和和计数。更新每个传入号码。
avg = sum / count.
于 2010-06-02T08:39:13.430 回答
1
只需继续计算总和以及您收到了多少数字,这就是计算平均值所需的全部内容。
于 2010-06-02T08:39:24.520 回答
0
您不需要跟踪总和,只需计数器:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage += (value - this->currentAverage) / ++count;
return this->currentAverage;
}
}
from->防止长时间运行平均溢出?
于 2010-07-23T07:55:20.210 回答