Орташа іске қосылғандығын есептейтін логикалық қате

Мен 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

Үшінші кезеңде мен:

Running Average: 295
Average Blast Score: 98.3

Мен дұрыс емес нәрсе істегеніме сенімдімін.

0
Мен жай ғана орташа деңгейге жетуді қалаймын. Мен дұрыс емес терминологияны қолданып жүрген шығармын. Менің қолданба жалғасып жатқанда, менің деректер нүктелерімнің орташа мәнін алуға тырысамын.
қосылды автор Sheehan Alam, көзі
Қандай, математикалық тұрғыда, сіз орташа жүгіргенде ме? Егер сіз қозғалыстағы орташа мәнді қаласаңыз, сіз соңғы N деректер нүктелерін сақтап қалуыңыз керек, осылайша оларды қосуға және бөлуге болады. Егер экспоненталық жылжымалы орташа мәнді қаласаңыз, қазір істеп жатыр, бірақ k бойынша ыдырайтын фактор.
қосылды автор ObscureRobot, көзі
Сонда сіз тек соңғы орташа мәнді емес, соңғы N мәндерін сақтауыңыз керек.
қосылды автор ObscureRobot, көзі
@SheahanAlam дүкенінен орталардың орнына ұпайлар жинағы, ал ұпайлар сомасын басып алу санымен бөлу арқылы көрсетіледі
қосылды автор 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

Басқа жерде айтылған дұрыс емес жол бірінші үлгіден кейін әрқашан екіге бөлініп, жай ғана алдыңғы үлгідегі жаңа үлгіге қосылады. Бұл 100-ден 100 үлгілерге, ал 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-ге бөлу керек.

Мұны шешудің тағы бір жолы барлық ұпайларды алғанша күте тұрып, қорытындыларды басып шығару санына бөлу.

0
қосылды