我必须报告传入数字的平均值,如何在不使用某种数据结构来跟踪所有值的情况下执行此操作,然后通过将它们相加并除以值的数量来计算平均值?
答案 0 :(得分:1)
保持当前的总和和计数。每次传入号码都要更新。
avg = sum / count.
答案 1 :(得分:1)
只需保持运行总和以及收到的数量,这就是计算平均值所需的全部内容。
答案 2 :(得分: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))
答案 3 :(得分: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)
将旧的平均值乘以n/(n+1)
并添加新元素除以n+1
。取决于n
将获得多高以及您的值有多大,这可以减少舍入误差......
编辑:当然你必须使用浮点数来计算n/(n+1)
,否则它将始终呈现为0 ...
答案 4 :(得分:0)
您无需跟踪总金额,只需计数器:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage += (value - this->currentAverage) / ++count;
return this->currentAverage;
}
}