몬테카를로 방법 예제(4/4)

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 모듈에서 제공하는 π 값을 함께 출력하여 비교할 수 있도록 한다.

이처럼 간단한 공 던지기 실험을 통해 복잡한 수학 계산 없이도 π를 근사적으로 계산할 수 있으며, 이것이 바로 몬테카를로 방법의 대표적인 예시다. 무작위 시도와 통계적 계산을 통해 정답에 점점 가까워지는 방식은 강화학습과 같은 분야에서도 매우 유용하게 활용된다.

댓글 쓰기

Please Select Embedded Mode To Show The Comment System.*

다음 이전