에듀테크 프로젝트 대시보드
몬테카를로 방법
정확한 공식을 몰라도 괜찮다. 무작위 점을 아주 많이 뿌리고, 조건을 만족한 비율을 세면 넓이·확률·적분값을 근사할 수 있다. 컴퓨터가 잘하는 "일단 엄청 많이 해보기"로 수학 문제를 푸는 방법.
한 변이 2인 정사각형(-1 ≤ x, y ≤ 1) 안에 반지름 1짜리 원이 꼭 들어맞는다. 이 안에 점을 완전히 무작위로 던지면,
어떤 점이 원 안에 떨어질 확률은 정확히 두 도형의 넓이 비와 같다.
그러므로 점 N개 중 원 안에 들어간 개수가 M이라면:
점이 원 안인지 판정하는 건 제곱근도 필요 없다 — x² + y² ≤ 1 이면 원 안이다.
「점 뿌리기」를 누르면 매 프레임 수백 개의 점이 정사각형에 떨어진다. 원 안이면 파란색, 밖이면 회색. 아래 추정값이 실제 π(3.14159…)에 어떻게 다가가는지 지켜보자.
몬테카를로의 오차는 시행 횟수 N에 대해 1/√N 로 줄어든다. 이건 좋은 소식이자 나쁜 소식이다.
| N | 기대 오차(대략) | 의미 |
|---|---|---|
| 100 | ± 0.16 | 소수 첫째 자리도 흔들림 |
| 10,000 | ± 0.016 | N을 100배 → 오차 10배 감소 |
| 1,000,000 | ± 0.0016 | 겨우 소수 셋째 자리 |
1/√N 이기 때문이다.
import random def estimate_pi(n): inside = 0 for _ in range(n): x = random.uniform(-1, 1) y = random.uniform(-1, 1) if x*x + y*y <= 1: # 원 안? (sqrt 불필요) inside += 1 return 4 * inside / n print(estimate_pi(1_000_000)) # 3.14103... 처럼 매번 조금씩 다름
"원 안인가?"를 "곡선 아래인가?"로 바꾸면 정적분을 근사할 수 있다. 예를 들어 0 ≤ x ≤ 1에서 ∫ f(x) dx 는
[0,1]×[0, max f] 상자에 점을 뿌려 곡선 아래 비율 × 상자 넓이로 구한다.
1777년, 뷔퐁 백작은 간격 d로 그은 평행선 위에 길이 ℓ(≤ d)의 바늘을 마구 떨어뜨리면,
바늘이 선을 가로지를 확률이 2ℓ / (πd) 임을 보였다. 던진 횟수 대비 가로지른 횟수로 π를 추정할 수 있다 —
난수 발생기 없이 손으로 바늘만 던져도 되는 최초의 몬테카를로 실험이다.
옵션 가격, 포트폴리오 손실 분포(VaR)를 수만 개의 무작위 시나리오로 시뮬레이션.
입자 수송 계산, 그리고 영화·게임의 패스 트레이싱 렌더링(빛의 경로를 무작위 표본으로).
알파고의 몬테카를로 트리 탐색(MCTS): 무작위 대국을 많이 돌려 유망한 수를 고른다. (→ 미니맥스와 비교)
부트스트랩 재표본, MCMC(마르코프 연쇄 몬테카를로)로 복잡한 확률분포에서 표본 추출.