2013-12-16 2 views
2

Я пишу код для своего класса AP Computer Science, и мне нужно найти дисперсию группы чисел. Для тех из вас, кто не знает, как найти дисперсию, это сумма квадратов различий значений из среднего значения, деленная на 1 меньше длины. Пример для этого более понятного. Если у вас были данные {1, 5, 8, 7, 2, 7}, тогда среднее значение было бы равно 6. Тогда вы могли бы быть [(1-6)^2 + (5-6)^2 + (8 -6)^2 + (7-6)^2 + (2-6)^2 + (7-6)^2]/5 = 8.4. Итак, вот этот метод.Код не находит правильную дисперсию

public static double variance(int[] data) { 
    int sum = 0; 
    double average; 

    for (int i=0; i < data.length; i++) { 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 

    for (int i=0; i < data.length; i++) { 
     data[i] = data[i] - (int)average^2; 
    } 

    int add = 0; 
    for (int d : data) 
     add += d; 
    add = add/data.length-1; 
    return add; 
    } 
} 

Я не разрешается изменять данные из Int массива, я понятия не имею, почему я получаю неправильный дисперсию, пожалуйста, помогите!

+0

Что это такое 'add = add/data.length-1;'? Некоторое целочисленное деление? Это нужно? –

+0

«все разделены на 1 меньше, чем длина» – user3053252

+0

Вы должны использовать поплавки для точного деления; используя int, результат округляется до целого. В вашем примере ваш результат никогда не будет «8.4», но, скорее, «8», если вы использовали int – nbrooks

ответ

6

Ваша самая очевидная проблема здесь:

average^2

^ оператор не экспоненциации. Это bitwise XOR.

Использование:

Math.pow(average, 2) 

или

average * average 

Кроме того,

  1. Вы должны умиротворять отклонение, а не средний.
  2. Не делайте (int) отливать
  3. add/data.length-1 неправильно
  4. Модификация data массива не требуется.

Добавление в немного очистки,

0

Есть несколько точек в вашем коде, где ваши расчеты теряют точность, которая, вероятно, вызывает ваш ответ будет далеко от того, что вы ожидаете. Как уже упоминалось, вы должны использовать Math.pow в Java для возведения в степень. Но это нужно применять к различию каждого значения и среднего, а не только по самому среднему значению. По существу, вам нужны скобки (a-b)^2 не a - b^2 (в математическом синтаксисе). Вы также должны использовать double как свой тип данных во всем, а не int.

public static double variance(int[] data) { 
    double sum = 0; 
    double average; 
    double[] deviations = new int[data.length]; 

    for (int i=0; i < data.length; i++) { 
     sum += data[i]; 
    } 
    average = sum/data.length; 

    for (int i=0; i < data.length; i++) { 
     deviations[i] = Math.pow(data[i] - average, 2); 
    } 

    double result = 0; 
    for (Double d : deviations) 
     result += d; 

    result = result/data.length-1; 

    return result; 
} 
Смежные вопросы