Mantık hatası çalışan ortalama hesaplanıyor

Bir SharedPreference içinde çalışan bir ortalama tutmaya çalışıyorum. İşte kodum:

//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();

Benim çalışan ortalama düzgün eklenmiş değil gibi görünüyor.

İşte 3 koşu için:

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

Üçüncü seferde sahip olmalıyım:

Running Average: 295
Average Blast Score: 98.3

Ne yaptığımı tam olarak emin değilim.

0
Sadece ortalamayı almak istiyorum. Sanırım yanlış terminolojiyi kullanıyor olabilirim. Uygulamam çalışmaya devam ederken, veri puanlarımın ortalamasını almak istiyorum.
katma yazar Sheehan Alam, kaynak
Ne, matematiksel olarak, koşu ortalaması mı demek istiyorsun? Hareketli bir ortalama istiyorsanız, son N veri noktalarını saklamanız gerekir, böylece bunları toplayabilir ve bunları N'ye bölebilirsiniz. Üstel hareketli bir ortalama istiyorsanız, ne yaptığınızı yapabilirsiniz. şimdi yapıyor, ama k , indirgeme faktörü ile bölün.
katma yazar ObscureRobot, kaynak
O zaman, sadece önceki ortalama değil, son N değerlerini korumanız gerekecektir.
katma yazar ObscureRobot, kaynak
@SheehanAlam AVG yerine puanların toplamını ve yakalama sayılarıyla skorların toplamını bölerek göstermeden önce ort.
katma yazar Selvin, kaynak

3 cevap

Şu çizgiye bak:

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

100'üncü yinelemeden sonra ne olmasını beklersiniz?

Puanları toplayıp yakalama sayısına bölünerek ortalamayı bulmalısınız:

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

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

Ortalama bir ortalama tutmak için gerçek ortalamayı tutmazsanız, toplamı ve örnek sayısını korursunuz, daha sonra toplamı/örnekleri olan her zamanki yolu hesaplarsınız. Bu nedenle bu set için bu değerleri her aşamada tutmalısınız.

Örnekler: 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

Başka bir yerde belirtilen yanlış bir yol, ilk örneklemden sonra her zaman ikiye böler ve önceki ortalamayı yeni örneğe eklemektir. Bu 100'lük 100 örnek ve ortalama olarak 50'ye sahip 0'lık bir örnek ile sonuçlanacaktı, ki bu açıkça yanlıştır.

Kodunuzu böyle bir şeye değiştiririm

            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();

Toplamı çalıştırmak yerine, çalışma ortalamasını kaydetme konusunda ısrar ederseniz, bir önceki toplamı elde etmek için örnekleri artırmadan ÖNCE, örneklerle ortalamak için birden fazla değere sahip olmanız gerekir ve ardından oradan devam edin.

0
katma

Kodunuzda potansiyel bir kusuru fark ettim - aşağıdaki satır suçludur:

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

3 puanınız olduğu bir senaryoyu düşünelim: 99,98,90

Yinelemeli bir ortalama işlem yaptığınızdan, sonuçlar şöyle görünecektir:

  • (99 + 0)/1 = 99 ---- bu iyi
  • (99 + 98)/2 = 98.5 --- bu iyi
  • (98.5 + 90)/3 = 62.83 --- İşte sorun

Bunun yerine, ikinci yinelemeden sonra her seferinde 2'ye bölünmelisiniz.

Bunun üstesinden gelmenin bir başka yolu, tüm puanları alana kadar beklemek ve toplamı yakalama sayısına bölmek olacaktır.

0
katma