0

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

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

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

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

average = (average + newValue)/2;

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

还有一种可能是我想多了,上面的代码其实是对的,但我不这么认为……

4

8 回答 8

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);
}
于 2013-10-21T15:59:25.623 回答
1

另一种可能:

double newValue, average;
int i = 1;

while(some_stop_condition)
{
    newValue = getValue();

    average = (average*(i-1) + newValue)/i;
    i++;
}
于 2013-10-21T16:04:41.410 回答
1

由于这里的一些海报似乎在数学上受到挑战,让我声明一下显而易见的:

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

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

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

所以应该可以创建一个递归,尽管出于 OP 的目的,它根本不需要。

于 2013-10-21T16:05:44.837 回答
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);  
}  
于 2013-10-21T15:55:45.683 回答
0

在您的循环中,只需将每个变量添加newValue到一个变量中,该变量newValue每次迭代都会增加一个变量,并记录“计数”变量发生的次数。然后要获得该迭代的平均值,只需将总数除以所考虑的值的数量即可。

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;
}
于 2013-10-21T16:02:44.277 回答
0

或者,如果您想以简单的方式执行此操作,则在需要显示或使用它之前不要实际计算您的平均值。只要保持sum, 和count, 任何你需要平均的地方就行

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

如果要防止被零除,可以使用三元运算符

System.out.println("Average: " + (count == 0 ? 0 : sum/count));
于 2013-10-21T16:07:49.743 回答
0

您不必跟踪总数,也不必将平均值乘以迭代次数。您可以改为加权新值并将其直接添加到平均值中。就像是:

int count = 0;
double average;

while (/*whatever*/)
{
    double weighted = (newValue - average) / ++count;
    average += weighted;
}
于 2013-10-21T16:12:54.020 回答
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;
  }
}
于 2013-10-21T16:25:36.080 回答