我正在为我的AP计算机科学课编写代码,我需要找到一组数字的方差。对于那些不知道如何找到方差的人来说,它是平均值的差值的平方和除以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 :(得分:6)
你最明显的问题是:
average^2
^
运算符不是取幂。它是bitwise XOR。
使用:
Math.pow(average, 2)
或
average * average
另外,
(int)
施放add/data.length-1
错了data
数组是不必要的。添加一些清理,
public static double variance(int[] data) {
int sum = 0;
for (int datum : data) {
sum += datum;
}
double average = (double)sum / data.length;
double devianceSum = 0;
for (int datum : data) {
devianceSum += Math.pow(datum - average, 2);
}
return devianceSum / data.length;
}
答案 1 :(得分:0)
您的代码中有几点您的计算失去精确度,这可能导致您的答案远离您的预期。如前所述,您必须在Java中使用Math.pow
进行取幂。但这需要应用于每个值和平均值的差异,而不仅仅是平均值本身。基本上,您需要括号(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;
}