【问题标题】:Not outputting the right Mean or Variance未输出正确的均值或方差
【发布时间】:2016-06-23 12:37:51
【问题描述】:

我的任务是取数字,每行一个,然后计算平均值、中位数、方差和标准差。当输入 null 或输入 500 个数字时,while 循环停止。我计算了中位数和标准差,但由于某种原因,我的方差和均值输出是错误的。另外,如果您可以帮助我设置 while 循环的参数,以便在输入 500 个数字时也结束。

我的意见:

0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 4.0 , 4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 7.0, 7.0, 7.0, 7.0, 7.0, 8.0, 8.0, 8.0, 8.0 , 8.0, 8.0, 8.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0, 12.2. ,12.0,12.0,12.0,13.0,12.0,13.0,13.0,13.0,13.0,13.0,13.0,13.0,13.0,13.0,14.0,14.0,14.0,14.0,14.0,14.0,15.0,15.0,15.0,15.0,15.0 ,15.0,15.0,16.0,16.0,16.0,17.0,17.0,17.0,17.0,18.0,18.0,18.0,18.0,18.0,18.0,18.0,19.0,19.0,19.0,19.0,19.0,19.0,20.0,20.0,19.0,20.0,20.0,120.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0 ,20.0,21.0,21.0,21.0,21.0,21.0,21.0,21.0,21.0,22.0,22.0,22.0,22.0,22.0,22.0,22.0,22.0,22.0,22.0,23.0,23.0,23.0,23.0,23.0,23.0,23.0,23.0,24.0,23.0,23.0,24.0,24.0,23.0,24.0,24.0,24.0,24.0 ,24.0,25.0,25.0,25.0,25.0,25.0,25.0,26.0,26.0,26.0,26.0,26.0,26.0,26.0,26.0,27.0,27.0,27.0,27.0,27.0,27.0,28.0,28.0,28.0,29.0,28.0,28.0,29.0,29.0,28.0,29.0,29.0,29.0,29.0,29.0,29.0,29.0 , 29.0, 30.0, 30.0,30.0,30.0,30.0,30.0,31.0,31.0,31.0,31.0,33.0,33.0,33.0,33.0,33.0,34.0,34.0,34.0,34.0,34.0,34.0,34.0,34.0,34.0,34.0,35.0,35.0,35.0,35.0,35.0,35.0,35.0, 35.0,36.0,36.0,36.0,37.0,37.0,37.0,38.0,38.0,38.0,38.0,39.0,39.0,39.0,39.0,39.0,39.0,39.0,39.0,39.0,39.0,40.0,40.0,49.0,40.0,40.0,40.0,41.0,41.0,41.0,41.0, 41.0,42.0,42.0,42.0,42.0,43.0,43.0,43.0,43.0,44.0,44.0,44.0,45.0,45.0,45.0,45.0,45.0,46.0,46.0,46.0,46.0,46.0,46.0,47.0,47.0, 47.0,47.0,47.0,49.0,49.0,49.0,49.0,49.0,50.0,50.0,51.0,51.0,51.0,51.0,51.0,52.0,52.0,52.0,52.0,52.0,53.0,52.0,52.0,53.0,53.0,53.0,53.0,54.0, 54.0,54.0,55.0,55.0,55.0,56.0,56.0,56.0,56.0,56.0,56.0,57.0,57.0,58.0,58.0,58.0,58.0,58.0,59.0,58.0,58.0,59.0,59.0,59.0,59.0,59.0,59.0,59.0,59.0,59.0,60.0,60.0, 60.0,60.0,60.0,60.0,60.0,61.0,61.0,61.0,61.0,61.0,61.0,61.0,61.0,62.0,61.0,62.0,62.0,63.0,63.0,62.0,63.0,63.0,63.0,64.0,64.0,63.0,64.0,64.0,64.0,64.0,64.0,64.0,64.0,64.0, 64.0, 64.0, 64.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 66.0, 66.0, 66.0, 66.0, 66.0, 66.0, 67.0, 67.0 ,67.0,68.0,68.0,68.0,68.0,68.0,68.0,68.0,68.0,68.0,69.0,69.0,69.0,69.0,69.0,69.0,69.0,69.0,69.0,70.0,70.0,79.0,70.0,70.0,70.0,70.0,70.0,70.0,70.0,70.0,70.0,70.0,71.0,71.0 ,71.0,71.0,71.0,71.0,71.0,72.0,72.0,72.0,72.0,72.0,72.0,72.0,72.0,72.0,73.0,73.0,73.0,73.0,73.0,73.0,73.0,74.0,74.0,75.0,74.0,74.0,75.0,75.0,75.0,75.0,75.0,75.0,75.0,76.0 ,76.0,76.0,76.0,76.0,77.0,77.0,77.0,77.0,77.0,77.0,77.0,78.0,78.0,78.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,79.0,80.0,80,79.0,80.0,80.0 ,80.0,80.0,81.0,81.0,81.0,82.0,82.0,82.0,82.0,82.0,82.0,83.0,83.0,83.0,83.0,83.0,84.0,83.0,84.0,84.0,84.0,84.0,84.0,85.0,84.0,84.0,85.0,85.0,85.0,85.0,85.0,85.0,85.0,85.0 ,85.0,85.0,86.0,86.0,87.0,87.0,87.0,87.0,87.0,87.0,88.0,88.0,88.0,88.0,88.0,89.0,89.0,88.0,89.0,89.0,89.0,89.0,89.0,89.0,89.0,90.0,90.0,90.0,91.0,91.0,91.0 ,91.0,92.0,92.0,92.0,93.0,93.0,93.0,93.0,94.0,94.0,94.0,94.0,94.0,95.0,95.0,94.0,95.0,95.0,95.0,96.0,96.0,96.0,96.0,96.0,96.0,96.0,96.0,97.0,97.0,97.0,97.0,97.0,97.0,98.0 , 98.0, 98.0, 98.0, 99.0, 99.0, 99.0, 100.0, 100.0

