2011-10-28 26 views
0

私はSharedPreferenceの内部で平均を維持しようとしています。私のコードは以下の通りです:論理エラー計算の実行平均

//Get the number of captures 
int numberOfCaptures = prefs.getInt(CaptureActivity.NUMBER_OF_CAPTURES, 0); 
numberOfCaptures++; 

//Calculate the average of all of the captures 
int runningAverage = prefs.getInt(CaptureActivity.AVERAGE_BLAST_SCORE, 0); 
System.out.println("Running Average: " + runningAverage); 

int averageBlastScore = (runningAverage + result.getBlastScore())/numberOfCaptures; 

System.out.println("Blast Score: " + result.getBlastScore()); 
System.out.println("Number of Captures: " + numberOfCaptures); 
System.out.println("Average Blast Score: " + averageBlastScore); 

//Save it, so we can get it again if the user captures another swing 
prefs.edit().putInt(CaptureActivity.AVERAGE_BLAST_SCORE, averageBlastScore).commit(); 
prefs.edit().putInt(CaptureActivity.NUMBER_OF_CAPTURES, numberOfCaptures).commit(); 

私のランニングアベレージが正しく追加されていないようです。

ここでは、3つの実行のためにある:私は私が間違ってやっているかを正確にはわからない

Running Average: 295 
Average Blast Score: 98.3 

:私が持つべき3回目では

10-28 02:53:13.690: I/System.out(1162): Running Average: 0 
10-28 02:53:13.690: I/System.out(1162): Blast Score: 96 
10-28 02:53:13.690: I/System.out(1162): Number of Captures: 1 
10-28 02:53:13.690: I/System.out(1162): Average Blast Score: 96 

10-28 02:53:25.550: I/System.out(1162): Running Average: 96 
10-28 02:53:25.550: I/System.out(1162): Blast Score: 99 
10-28 02:53:25.550: I/System.out(1162): Number of Captures: 2 
10-28 02:53:25.550: I/System.out(1162): Average Blast Score: 97 

10-28 02:54:04.720: I/System.out(1162): Running Average: 97 
10-28 02:54:04.720: I/System.out(1162): Blast Score: 100 
10-28 02:54:04.720: I/System.out(1162): Number of Captures: 3 
10-28 02:54:04.720: I/System.out(1162): Average Blast Score: 65 

。この行で

+0

数学的には、平均して平均を意味しますか?移動平均が必要な場合は、最後の「N」データポイントを保持して、それらを合計してNで割る必要があります。指数移動平均が必要な場合は、現在行っていることを実行できますが、 「k」によって、減衰係数。 – ObscureRobot

+0

私はただ平均したいと思っています。私は間違った用語を使用しているかもしれないと思います。私のアプリが動くのを待って、私は自分のデータポイントの平均をとってみたい。 –

+0

次に、以前の平均値だけでなく最後のN値を保持する必要があります。 – ObscureRobot

答えて

1

ルック:

int averageBlastScore = (runningAverage + result.getBlastScore())/numberOfCaptures; 

あなたは、たとえば、後の100回目の反復が起こるために何を期待していますか?

あなたはスコアを加算し、キャプチャの数で除して平均値を見つける必要があります。

int sumBlastScore = prefs.getInt(CaptureActivity.SUM_BLAST_SCORE, 0) + result.getBlastScore(); 
int averageBlastScore = sumBlastScore/numberOfCaptures; 

System.out.println("Running Average: " + averageBlastScore); 
0

私はあなたのコード内の潜在的な欠陥に気づいた - 次の行が犯人である:

int averageBlastScore = (runningAverage + result.getBlastScore())/numberOfCaptures; 

のは、あなたが3得点持っているシナリオについて考えてみましょう:あなたは、反復の平均操作を行っているので、99,98,90

を、のようになり結果は次のとおりです。

  • は(99 + 0)/ 1 = 99 ----これは
  • (99 + 98)/ 2 = 98.5 ---これは微細で微細で
  • (98.5 + 90)/ 3 = 62.83 ---問題があります

代わりに、2回目の繰り返しの後、毎回2で割る必要があります。

これに取り組むもう1つの方法は、すべてのスコアを受け取ってからキャプチャ数で合計を割るまで待つことです。

0

実行中の平均値を維持するには、実際の平均値を維持せずに、実行中の合計とサンプル数を保持してから、通常の平均値、つまり合計/サンプルを計算します。従って、各段階でこれらの値を維持しなければならないこのセット..

サンプルについて:96、99、100

合計:96サンプル:1 => AVG = 1分の96 = 96

合計:195、サンプル:2 => AVG = 2分の195 = 97.5

合計:295、サンプル:別記3 => AVG = 3分の295 = 98.333

間違った方法は、常にによって分割することです最初のサンプルの後に2つのサンプルを追加し、以前の平均を新しいサンプルに単に追加します。これにより、100のサンプルが99個得られ、0のサンプルが平均50であり、明らかに間違っている。私はあなたの代わりに合計を実行しているの移動平均を保存することを主張した場合、あなたが取得するサンプルをインクリメントする前にサンプルで平均化倍数に持ってしようとしている。この

  int numberOfCaptures = prefs.getInt(CaptureActivity.NUMBER_OF_CAPTURES, 0); 
      numberOfCaptures++; 

      int runningTotal = prefs.getInt(CaptureActivity.RUNNING_TOTAL, 0); 
      runningTotal += result.getBlastScore(); 

      //Calculate the average of all of the captures 
      int averageBlastScore = runningTotal/numberOfCaptures; 

      System.out.println("Blast Score: " + result.getBlastScore()); 
      System.out.println("Number of Captures: " + numberOfCaptures); 
      System.out.println("Average Blast Score: " + averageBlastScore); 

      //Save it, so we can get it again if the user captures another swing 
      prefs.edit().putInt(CaptureActivity.RUNNING_TOTAL, runningTotal).commit(); 
      prefs.edit().putInt(CaptureActivity.NUMBER_OF_CAPTURES, numberOfCaptures).commit(); 

ような何かにあなたのコードを変更します

前の合計を計算し、そこから進んでください。