确定平均值

时间:2013-10-21 15:52:22

标签: java math

我必须计算模拟的平均值。模拟正在进行中,我希望(每次迭代)打印当前的平均值。我该怎么做?

我尝试了下面的代码(在循环中),但我认为没有计算出正确的值......

int average = 0;
int newValue; // Continuously updated value.

if(average == 0) {
    average = newValue;
}

average = (average + newValue)/2;

我还教过将每个newValue存储在一个数组中,并且每次迭代都会汇总整个数组并进行计算。但是,我不认为这是一个很好的解决方案,因为循环是一个无限循环所以我无法确定数组的大小。

我也有可能想得太多,上面的代码实际上是正确的,但我不这么认为......

8 个答案:

答案 0 :(得分:6)

我会保持一个运行总计和一个迭代计数,遗憾的是不是递归的。

long total = 0;
int count = 0;

while ((int newValue = getValue()) > -1) // or other escape condition
{
   total += newValue;
   long average = total / ++count;
   System.out.println(average);
}

答案 1 :(得分:1)

另一种可能性:

double newValue, average;
int i = 1;

while(some_stop_condition)
{
    newValue = getValue();

    average = (average*(i-1) + newValue)/i;
    i++;
}

答案 2 :(得分:1)

由于这里的一些海报似乎在数学上受到挑战,所以让我说清楚:

可以得到平均值(n)和平均值(n + 1)之间的关系:

Average(n+1) = (Average(n)*n + new_value)/(n+1) 

假设以足够的精度计算平均值。

因此应该可以创建一个递归,但是对于OP来说它根本就不需要。

答案 3 :(得分:0)

尝试以下代码段:

double RecursiveAvg(double A[], int i, int n)  
{  
    //Base case  
    if (i == n-1) return A[i]/n;  

    return A[i]/n + RecursiveAvg(A, i + 1, n);  
}  

答案 4 :(得分:0)

在循环中,只需将每个newValue添加到一个变量上,该变量每次迭代时每个newValue都会递增,并记录“count”变量发生这种情况的次数。然后,为了获得该迭代的平均值,只需将总数除以考虑的值的数量。

int total = 0;
int count = 0;

// Whatever your loop is...
for(;;) {

    // Add the new value onto the total
    total += newValue;
    // Record the number of values added
    count ++;

    // Calculate the average for this iteration
    int average = total / count;
}

答案 5 :(得分:0)

或者,如果您想以简单的方式执行此操作,请不要实际计算平均值,直到您需要显示或使用它为止。只需保留sumcount,以及您需要的平均值

System.out.println("Average: " + (sum/count));

如果您想防止除以零,可以使用Ternary operator

System.out.println("Average: " + (count == 0 ? 0 : sum/count));

答案 6 :(得分:0)

您不必跟踪总数,也不必将平均值乘以迭代次数。您可以改为对新值进行加权并将其直接添加到平均值。类似的东西:

int count = 0;
double average;

while (/*whatever*/)
{
    double weighted = (newValue - average) / ++count;
    average += weighted;
}

答案 7 :(得分:0)

以oop的方式做到:

class Average {
  private int count;
  private int total;

  public void add ( int value ) {
    this.total += value;
    this.count += 1;
  }

  public int get () {
    return total / count;
  }
}