在Java中计算样本方差,但在插入相似的数字时给出了错误的答案

时间:2014-10-23 16:28:53

标签: java arraylist variance

import java.util.ArrayList;

public class Variance {
// Copy here sum from exercise 63 
public static int sum(ArrayList<Integer> list) {
    int sum = 0;        
    for(int i=0; i<list.size(); i++ ){
        sum = sum + list.get(i) ;
    }
    return sum;
}

// Copy here average from exercise 64 
public static double average(ArrayList<Integer> list) {  
    double average = sum(list)/list.size();
    return average;
}

public static double variance(ArrayList<Integer> list) {
    // write code here
   double sumMinusAverage = sum(list) - average(list);
   return sumMinusAverage * sumMinusAverage / (list.size()-1);
}

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(3);
    list.add(2);
    list.add(7);
    list.add(2);

    System.out.println("The variance is: " + variance(list));

}

}

该程序正在计算方差。但是当列表包含相同的数字等时1-s。程序说方差是3,但答案应该是0。

有人可以给我一些指导。

2 个答案:

答案 0 :(得分:5)

整数除法Luiggi Mendoza已经提到过你需要解决的一个问题,但另外,你计算方差的算法是不正确的。它不是分子中和与平均值之差的平方。

您必须总结各个元素与平均值的差异。除以(list.size() - 1)对样本差异是正确的。

public static double variance(ArrayList<Integer> list) {
   double sumDiffsSquared = 0.0;
   double avg = average(list);
   for (int value : list)
   {
       double diff = value - avg;
       diff *= diff;
       sumDiffsSquared += diff;
   }
   return sumDiffsSquared  / (list.size()-1);
}

列表中只有一个项目时要小心。方差应为0,但您需要检查大小以避免被零除异常。

此外,如果您想要人口差异,请改为list.size()

答案 1 :(得分:0)

问题在于:

double average = sum(list)/list.size();

sum(ArrayList<Integer>)返回intsum(list)/list.size()是整数除法,因此您将获得int结果。除法的小数部分将被截断。

为了解决这个问题,你应该将该部门的一个操作数强制转换为double

double average = ((double)sum(list))/list.size();

类似于variance方法。


这与主要问题无关,但您应该code oriented to interfaces, not to direct class implementations。这意味着,将变量和参数声明为List<Integer>而不是ArrayList<Integer>。这是一个例子:

public static int sum(List<Integer> list) {
    int sum = 0;        
    for(int i=0; i<list.size(); i++ ){
        sum = sum + list.get(i) ;
    }
    return sum;
}

//...

List<Integer> list = new ArrayList<Integer>();