我的输出:

平均值:47.21
中位数:47.00
方差:857.34 标准差:29.28

预期输出:

平均值:47.27
方差:856.71
标准差:29.27

BufferedReader stdin =
                    new BufferedReader (new InputStreamReader (System.in));
            NumberFormat nf = new DecimalFormat ("0.00");
            nf.setMinimumFractionDigits (2);//Sets Min digits
            nf.setMaximumFractionDigits (2);//Sets Max digits
            String inputValue;
            double sum = 0;
            double counter = 0;
            double median = 0;
            double variance = 0;
            double varianceCounter = 0;






            List<String> input = new ArrayList<String>();
            List<Double> numbers = new ArrayList<Double>();


            while((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
                input.add(inputValue);
                numbers.add (Double.parseDouble(inputValue));        
            }
                 for(int i = 0; i < input.size(); i++){
                    sum += (numbers.get(i));
                    counter++;  
                }

            Collections.sort(numbers);
            for(int i = 0; i < numbers.size(); i++){
            if  (numbers.size() % 2 == 0){
                median = (numbers.get(numbers.size()/2-1) + numbers.get(numbers.size()/2))/2;
            }
            else {
                median = (numbers.get((numbers.size())/2));
            }
            }
            for(int i = 0; i < input.size(); i++){
                    variance += numbers.get(i) * numbers.get(i);
                    varianceCounter++;
            }






            System.out.println ("Mean: " + (nf.format(sum/counter)));
            System.out.println ("Median: " + (nf.format(median)));
            System.out.println ("Variance: " + (nf.format((variance/varianceCounter)-(sum*sum)/(varianceCounter*varianceCounter))));    
    System.out.println ("Standard Deviation: " + (nf.format(Math.sqrt((variance/varianceCounter)-(sum*sum)/(varianceCounter*varianceCounter)))));           
    }
    }

【问题讨论】:

    标签: java arrays for-loop arraylist while-loop


    【解决方案1】:

    这就是在您的 IDE(如果不是您的调试器)中使用格式化程序有帮助的地方。

    你遇到的问题是你对每个输入的所有值求和。

    while ((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
        input.add(inputValue);
        numbers.add (Double.parseDouble(inputValue));        
        // sum all the values on every input i.e. 1 1 2 1 2 3 1 2 3 4
        for (int i = 0; i < input.size(); i++){
            sum += (numbers.get(i));
            counter++;  
        }
    

    您应该做的是读取所有输入,然后对所有值求和。

    while ((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
        input.add(inputValue);
        numbers.add (Double.parseDouble(inputValue));        
    }
    // sum all the values AFTER all the input. i.e. 1 2 3 4
    for (int i = 0; i < input.size(); i++){
        sum += (numbers.get(i));
        counter++;  
    }
    

    顺便说一句,计数器应该始终是input.size()

    【讨论】:

    • 那么在 for 循环之前关闭 while 循环?
    • @swaguire 正确。处理中的每个阶段一个循环。这里不需要嵌套循环。顺便说一句,除了中位数,您可以在不存储值的情况下计算均值和方差。
    • 非常感谢!你也知道我的while循环应该是什么参数,让它在输入500个数字时也结束吗?
    • @swaguire 方差是 差异 与平均值的平方和,而不是平方和(除非平均值为 0)
    • 仅供将来参考,如果不存储它们,我将如何以不同的方式进行操作?
    猜你喜欢
    • 2021-12-19
    • 2021-01-16
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2020-03-02
    • 2017-06-29
    相关资源
    最近更新 更多