【问题标题】:Standard Deviation标准差
【发布时间】:2017-01-15 07:12:21
【问题描述】:

您好,我创建了一个代码来计算一组数字的标准差,下面是我的代码:

public class standardDev {
 public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] arr = new int[n];
    double sum = 0.0;
    for(int i = 0; i < n; i++) {
        arr[i] = in.nextInt();
    }
    Arrays.sort(arr);
    double median = n % 2 != 0 ? arr[n/2] : (arr[n/2] + arr[(n/2)-1])/2;
    for(int i = 0; i < n; i++) {
        sum += Math.pow(arr[i] - median,2);
    }
    System.out.printf("%.1f", Math.sqrt(sum/n));
 }
}

但是当输入是这样的时候:

10

64630 11735 14216 99233 14470 4978 73429 38120 51135 67060

我得到的结果与预期的答案不同。 我的输出:30475.6 预期输出:30466.9

但如果我尝试下面的输入,我会得到正确的答案:

5

10 40 30 50 20

我的输出:14.1

预期输出:14.1

【问题讨论】:

  • 标准差是基于平均值,而不是中位数。
  • 这也不是找到中位数的正确方法。
  • 它与您的第二个输入一起工作的原因是偶然地,平均值( (10+40+30+50+20) / 5 )恰好是 30,这也是中位数。
  • 大家好,谢谢大家的评论,我的错误应该是平均值而不是中位数。编辑:好的,我必须编辑代码。
  • 解决了我试过的问题!

标签: java math statistics standard-deviation


【解决方案1】:

重写代码以实际计算基于平均值的标准差:

import java.util.*;
import java.lang.*;
import java.io.*;

class standardDev
{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n];
        double sum = 0.0;
        double mean = 0;
        for(int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
            mean += arr[i];
        }
        mean /= n;
        for(int i = 0; i < n; i++) {
            sum += Math.pow(arr[i] - mean,2);
        }
        System.out.printf("%.1f", Math.sqrt(sum/n));
   }
}

示例:http://ideone.com/qY1wkw

【讨论】:

  • 编辑它并且它工作!我用的是中位数而不是平均值。
  • 你为什么要Arrays.sort(arr);?求均值和标准差是 O(n) 操作。排序是 O(n·log(n)) 并且不需要任何计算。
猜你喜欢
  • 2014-02-27
  • 2011-11-12
  • 1970-01-01
  • 2020-05-24
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多