0

我必须报告传入数字的平均值,如果不使用某种数据结构来跟踪所有值,然后通过对它们求和并除以值的数量来计算平均值,我怎么能做到这一点?

4

5 回答 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 回答