2013-07-03 3 views
1

이 쉬운 프로그램은 다트 던지기를 사각형으로 시뮬레이션하여 파이의 추정치를 계산합니다.다른 대안 rand.nextDouble() beetwen -1 and 1

Сonditions는 :는 임의의 부동 소수점 숫자를 생성하고 X에 저장
사이 -1과 1이다 있도록 변환. y에 대해서도 반복하십시오. (x, y)가 (0, 0)과 (x, y) 사이의 거리가 < = 1인지 확인하십시오.

이 후 ratio hits/tries은 대략 비율은 circle area/square area = pi/4과 동일합니다. (정사각형은 1/1).

코드 :

public class MonteCarlo { 
    public static void main(String[] args) 
    { 
     System.out.println("Number of tries"); 
     Random generator = new Random(42); 
     Scanner in = new Scanner(System.in); 
     int tries = in.nextInt(); 

     int hits = 0; 
     double x, y; 
     for (int i = 1; i <= tries; i++) 
     { 
      // Generate two random numbers between -1 and 1    
      int plusOrMinus = generator.nextInt(1000); 
      if (plusOrMinus > 500) x = generator.nextDouble();     
      else x = -generator.nextDouble(); 

      plusOrMinus = generator.nextInt(10000); 
      if (plusOrMinus > 5000) y = generator.nextDouble(); 
      else y = -generator.nextDouble();    

      if (Math.sqrt((x * x) + (y * y)) <= 1) // Check whether the point lies in the unit circle 
      { 
       hits++; 
      } 
     } 

     double piEstimate = 4.0 * hits/tries; 
     System.out.println("Estimate for pi: " + piEstimate); 
    } 
} 

테스트 출력 :

Actual output   Expected output 
    ----------------------------------------------- 
    Number of tries   Number of tries 
    1000      1000 
- Estimate for pi: 3.176 Estimate for pi: 3.312 

    Actual output    Expected output 
    ----------------------------------------------------- 
    Number of tries    Number of tries 
    1000000      1000000 
- Estimate for pi: 3.141912 Estimate for pi: 3.143472 

어쩌면이 해결책을 찾기 위해 다른 방법이 존재 하는가? 제안 사항.

+0

테스트 출력에서 ​​프로그램이 pi (3.141592)를 예상보다 잘 수행 한 것 같습니다. 나는 그것을 좋은 것으로 클래스화할 것이다. (나는 우연히 우연히 만날 것이지만 무작위 적으로 랜덤에 대한 다른 시드는 아마도 다른 결과를 줄 것이다.) –

답변

6

-1과 1 사이의 임의의 두 배를 생성하기위한 시도 :

generator.nextDouble() * 2 - 1 

을 BTW : 정적 씨와 함께 무작위로 초기화 계속하는 경우, 당신은 항상 같은 결과를 얻을 수 있습니다. 그렇지 않으면, 결과가 충분하지 않다고 염려되는 경우 몬테카를로는 근사치 일뿐입니다. 결국, 이는 결과 있도록 샘플 용액; -

+0

+1 이것은 가장 깨끗하고 단순하며 가장 좋은 방법이다. – Bohemian

+0

@ winSharp93 몇 가지 사항을 명확히 할 수 있습니까? 방법의 의사 코드 : 단어 읽기 => 단어 반복. 길이() times => 단어의 임의의 위치 i를 선택하지만 마지막 위치는 선택하지 않음 =>'임의의 위치를 ​​선택하십시오.)'=> 위치 j와 i =에서 문자를 바꿉니다. 단어를 인쇄하십시오. 나는 갇혔다. –

1

에서 균일로 균일 (0,1)을 설정하는 일반화 된 용액을 다양 난수 기반으로 (a, b) (어디 < b)는 @ winSharp93가 지적한 것처럼, 당신은 변화를 기대해야하지만 통계적 신뢰 구간으로 오차를 정량화 할 수

(b - a) * generator.nextDouble() + a 

입니다. 당신이

halfWidth = 1.96 * Math.sqrt(piEstimate * (4.0 - piEstimate)/tries); 

을 계산하는 경우 파이의 실제 값은 piEstimate - halfWidth과 시간의 piEstimate + halfWidth 95 % 사이에 감소한다. 숫자 tries이 증가하면 pi가 포함 된 범위가 축소되지만 (선형이 아닌) 범위가 증가한다는 계산을 halfWidth에서 확인할 수 있습니다. 1.96을 Standard Normal 표의 대체 눈금 값으로 바꾸면 신뢰도를 95 %에서 다른 값으로 조정할 수 있습니다.