我必须计算模拟的平均值。模拟正在进行中,我希望(每次迭代)打印当前的平均值。我该怎么做?
我尝试了下面的代码(在循环中),但我认为没有计算出正确的值......
int average = 0;
int newValue; // Continuously updated value.
if(average == 0) {
average = newValue;
}
average = (average + newValue)/2;
我还教过将每个newValue存储在一个数组中,并且每次迭代都会汇总整个数组并进行计算。但是,我不认为这是一个很好的解决方案,因为循环是一个无限循环所以我无法确定数组的大小。
我也有可能想得太多,上面的代码实际上是正确的,但我不这么认为......
答案 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)
或者,如果您想以简单的方式执行此操作,请不要实际计算平均值,直到您需要显示或使用它为止。只需保留sum
和count
,以及您需要的平均值
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;
}
}