-
(파이썬) 몬테카를로 방법으로 원주율 구하기Python/파이썬 자료구조 알고리듬 2020. 9. 27. 23:35반응형
몬테카를로 방법(Monte Carlo Method):
무작위수와 모의 실험을 통해 문제를 해석, 해결.----------
위 그림에서 원의 반지름을 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 정도의 값들이 출력됩니다.
반응형