ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (파이썬) 몬테카를로 방법으로 원주율 구하기
    Python/파이썬 자료구조 알고리듬 2020. 9. 27. 23:35
    반응형

    몬테카를로 방법(Monte Carlo Method): 
    무작위수와 모의 실험을 통해 문제를 해석, 해결. 

    ----------

    https://www.algeomath.kr/main.do 를 사용했습니다. 

    위 그림에서 원의 반지름을 r 이라고 하면,
    원의 면적은 pi * r ** 2 (파이 * r의 제곱)입니다. 
    정사각형(한 변이 2 * r)
    의 넓이는 (2 * r) ** 2입니다.

    위 '정사각형'에 랜덤으로 점을 찍을 때
    '원의 중심과의 거리가 r 이하인 점'의 확률은
    '(원의 면적) / (정사각형의 면적)' 입니다. 

    이것을 이용해서 원주율(pi)를 구할 수 있습니다. 

    정사각형에 랜덤으로 점을 찍을 때, 내접하는 원의 중심과의 거리가 r 이하인 점의 확률
    = (원의 면적) / (정사각형의 면적)
    = (pi * (r ** 2)) / ((2 * r) ** 2)
    = (pi * (r ** 2)) / (4 * (r ** 2))  # (r ** 2)를 약분하면
    = pi / 4

    양변에 4를 곱해주면..
    (정사각형에 랜덤으로 점을 찍을 때 내접하는 원의 중심과의 거리가 r 이하인 점의 확률) * 4 = pi 가 됩니다. 

    0에서 2r 까지 랜덤하게 점을 찍고
    이 점과 (r, r)의 거리가 r 이하인지 
    체크하여 확률과 원주율을 추정해보겠습니다. 

    is_in 함수를 보면,

    x, y에 0 이상 2r 미만의 랜덤한 값을 설정합니다. 
    즉 정사각형 안입니다. 

    x, y가 원 안에 있는지 체크한 뒤 리턴합니다. 

    위 코드에서는 총 10000번의 사각형 안의 점을 테스트 해서, 
    이중에 몇 번이 원 안의 점인지 확인한 뒤
    그 4를 곱해서 원주율을 구했습니다. 

    from random import random 
    
    
    def is_in(r):
        x = random() * r * 2
        y = random() * r * 2 
        return (x - r) ** 2 + (y - r) ** 2 < r ** 2
    
    
    total = 10000 
    success = 0 
    for _ in range(total): 
        if is_in(1):
            success += 1 
    print(success / total * 4)

    3.1x 정도의 값들이 출력됩니다. 

    반응형
Designed by Tistory.