平均增加变量的数量

时间:2010-06-02 08:37:40

标签: c# numbers average

我必须报告传入数字的平均值,如何在不使用某种数据结构来跟踪所有值的情况下执行此操作,然后通过将它们相加并除以值的数量来计算平均值?

5 个答案:

答案 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;
   }
}

从 - > prevent long running averaging from overflow?