import random
import math
# (1) 총 던질 공의 개수
num_points = 10000
inside_circle = 0
for _ in range(num_points):
# (2) -1에서 1 사이의 무작위 x, y 좌표 생성
x = random.uniform(-1, 1)
y = random.uniform(-1, 1)
# (3) 원 안에 들어갔는지 확인 (x² + y² <= 1이면 원 안)
if x2 + y2 <= 1:
inside_circle += 1
# (4) 원의 면적 추정: 정사각형 면적(4) × 비율
estimated_pi = 4 * inside_circle / num_points
print(f"추정한 원의 면적 (≈ π): {estimated_pi}")
print(f"실제 π 값: {math.pi}")
추정한 원의 면적 (≈ π): 3.1328
실제 π 값: 3.141592653589793
간단한 예제를 통해 알고리즘이 동작방식을 이해해보자.
(1) 총 던질 공의 개수 설정
먼저 우리는 무작위로 던질 공의 총 개수를 설정한다. 여기에서는 10,000개의 공을 던지기로 하였으며, 이는 실험을 통해 원의 면적을 추정할 때 사용하는 표본의 크기를 의미한다. 또한 원 안에 들어간 공의 개수를 세기 위한 변수를 0으로 초기화한다.
(2) 무작위 좌표 생성
그 다음 반복문을 이용하여 공을 한 개씩 던진다. 이때 공을 던지는 과정은 -1부터 1까지의 범위 내에서 무작위로 x좌표와 y좌표를 생성하는 방식으로 이루어진다. 이 범위는 가로 2, 세로 2인 정사각형 영역을 의미하며, 중심이 (0, 0)이고 반지름이 1인 원이 이 정사각형 안에 정확히 들어가게 된다.
(3) 공이 원 안에 들어갔는지 판단
생성된 좌표가 원 안에 위치하는지를 확인하기 위해 피타고라스의 정리를 활용한다. 즉, x제곱과 y제곱을 더한 값이 1보다 작거나 같으면 그 점은 원 안에 있는 것으로 간주한다. 이 조건을 만족하는 경우, 공이 원 안에 들어간 것으로 보고, 원 안에 들어간 공의 개수를 하나 증가시킨다.
(4) 원의 면적 추정
모든 공을 던진 후에는, 원 안에 들어간 공의 개수와 전체 공의 개수를 비교하여 원이 차지하는 비율을 계산한다. 이 비율에 정사각형의 전체 면적인 4를 곱하면 원의 면적을 추정할 수 있다. 이렇게 추정한 면적은 수학적으로 알려진 원주율 π와 매우 가까운 값을 보이게 된다. 마지막으로 추정된 π 값과 실제 math 모듈에서 제공하는 π 값을 함께 출력하여 비교할 수 있도록 한다.
이처럼 간단한 공 던지기 실험을 통해 복잡한 수학 계산 없이도 π를 근사적으로 계산할 수 있으며, 이것이 바로 몬테카를로 방법의 대표적인 예시다. 무작위 시도와 통계적 계산을 통해 정답에 점점 가까워지는 방식은 강화학습과 같은 분야에서도 매우 유용하게 활용된다.