2016-12-08 19 views
1

그래서이 메소드는 2 개의 객체 목록에서 임의로 객체를 선택합니다. JUNIT 테스트 (@Test)를 쓰고 싶습니다. 신뢰 수준에 근거하여 어쨌든 두 개체 각각을 선택할 확률이 50 %입니다.자바에서 신뢰 구간을 사용하여 객체 목록에서 요소의 임의 선택을 테스트하십시오.

테스트중인 코드의 단편 : I는 입력 파라미터를 셔플 링 타입 MySepecialObjnew Random()의 입력 대상으로서 2 모의 객체 (firstMySepecialObjMocksecondMySepecialObjMock)를 제공하고자

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

시험에있어서, 그 주장 firstMySepecialObjMock이 시간의 50 %를 차지하고 나머지는 50 %의 시간에 secondMySepecialObjMock이 선택됩니다. 같은

뭔가 : 여기 통계 이론에 대해 확실하지 오전

@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 
} 

, 그래서 어쩌면 내가 생성자에 다른 매개 변수와 함께 Random의 다른 인스턴스를 제공해야합니까?

신뢰 수준을 매개 변수로 설정할 수있는 테스트를하고 싶습니다 (일반적으로 95 %라고 추측 할 수 있지만 다른 값이 될 수 있습니다).

  • 신뢰 수준 매개 변수와 관련된 테스트의 순수한 Java 솔루션/설정이 될 수 있습니까?
  • Apache Commons와 같은 일부 도우미 라이브러리를 포함하는 테스트의 동등한 솔루션/설정이 될 수 있습니까? 이 모든

답변

1
  1. 먼저 자바의 목록에서 무작위 요소를 선택하는 일반적인 방법입니다. (nextInt(objs.size()은 0과 objs.size() 사이의 임의의 정수를 생성합니다).

    public MySepecialObj pickTheValue(List<MySepecialObj> objs, Random random) { 
        int i = random.nextInt(objs.size()); 
        return objs.get(i); 
    } 
    
  2. 당신은 당신이 주어진 신뢰 수준이 개 가능한 결과와 실험을 수행해야하는 횟수에 대한 in Wikipedia를 읽을 수 있습니다. 예 : 95 %의 신뢰 수준에 대해 1.9599의 신뢰 구간을 얻습니다. 또한 최대 오류 0.01을 제공해야합니다. numberOfPicks = 9603 결과

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

    : 다음 횟수 실험을 수행 할 수 있습니다. 전화 번호는 pickTheValue입니다.

    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; 
    

    그런 다음 probabilityFirstprobabilitySecond 0.5

  3. 에서 maxError보다 더 없다고 주장 :
  4. 난 당신이 (random 재사용되고 있음을 참고) 실험을 여러 번 수행하는 것이 좋습니다 방법이 될 것입니다

    apache-commons-math에서 BinomialTest 클래스를 찾았지만 귀하의 경우에 도움이되는 것을 보지 못했습니다. 그것은 실험의 수로부터 신뢰 수준을 계산할 수 있습니다. 당신은 그 반대가되고 싶습니다.