論理エラー計算実行中の論理エラー

私は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回の実行です:

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

3回目の走行で私は次のようになるはずです:

Running Average: 295
Average Blast Score: 98.3

私は何が間違っているのか正確にはわかりません。

0
私は平均をとってみたいです。私は間違った用語を使用しているかもしれないと思います。私のアプリが動くのを待って、私は自分のデータポイントの平均をとってみたい。
追加された 著者 Sheehan Alam,
数学的には、平均的な平均を意味しますか?移動平均が必要な場合は、最後の N データポイントを保持し、それらを合計してNで割る必要があります。指数移動平均が必要な場合は、今のところ、減衰係数である k で割ります。
追加された 著者 ObscureRobot,
その後、以前の平均値だけではなく、最後のN値を保持する必要があります。
追加された 著者 ObscureRobot,
@SheehanAlamはavgの代わりにスコアの合計を格納し、スコアの合計をキャプチャの数で割って表示する前にavgを計算します
追加された 著者 Selvin,

3 答え

この行を見てください:

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);
1
追加された

ランニングアベレージを維持するには、実際の平均値を維持せずに、実行中の合計とサンプル数を保持してから、通常の方法で平均を計算します。これは合計/サンプルです。したがって、このセットでは、これらの値を各段階で保持する必要があります。

サンプル:96,99,100

Total : 96, Samples : 1 => AVG = 96/1 = 96

Total : 195, Samples : 2 => AVG = 195/2 = 97.5

Total : 295, Samples : 3 => AVG = 295/3 = 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();

合計を実行する代わりに実行中の平均値を保存することを主張する場合は、サンプルをインクリメントして前の合計値を取得する前に、その平均値を複数サンプルずつ増やしてそこから処理を進める必要があります。

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で割る必要があります。

これに取り組むもう一つの方法は、あなたがすべての得点を受け取り、合計をキャプチャの数で割るまで待つことです。

0
追加された