2012-11-23 4 views
4

http://blog.xkcd.com/2010/02/09/math-puzzle/에서 찾은 수학 퍼즐을 시뮬레이션하려고합니다. 그러나 자바 임의의 클래스 이상한 결과를 반환합니다. 아래 코드에서 예상 한 결과입니다. 출력은 첫 번째 줄의 경우 .612 정도이고 두 번째 줄의 경우 .49와 .51 사이입니다. int trials = 10000000; int success = 0; 제가Java Random Class는 진정으로 무작위가 아닙니다.

boolean a = r.nextBoolean(); 
    double check = r.nextDouble(); 

double check = r.nextDouble(); 
boolean a = r.nextBoolean(); 

라인의 전환시

int returnstrue = 0; 

    for (int i = 0; i < trials; i++) { 
     Random r = new Random(); 
     //double one = r.nextDouble()*10000; 
     //double two = r.nextDouble()*10000; 
     double one = 1; 
     double two = Math.PI; 


     double check = r.nextDouble(); 
     boolean a = r.nextBoolean(); 


     if(a) 
     { 
      returnstrue++; 
     } 
     if(a){ 
      if((check>p(one)) && two > one) 
      { 
       success++; 
      } 
      if((check<p(one))&& two<one) 
      { 
       success++; 
      } 
     } 
     else{ 
      if((check>p(two)) && two < one) 
      { 
       success++; 
      } 
      if((check<p(two))&& two>one) 
      { 
       success++; 
      }  
     } 
    } 
    System.out.println(success/(double)trials); 
    System.out.println(returnstrue/(double)trials); 

그러나, 출력은 약 0.476 제 번호 및 0.710 제입니다. 이것은 nextBoolean() 메서드가 이후 구성에서 true의 70 %를 반환 함을 의미합니다. 나는 잘못된 것을하고 있습니까? 아니면 그냥 버그입니까?

+0

@ bmargulies 나는 그것이 속는 사람이되기에 충분히 가깝다고 생각하지 않는다. 그러나 분명히 너무 현지화되어 있습니다. –

+0

너무 많은 '무작위'물체를 가진 사람입니다. – bmargulies

+0

Err, 그 제안 된 속마음은 전혀 속임수가 아닙니다! 문제는 난수 생성기가 루프 내에서 전혀 구성되지 않아서 완전히 다른 문제입니다. 나는 이중 질문을 닫는 것이지만, 단지 상상 속의 속임수가 아닌 실제 일 때만 :-) – paxdiablo

답변

12
는 같이 r외부 for 루프의 인스턴스를 이동

:

Random r = new Random(); 
for (int i = 0; i < trials; i++) { 
    : 
} 

어떤 씨앗의 기반이되기 때문에 당신이 새로운마다 루프 반복하고를 창조하고 지금하고있다 시간 (밀리 초)은 과 동일한 시드로 상당히 많을 것입니다.

거의 확실하게 결과에 왜곡이 있습니다.

그래서, 네, 당신의 코드보다는 자바에서 버그이다. Java 자체가 전 세계 수백만 명의 사용자에 의해 지속적으로 테스트되고 있으며 사용자의 스 니펫이 잘 (잘) 당신에 의해 테스트 되었기 때문에 사람들이 그 질문을하는 시간의 약 99.9999 %의 경향이 있습니다 :-)

관련 문제