标准偏差计算器(Java)

标准偏差计算器(Java),java,Java,我现在必须写一个程序来计算十个数字数组的平均值和标准差。mean calculateMean方法似乎工作得很好,但我的calculateStandardDeviation方法在逻辑上有一个缺陷。不知道那到底在哪里。如有任何建议/建议,将不胜感激 public static void main(String[] args) { Scanner input = new Scanner (System.in); System.out.println("Please enter te

我现在必须写一个程序来计算十个数字数组的平均值和标准差。mean calculateMean方法似乎工作得很好,但我的calculateStandardDeviation方法在逻辑上有一个缺陷。不知道那到底在哪里。如有任何建议/建议,将不胜感激

public static void main(String[] args) {

    Scanner input = new Scanner (System.in); 
    System.out.println("Please enter ten numbers: "); 

    double [] set = new double [10]; 

    for (int i = 0; i < 10; i++){
        set[i] = input.nextDouble(); 
    }

    /*for (double j: set){
        System.out.println(j);
    }*/

    System.out.println(calculateMean(set)); 
    System.out.println(calculateStandardDeviation(set));

}

public static double calculateMean(double[] m){
    double sum = 0;
    for (int i = 0; i<m.length; i++){
        sum = sum + m[i];
    }
    double mean = (sum) / (m.length); 
    return mean; 
}

public static double calculateStandardDeviation(double[] sd){

    double sum = 0;
    double newSum = 0; 
    double [] newArray = new double [10]; 

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

    for (int j = 0; j<sd.length; j++){
        newArray[j] = ((sd[j] - mean) * (sd[j] - mean)); 
        newSum = newSum + newArray[j]; 
    }
    double squaredDiffMean = (newSum) / (sd.length); 
    double standardDev = (Math.sqrt(squaredDiffMean)); 

    return standardDev; 
}
publicstaticvoidmain(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“请输入十个数字:”);
双精度[]集=新双精度[10];
对于(int i=0;i<10;i++){
set[i]=input.nextDouble();
}
/*用于(双j:设置){
系统输出println(j);
}*/
System.out.println(calculateMean(set));
系统输出打印LN(计算标准偏差(集合));
}
公共静态双计算表(双[]m){
双和=0;

对于(int i=0;i首先,为什么要将
newArray
的大小设置为一个静态数字?它不应该是静态的。而且,第二个数组是不必要的。但是,即使您确实需要第二个数组,您也应该将
new double[10]
更改为
new double[sd.length]

因此,将以下函数更改为:

public static double calculateStandardDeviation(double[] sd) {

    double sum = 0;
    double newSum = 0; 

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

    for (int j = 0; j < sd.length; j++) {
        // put the calculation right in there
        newSum = newSum + ((sd[j] - mean) * (sd[j] - mean)); 
    }
    double squaredDiffMean = (newSum) / (sd.length); 
    double standardDev = (Math.sqrt(squaredDiffMean)); 

    return standardDev; 
}

sd
的大小可能不是10时,为什么要将
newArray
的大小设置为10?将
newArray
的大小设置为与
sd
数组的大小相匹配。(另外,请注意,您已经创建了一个名为
calculateMean(double[])的方法
当你在
calculateStandardDevation(double[])方法中计算平均值时,你真的应该调用它。
不错,但有两个建议:(1)在计算平均值时检查数组是否为null或空,(2)在我看来,你的标准偏差计算并不是最优的。有一种更简单的方法——减少代码。你所说的“我的计算标准偏差方法中的逻辑存在缺陷”到底是什么意思?结果不正确吗?我用2,4,4,5,5,7,9,9,10的输入运行了你的程序,它分别给出了5.9 2.5475478405713994作为平均值和标准偏差。这似乎是正确的?我说我可以用更少的代码写得更清楚。我没有说“不正确”。请再读一遍。如果我的回答回答了您所有的问题,请。谢谢您的输入。我之所以有一个静态数组,唯一的原因是因为我正在为调用一个10的数组完成这个任务。我也知道for循环在不同的范围内,但为了我自己的清楚,我更喜欢使用不同的变量s、 @user5499487是的,在这个特定的代码中,它可以是10。但是作为一个一般的概念,没有理由限制数组的长度。它应该适用于任何数组大小。但是什么让你认为你的代码中有错误?长度检查也可以帮助-例如if(sd.length==1)返回0@MojoJojo在这种特定情况下,这在技术上可能更有效,但效率很低,并且通常会使程序变得更糟。当长度为
1
时,该算法已经返回
0
,因此它确实不能解决问题。但是,检查长度是否为
0
是正确的。
public static double calculateMean(double[] m){
    if (m.length == 0) return 0; // don't divide by zero!

    // ... the rest of your stuff
}

public static double calculateStandardDeviation(double[] sd){

    if (sd.length == 0) return 0; // don't divide by zero!

    double sum = 0;

    double mean = calculateMean(sd);

    for (int i = 0; i<sd.length; i++){
        sum = sum + (sd[i] - mean) * (sd[i] - mean);
    }
    double squaredDiffMean = (sum) / (sd.length); 
    double standardDev = (Math.sqrt(squaredDiffMean)); 

    return standardDev; 
}