몬테 카를로 시뮬레이션 (Monte Carlo Simulation)

코딩하는코린이·2024년 7월 23일

몬테 카를로 시뮬레이션(Monte Carlo Simulation)이란

몬테 카를로 시뮬레이션(Monte Carlo Simulation)은 확률과 통계를 기반으로 하는 수치 계산 기법 중 하나입니다. 이 기법은 무작위 샘플링을 사용하여 복잡한 문제나 시스템의 동작을 모델링하고 예측하는 데 사용됩니다. 이름은 몬테 카를로 카지노에서 룰렛을 이용한 도박의 예측이 무작위로 이루어지는 것과 비슷한 방식으로 확률적인 결과를 계산한다는 특징 때문에 붙여진 것입니다.

진행과정

  1. 문제 정의: 먼저 해결하려는 문제를 정의하고, 어떤 확률적인 현상이나 시스템을 모델링하려는지 결정합니다.

  2. 가능한 입력 공간 정의: 문제에 대한 입력 공간을 정의하고, 입력 값들의 범위나 조건을 설정합니다.

  3. 랜덤 샘플링: 입력 공간에서 무작위로 점들을 생성합니다. 이는 문제의 성격에 따라 적절한 확률 분포를 사용하여 무작위 점들을 생성하는 것을 포함할 수 있습니다.

  4. 조건 검사: 각각의 무작위로 생성된 점이 어떤 조건을 만족하는지 검사합니다. 이 조건은 문제에 따라 다르게 정의될 수 있습니다.

  5. 결과 계산: 조건을 만족하는 점들의 개수를 세어서 원하는 결과를 계산합니다. 이를 통해 원하는 값을 추정하거나 근사화합니다.

  6. 통계 분석: 충분한 시도 횟수를 가지고 통계적인 분석을 수행합니다. 예를 들어, 평균, 분산 등을 계산하여 결과의 신뢰도를 평가합니다.

  7. 결과 해석: 계산된 결과를 해석하여 원하는 문제나 시스템에 대한 정보를 얻습니다. 결과의 정확성은 시도 횟수와 무작위 샘플링의 품질에 크게 의존합니다.

  8. 시도 횟수 조정: 결과의 정확성을 높이기 위해 시도 횟수를 조정하거나 무작위 샘플링 방법을 개선할 수 있습니다.

  9. 시각화 (선택사항): 결과를 시각화하여 더 쉽게 이해하거나 보고할 수 있습니다.

이 과정에서 핵심은 충분한 수의 무작위 샘플을 생성하여 통계적인 결과를 얻는 것입니다. 시도 횟수가 적으면 결과의 정확성이 떨어지지만, 시도 횟수를 늘릴수록 결과의 정확성이 향상됩니다. 따라서 문제의 복잡성과 원하는 결과의 정확성을 고려하여 적절한 시도 횟수를 선택하는 것이 중요합니다.

예시

예를 들어, 원주율(π) 값을 몬테 카를로 시뮬레이션을 사용하여 근사화할 수 있습니다. 정사각형 내에 반지름이 1인 원을 그린 뒤, 원 안에 무작위로 점을 찍습니다. 그리고 원 안에 찍힌 점의 비율을 이용하여 원주율 값을 추정할 수 있습니다.

몬테 카를로 시뮬레이션은 물리학, 금융, 공학, 컴퓨터 그래픽스 등 다양한 분야에서 활용됩니다. 예측하기 어려운 복잡한 시스템의 동작이나 확률적 현상을 모델링하거나 분석하는 데 유용한 도구로 사용됩니다. 다만, 충분한 시도 횟수가 필요하며, 결과의 정확성은 시도 횟수에 크게 영향을 받습니다.

구현

import random

def monte_carlo_pi(num_samples):
    inside_circle = 0
    
    for _ in range(num_samples):
        x = random.random()  # 0부터 1 사이의 무작위 x 좌표
        y = random.random()  # 0부터 1 사이의 무작위 y 좌표
        
        # 원의 방정식 x^2 + y^2 <= 1을 만족하는지 검사
        if x**2 + y**2 <= 1:
            inside_circle += 1
            
    estimated_pi = (inside_circle / num_samples) * 4
    return estimated_pi

num_samples = 1000000  # 시도 횟수 설정
estimated_pi = monte_carlo_pi(num_samples)
print(f"Estimated Pi: {estimated_pi}")

이 코드는 0부터 1 사이의 무작위 좌표를 생성하여 원의 방정식을 만족하는지 확인하고, 그 비율을 이용하여 원주율 값을 추정합니다. 시도 횟수인 num_samples를 조절하여 정확성을 높일 수 있습니다. 더 많은 시도 횟수를 사용하면 추정된 원주율 값이 실제 원주율에 더 가까워질 것입니다.

profile
$ 1M이 목표인 20대 개발자

0개의 댓글