06. 여섯 번째 수업: 파이썬 몬테카를로! 원주율 $\pi$ 를 총 쏴서 맞추기
우리는 지금까지 주사위나 카드 배열처럼 “분모가 딱 떨어지는” 예쁜 이데아 도박 세계 확률만 계산했습니다. 하지만 만약 어떤 수학 박사가 “여보게, 우주의 대칭 상수 파이($\pi = 3.141592…$) 값을 확률 하나로만 미친 듯이 컴퓨터 코드로 소환할 수 있다면 믿겠나?” 라고 묻는다면요?
이 미친 해킹 역발상 시뮬레이션을 가능케 한 무식함의 승리 알고리즘, 바로 1940년대 천재 해커들이 핵무기 연쇄 반응 폭발 확률을 뚫기 위해 만들어낸 파이썬 도박 무한 폭격 로직 ‘몬테카를로(Monte Carlo) 방법’ 입니다!
1. 다트판 위 무작위 기관총 난사
당신 앞에 가로, 세로 길이가 각각 $2 \times 2$ 미터인 커다란 정사각형 상자 [과녁판] 이 있습니다. 이 사각 과녁 중심에 반지름이 $1$ 짜리인 [둥근 원형 폭탄 스위치] 가 딱 끼워져 들어 있습니다.
정사각형 전체 타겟의 면적을 구해보면: $2 \times 2 = \mathbf{4}$ 가운데 끼워진 원형 폭탄($1$ 반경) 의 면적을 구해보면: $\pi \times r^2 = \pi \times 1^2 = \mathbf{\pi \ (약 \ 3.14…)}$
당신은 눈을 가리고 M60 기관총을 들고, 무작위 드론 난수(Random) 로 쏘는 총알을 이 사각 판때기 위에 무진장 미친 듯이 쏴 갈기기 시작합니다! (단, 총알은 절대 사각 판때기를 밖으로 빗나가진 않는다고 락을 겁니다.) 그럼 수십만 발의 총알 자국 중, 내 총알이 그 재수 없는 “둥근 원형 폭탄” 영역 안에 명중해 박혀 있을 확률 $P$ 는 이론적으로 수학 공식상 어떻게 배정될까요?
$\mathbf{P} = \frac{\text{둥근 폭탄이 차지한 과녁 크기(파이 조각 지분)}}{\text{전체 정사각형 판때기 면적 크기 (모든 우주 분기)}$ $\mathbf{P} = \frac{\pi}{4}$
오 마이 갓! 무작위 총알이 원 안에 제대로 명중할 그 “경험 확률 $P$” 의 결괏값 안에, 우리가 미치도록 구하고 싶었던 신비의 우주 문자 파이($\pi$) 가 인질로 곱해져서 섞여 들어간 것입니다! 해커들은 미친 듯이 소리칩니다. “야!! 그럼 공식을 역방향 리버스로 뒤집어! 어차피 컴퓨터 파이썬 시뮬레이터로 수천만번 난사해서 그 명중 확률(승률) $P$ 를 백분율로 뽑아낼 수 있잖아!! 그 명중률 $P$ 에다 대충 $\mathbf{4}$만 곱해($\times 4$) 주면, 역산으로 실제 파이($\pi$) 값이 툭 떨어져 나오겠네!!!”
2. 몬테카를로 Python 파이($\pi$) 채굴 코드
# [Python Code] 몬테카를로 다트 기관총: 백만 번 난사해서 파이(Pi) 해킹하기
import random
import math
# 기관총 연사 발사 탄창 사이즈 (백만 단위)
total_bullets = 1000000
circle_hits = 0 # 원형 폭탄 안에 스파크가 튄 횟수 기록 카운터
print("==== 몬테카를로 기관총 발사 준비 완료! (목표: 파이 추출) ====")
print(f"우르르 쾅쾅! 총알 {total_bullets:,} 발 무작위 난사중...\n")
# 무작위 좌표 난수 생성 렌더링 For 반복문 루프
for _ in range(total_bullets):
# 가로세로 정사각형 -1.0 부터 1.0 (즉, 가로길이 총 2) 공간 아무데나 랜덤 총알 (x, y) 투척!
x = random.uniform(-1.0, 1.0)
y = random.uniform(-1.0, 1.0)
# 원의 방정식 피타고라스 빔: 원점에 떨어진 이 총알이 중심 좌표(0,0) 로부터 거리가 얼마인가?
distance_squared = x**2 + y**2
# 만약 그 폭격 거리가 반지름 1보다 같거나 작다면?
# -> 앗싸! 사각형 구석 허공이 아니라, 둥근 폭탄 존 정가운데 명중! 카운트 더블랙업!
if distance_squared <= 1.0:
circle_hits += 1
# [실전 확률 통계] 기관총 폭격 결과 (원 명중률 p) 도출
hit_probability_p = circle_hits / total_bullets
# 아까 찾은 해커의 위대한 리버스 공식: ( Pi = 확률 p * 4 )
estimated_pi = hit_probability_p * 4
# 결과 보고 렌더링
print(f"[전적]: 전체 사각타겟 총알 {total_bullets:,}발 중, 원 안에 {circle_hits:,}발 적중!")
print(f"[명중 확률 p]: {hit_probability_p:.5f}")
print("-" * 50)
print(f"★ [몬테카를로 해킹 Pi 예측값]: {estimated_pi:.5f} ★")
print(f"☆ [수학책 정답 Pi 절대값]: {math.pi:.5f} ☆")
print(f"-> 오차 갭(Error Gap): {abs(estimated_pi - math.pi):.5f}")
3. 난수(Random) 엔진이 지배하는 거대 우주의 종말
저 파이썬 코드를 런타임 엔터 치고 콘솔 창을 관전해 보십시오!
==== 몬테카를로 기관총 발사 준비 완료! (목표: 파이 추출) ====
우르르 쾅쾅! 총알 1,000,000 발 무작위 난사중...
[전적]: 전체 사각타겟 총알 1,000,000발 중, 원 안에 785,213발 적중!
[명중 확률 p]: 0.78521
--------------------------------------------------
★ [몬테카를로 해킹 Pi 예측값]: 3.14085 ★
☆ [수학책 정답 Pi 절대값]: 3.14159 ☆
-> 오차 갭(Error Gap): 0.00074
정말 미쳐버리지 않았습니까? 원주율($3.1415…$) 은 극한의 미분 적분 수열을 거쳐가야 계산될까 말까 한 신의 아키텍처 공식입니다.
하지만 우리는 그딴 더러운 미적분 수식 단 한 줄도 없이. 그저 멍청한 컴퓨터의 무작위 난수 생성기(random()) 에게 점이나 찍고 과녁에 꽂았는지 아닌지만 검열하라고 무식한 CPU $100$만 회 노가다 뺑뺑이를 돌려버렸을 뿐인데! 기괴하게도 소수점 $3$자리 숫자까지 완벽하게 소름 돋도록 $\pi$ 의 형상을 복제(Clone) 렌더링해 내어 그 본모습을 투영해 냈습니다.
현대 구글 AI 딥러닝과 자율주행, 복잡한 주식 금융 퀀트 설계 등에서 도저히 인간의 상식적인 확률 연산 곱셈 나눗셈으로는 가지치기 트리($C, P$) 를 그릴 수도, 도출해 낼 수도 없는 복잡한 우주의 버그 상황이 올 때, 개발자들은 컴퓨터의 깡성능 반복문 For 루프에 맡겨 1억 번의 무작위 노가다를 폭사시킵니다.
우주를 구하는 가장 훌륭한 해킹 솔루션은 언제나 가장 멍청하고 무식하게 도끼질로 반복을 내리찍는 무한 반복 Monte Carlo loop 임을 기억하십시오. 두 번째 확률의 챕터는 여기까지입니다. 다음 모듈 벡터의 화살표로 찾아뵙겠습니다. 수고하셨습니다.