2016-12-08 1 views
1

Also habe ich diese Methode, die zufällig ein Objekt aus einer Liste von 2 Objekten auswählt. Ich möchte einen Junit-Test schreiben (@Test), der basierend auf einem Konfidenzniveau behauptet, dass es irgendwie eine 50% ige Chance für jedes der 2 Objekte gibt, die ausgewählt werden sollen.Konfidenzintervalle in Java, Testen der zufälligen Auswahl eines Elements in einer Liste von Objekten

Das Stück des im Test befindlichen Code:

public MySepecialObj pickTheValue(List<MySepecialObj> objs, Random shufflingFactor) { 

    // this could probably be done in a more efficient way 
    // but my point is asserting on the 50% chance of the 
    // two objects inside the input list 
    Collections.shuffle(objs, shufflingFactor); 
    return objs.get(0); 
} 

Im Test würde I 2 mocks bieten mag (firstMySepecialObjMock und secondMySepecialObjMock) als Eingang Objekte vom Typ MySepecialObj und new Random() als Eingangsparameter Shuffling behauptet dann, dass Die firstMySepecialObjMock ist zufällig die Wahl 50% der Zeiten und secondMySepecialObjMock ist zufällig die Wahl in den anderen 50% der Zeiten.

Etwas wie:

@Test 
public void myTestShouldCheckTheConfidenceInterval() { 

    // using Mockito here 
    MySepecialObj firstMySepecialObjMock = mock(MySepecialObj.class); 
    MySepecialObj secondMySepecialObjMock = mock(MySepecialObj.class); 

    // using some helpers from Guava to build the input list 
    List<MySepecialObj> theListOfTwoElements = Lists.newArrayList(firstMySepecialObjMock, secondMySepecialObjMock); 

    // call the method (multiple times? how many?) like: 
    MySepecialObj chosenValue = pickTheValue(theListOfTwoElements, new Random()); 

    // assert somehow on all the choices using a confidence level 
    // verifying that firstMySepecialObjMock was picked ~50% of the times 
    // and secondMySepecialObjMock was picked the other ~50% of the times 
} 

ich über die Statistik Theorie hier nicht sicher bin, vielleicht sollte ich eine andere Instanz von Random mit unterschiedlichen Parametern an den Konstruktor zur Verfügung stellen?

Ich würde auch gerne einen Test haben, wo ich das Konfidenzniveau als Parameter einstellen könnte (ich denke, normalerweise ist 95%, aber es könnte ein anderer Wert sein?).

  • Was könnte eine reine Java-Lösung/Testkonfiguration mit einem Konfidenzniveau-Parameter sein?
  • Was könnte eine äquivalente Lösung/Setup des Tests mit einigen Hilfs-Bibliothek wie die Apache Commons sein?

Antwort

1
  1. Zunächst einmal ist dies die normale Art und Weise zufällige Elemente aus einer Liste in Java zu holen. (nextInt(objs.size() erzeugt zufällige Ganzzahlen zwischen 0 und objs.size()).

    public MySepecialObj pickTheValue(List<MySepecialObj> objs, Random random) { 
        int i = random.nextInt(objs.size()); 
        return objs.get(i); 
    } 
    
  2. können Sie in Wikipedia lesen, wie oft Sie ein Experiment mit zwei möglichen Ergebnissen für einen bestimmten Konfidenzniveau durchführen sollen. Z.B. Bei einem Konfidenzniveau von 95% erhalten Sie ein Konfidenzintervall von 1,9599. Sie müssen auch einen maximalen Fehler angeben, z. B. 0,01. Dann wird die Anzahl der Male das Experiment durchzuführen:

    double confidenceInterval = 1.9599; 
    double maxError = 0.01; 
    int numberOfPicks = (int) (Math.pow(confidenceInterval, 2)/(4*Math.pow(maxError, 2))); 
    

    , die in numberOfPicks = 9603 führt. So oft sollten Sie pickTheValue anrufen.

  3. Dies wäre, wie ich empfehlen, die Experiment mehrmals durchführen (Beachten Sie, dass random wiederverwendet wird):

    Random random = new Random(); 
    double timesFirstWasPicked = 0; 
    double timesSecondWasPicked = 0; 
    for (int i = 0; i < numberOfPicks; ++i) { 
        MySepecialObj chosenValue = pickTheValue(theListOfTwoElements, random); 
        if (chosenValue == firstMySepecialObjMock) { 
         ++timesFirstWasPicked; 
        } else { 
         ++timesSecondWasPicked; 
        } 
    } 
    double probabilityFirst = timesFirstWasPicked/numberOfPicks; 
    double probabilitySecond = timesSecondWasPicked/numberOfPicks; 
    

    Dann behaupten, dass probabilityFirst, probabilitySecond sind nicht weiter als maxError 0,5

  4. Ich fand eine BinomialTest Klasse in Apache-Commons-Mathe, aber ich sehe nicht, wie es in Ihrem Fall helfen kann. Es kann das Konfidenzniveau aus der Anzahl der Experimente berechnen. Sie wollen das Gegenteil davon.

Verwandte Themen