2014-10-23 5 views
2
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이어야한다고 말합니다.Java에서 샘플 분산을 계산하지만 유사한 숫자를 삽입 할 때 잘못된 답을 제공합니다

누군가 어떤 방향으로 나에게 줄 수 있습니까?

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

sum(ArrayList<Integer>)int을 반환하고 결과로 int을 얻을 것이다, 그래서 sum(list)/list.size()는 정수 부서입니다 :

답변

4

Luiggi 멘도사가 이미 언급 한 정수 나누기 당신이 해결해야 할 문제이지만, 또한, 분산을 계산하는 알고리즘이 정확하지 : 다음은 예입니다. 분자의 합과 평균의 차이의 제곱이 아닙니다.

평균과 개별 요소의 차이점을 합산해야합니다. (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이어야하지만 0으로 나누기 예외가 발생하지 않도록 크기를 확인해야합니다.

또한 모집단 분산을 원하면 list.size()으로 나누십시오.

0

문제는 여기에있다. 부분의 소수 부분이 잘립니다.

이 문제를 해결하려면 double에 분단의 피연산자 중 하나를 주조한다 :

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

비슷한 방법 variance에 있습니다.


이것은 주요 문제와 관련이 없지만 code oriented to interfaces, not to direct class implementations이어야합니다. 즉, ArrayList<Integer> 대신 변수 및 매개 변수를 List<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>(); 
+0

double sumMinusAverage = ((double) sum (list)) - 평균 (목록); 너는 그런 뜻이라면 여전히 잘못된 대답을하고 있단 말인가? – UkoM