gpt4 book ai didi

java - 均值、中值、方差计算器

转载 作者:行者123 更新时间:2023-11-30 06:12:01 29 4
gpt4 key购买 nike

我创建了一个计算均值、中位数和方差的程序。该程序最多接受 500 个输入。当有 500 个输入(我的数组的最大大小)时,我的所有方法都能完美运行。当输入较少时,只有“平均值”计算器起作用。这是整个程序:

    public class StatsPackage{

static int i = 0, arrayLength;
static double sum = 0, mean, median, sumOfSquares, variance, stdDev;

static double calcMean (int inputs[], int count) throws IOException{
for (i = 0; i < count; i++){
sum += inputs[i];
}
mean = (sum/count);
return mean;
}

static double calcMedian (int inputs[], int count){
Arrays.sort(inputs);
if (count % 2 == 0){
median = ((inputs[(count/2)] + inputs[(count/2)- 1])/2) ;
}
if (count % 2 != 0){
median = inputs[(count-1)/2];
}
return median;
}

static double calcVariance (int inputs[], int count){

sum = 0;
for (i = 0; i < count; i++){
sumOfSquares += (inputs[i]*inputs[i]);
}
for (i = 0; i < count; i++){
sum = sum + inputs[i];
}
variance = ((sumOfSquares/count) - (sum * sum)/(count * count));
return variance;
}

static double calcStdDev (double varianceInput){
stdDev = Math.sqrt(variance);
return stdDev;
}







public static void main(String[] args) throws IOException {

NumberFormat nf = new DecimalFormat("0.##");
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in));
String str = "test";
int inputs[] = new int [500];
int counter = 0;
int i = 0;



while ((str = stdin.readLine()) != null && i < 500) {
inputs[i] = Integer.parseInt(str);
i++;
counter++;
}

System.out.println("Mean: " + nf.format(StatsPackage.calcMean(inputs, counter)));
System.out.println("Median: " + nf.format(StatsPackage.calcMedian(inputs, counter)));
System.out.println("Variance: " + nf.format(StatsPackage.calcVariance(inputs, counter)));
System.out.println("Standard Deviation: " + nf.format(StatsPackage.calcStdDev(variance)));
}
}

这是输入 10 个随机数时的示例输出:

平均值:47.90中位数:0.00方差:0.00标准偏差:0.00

这是输入 500 个数字时的相同代码(我的数组的最大大小):

平均值:47.27中位数:47.00方差:856.71标准偏差:29.27

这些输出是一致的。我输入了 10 个数字,但我只能使用均值方法。我输入了 500 个数字,然后所有数字都正常工作。我正在针对另一个测试程序运行该程序,而不是通过自己在 Eclipse 中输入数字。测试程序是我的导师的,我相信他的程序工作正常。

有人可以帮忙吗?我要撕掉我的头发了。

最佳答案

问题是您正在初始化一个大小为 500 的数组,但随后并未使用所有 500 个索引。这意味着你有一个像这样的数组:

[2,5,3,7,8,2,......,0,0,0,0,0,0,0,0,0,0,0,0]

所以您的代码将计算所有这些 0 的中位数和标准偏差。您应该使用的是 ArrayListArrayList 的大小会随着您添加元素而扩大,而常规列表无法更改大小。

如果您不能使用 ArrayList,那么您必须做更多的工作。

while ((str = stdin.readLine()) != null && i < 500) {
inputs[i] = Integer.parseInt(str);
i++;
counter++;
}

您的 counter 变量已经包含您需要的信息。现在,在将此数组传递给您的 mean/median/stddev 方法之前,您需要减小数组的大小。最简单的方法是使用提供给所有数组的现有方法,称为 CopyOf() :CopyOf() method for Arrays

int[] newArray = Arrays.copyOf(inputs, counter);

现在在方法调用中用新的 newArray 替换旧的 input 数组:

System.out.println("Mean: " + nf.format(StatsPackage.calcMean(newArray, counter)));
System.out.println("Median: " + nf.format(StatsPackage.calcMedian(newArray, counter)));
System.out.println("Variance: " + nf.format(StatsPackage.calcVariance(newArray, counter)));
System.out.println("Standard Deviation: " + nf.format(StatsPackage.calcStdDev(variance)));

关于java - 均值、中值、方差计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33378653/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com