2013-03-05 52 views
0

我的標準偏差是失敗的。當我輸入: 2 4 4 4 5 5 7 9 n代碼中的Java編程標準偏差錯誤

我沒有得到2.這是我的代碼。我相信一切正常,所以我不明白爲什麼我總是收到1.8284791953425266而不是2:

import java.util.Scanner; 

public class stocks { 

    public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 
    double currentNum = 0; 
    double numtotal = 0; 
    int count = 0; 
    double mean = 0; 
    double square = 0, squaretotal = 0, sd = 0; 

    System.out.println("Enter a series of double value numbers, "); 
    System.out.println("Enter anything other than a number to quit: "); 

    while (in.hasNextDouble()) 
    { 

     currentNum = in.nextDouble(); 
     numtotal = numtotal + currentNum; 

     count++; 
     mean = (double) numtotal/count; 
     square = Math.pow(currentNum - mean, 2.0); 
     squaretotal = squaretotal + square; 
     sd = Math.pow(squaretotal/count, 1/2.0); 
    } 

    System.out.println("The mean is: " +mean); 
    System.out.println("The standard deviation is: " +sd); 

    } 


} 
+1

[該組的標準偏差爲2.13,實際](http://www.wolframalpha.com/input/?i=Standard+deviation%3A+ %7B2 + 4 + 4 + 4 + 5 + 5 + 7 + 9%7D) – Makoto 2013-03-05 05:03:05

+0

我使用這個定義:http://en.wikipedia.org/wiki/Standard_deviation所以我除以n不是(n -1)在平方根符號 – LorrJ 2013-03-05 05:05:47

回答

2

你需要計算出的平均值爲所有的號碼,你制定出標準偏差之前。 現在你的意思是所有數字的平均值,直到當前的數字。你的問題在這裏

square = Math.pow(currentNum - mean, 2.0); 

在這一點上,平均值是我們所看到的數字的平均值。這是因爲numtotal是我們所看到的數字的總和。爲了解決這個問題,你可以先把所有的數字放入數組列表中。然後找出所有數字的均值,之後可以計算出方差和標準偏差。

+0

如果需要,這幾乎可以作爲遞歸樹系統來完成:avg(avg(a,b),avg(c,d))=(a + b + c + d)/4' – 2013-03-05 05:10:09

+0

另外,如果我能夠如此直言不諱地表明他在哪裏搞砸了,那會很棒。通過計算平均值來計算平均數,可以帶來獨特的進步。假設我們聲明:'d = avg(a,b)',按照這個標準,將'c'加入到平均數中,我們必須這樣做:'e =(d * 2 + c)/ 3'。這可以表示爲公式:'avg = avg(nums [])/ nums.length + next'。如果你做了一個系列擴展,你會意識到你最終除以2,然後乘以2等等。常見的誤解。 – 2013-03-05 05:15:08

+0

@Legend我認爲這不是問題。問題在於每個數字和平均數之間的平方差是用我們迄今爲止看到的數字的均值來計算的,而不是最終的均值。平均值本身在循環結束時很好。 – 2013-03-05 14:06:53

0

count如果您打算除以它,則需要雙倍。

mean = (double) numtotal/count; 

- >

mean = (double) numtotal/(double) count; 
+0

前段時間我寫了一些關於基本數據類型介紹的文章,我認爲它可能適用於這裏:雙重類型就像病毒,所有其他類型在執行操作時成爲雙精度。另外,從double轉換爲任何其他類型需要'(double)'強制轉換。 – 2013-03-05 15:55:12