以下为整理手记:
方法1、
维护一个cnt记录当前数据的个数,evr记录当前的平均值
然后每增减一个新数据val时,更新这个cnt和evr的值即可
evr += ((val - evr) / ++cnt);
int main()
{
int cnt = 0;
double evr = 0;
int i;
double d[] = {1234.5678, 1.23, 454.42, 178674.5843, 343.99};
//模拟,每产生一个数就更新这个cnt和evr
for (i = 0; i < sizeof(d) / sizeof(d[0]); ++i)
{
evr = evr + ((d[i] - evr) / ++cnt);//防止相加导致溢出
}
cout<<evr<<endl;
system("pause");
return 0;
}
方法2、
设x为已有数据的平均数,n为已有数据的个数,新的数据为y
那么就是
(x * n + y)/(n+1) =( x * (n+1) - x + y )/(n+1) = x + (y-x)/(n+1);
x + (y-x)/(n+1);这样就简单了。用double 应该问题不大。
其实结果是同方法1的。
参考出处:
http://topic.csdn.net/u/20111101/13/ad72da0e-7e1a-42ac-8b47-6f13ed873914.html