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 정도의 값들이 출력됩니다. 

반응형