몬테카를로와 이산 이벤트 시뮬레이션의 선택 기준

Monte Carlo Simulation과 Discrete Event Simulation의 모델링 방식, 정확도 관리, 성능 특성 및 실무 적용 기준을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

확률을 추정할지, 이벤트 흐름을 재현할지

Monte Carlo Simulation(MCS)과 Discrete Event Simulation(DES)은 복잡한 시스템의 성능과 리스크를 판단할 때 쓰이지만, 모델이 답하려는 질문은 다르다. MCS는 확률 분포에서 표본을 반복 추출해 기대값, 분산, 분포 형태를 추정한다. 해석적 해를 구하기 어렵거나 미분 가능성이 낮은 문제에도 적용할 수 있으며, 수렴 속도는 O(1/√n)이다. 고차원 문제에서도 유리하다.

DES는 이벤트가 발생하는 순간에만 시스템 상태가 불연속적으로 바뀌는 동적 모델이다. 이벤트 큐와 시계의 시간 전진 메커니즘을 이용해 엔티티의 흐름과 자원 경합을 표현한다. 큐잉, 제조, 네트워크 트래픽처럼 프로세스 중심으로 움직이는 시스템에 맞는다.

모델의 신뢰도를 좌우하는 입력과 상태 관리

MCS에서는 먼저 문제 맥락에 맞는 정규, 포아송, 베타 등의 입력 분포를 정한다. 난수 생성기(PRNG)의 품질과 시드 관리가 결과의 기반이 된다. Quasi-Monte Carlo 같은 저분산 기법도 적용할 수 있다.

독립 표본으로 통계량을 계산하되, 대칭표본·공분산 감소·층화 샘플링 같은 분산 축소 기법을 사용하면 필요한 표본 수를 줄일 수 있다. 표본 수가 늘수록 신뢰구간은 좁아지므로, 멈춤 규칙(precision stopping rule)과 고정 시드를 함께 설계해 정확도와 재현성을 관리한다.

DES의 중심에는 이벤트 스케줄링이 있다. 다음 이벤트 시점으로 시간을 점프시키는 next-event time advance 방식과 우선순위 큐를 사용하며, 삽입·추출 비용은 O(log E)다. 서버, 버퍼, 머신의 용량과 선점 규칙, FIFO·Priority 같은 대기열 정책을 정의하고, 이벤트 핸들러에서 상태를 갱신한다.

초기 과도(transient)의 영향을 제거하기 위한 워밍업 기간도 필요하다. 독립 반복(replications)과 배치 평균법으로 신뢰구간을 산출한다.

입력에서 결과까지의 처리 경로

MCS의 입력은 확률 분포의 모수, 상관 구조, 평가 함수 f다. n회 표본을 생성하고 f(x)를 계산한 뒤 평균·분산·신뢰구간을 추정한다. 이 과정에서 분산 축소 기법과 시드 고정을 적용한다. 결과로는 추정값, 95% CI, 민감도와 탄력성 지표를 얻는다. 분포 모수의 유효성은 분산 ≥ 0 조건으로 검증하고, 상관 구조의 양정치성도 확인해야 한다. RNG의 주기나 독립성 검증이 실패하면 경고가 필요하다.

DES는 이벤트 유형, 도착·서비스 분포, 자원과 정책, 시나리오 파라미터를 받아 이벤트 큐를 초기화한다. 이후 다음 이벤트를 꺼내 상태를 전이하고 새 이벤트를 예약하는 흐름을 종료 조건까지 반복한다. 처리량, 지연시간 분포, 자원 활용률, SLA 위반 확률이 주요 출력이다. 음수 시간이나 시간 역전은 차단해야 하며, 데드락·기아를 탐지하고 비정상적인 큐 길이 폭주가 발생하면 안전 중단과 로깅이 필요하다.

항목 Monte Carlo Simulation Discrete Event Simulation
성능 독립 샘플 병렬화에 유리, 벡터화 최적 이벤트 큐 처리 O(E log E), 이벤트 밀도에 민감
확장성 embarrassingly parallel, GPU/QMC 효과적 분산 시뮬레이션 가능하나 이벤트 동기화 비용 존재
일관성 시드 고정 시 재현성 확보, 수렴은 확률적 동일 시드·정책에서 결정적 경로 재현
안정성 난수 품질·분산 관리가 핵심 리스크 이벤트 폭주·락경합 관리가 핵심 리스크
운영 편의 모델링 간단, 유지보수 용이 현실 시스템 반영력 높으나 모델링 비용 큼

문제 성격에 맞춰 기법을 고르는 흐름

DES 파이프라인MCS 파이프라인확률 통합/고차원이벤트·자원 경합아니오아니오문제 정의: 성능/리스크 질문시스템 본질Monte Carlo SimulationDiscrete Event Simulation입력: 분포, 시드, 상관반복 샘플링 n평가함수 f(x) 계산추정치/분산/CI 산출정확도 충족?출력: 추정·민감도입력: 이벤트/자원/정책우선순위 초기화다음 이벤트 Pop상태 전이/새 스케줄종료 조건?출력: 처리량/지연/SLA

Python으로 보는 표본 추정과 대기행렬

전제조건: Python 3.10+, numpy, simpy 설치 필요
설치: pip install numpy simpy

MCS에서 대칭표본으로 π 추정하기

import numpy as np

def estimate_pi(n=1_000_000, seed=42):
    rng = np.random.default_rng(seed)
    # 대칭표본: U와 1-U 동시 사용으로 분산 축소
    m = n // 2
    u = rng.random((m, 2))
    v = 1.0 - u
    pts = np.vstack([u, v])
    inside = (pts**2).sum(axis=1) <= 1.0
    pi_hat = 4.0 * inside.mean()
    # 신뢰구간(정규 근사)
    var = inside.var(ddof=1)
    se = 4.0 * np.sqrt(var / len(inside))
    return pi_hat, (pi_hat - 1.96*se, pi_hat + 1.96*se)

if __name__ == "__main__":
    est, ci = estimate_pi(n=2_000_000, seed=7)
    print(f"pi ~= {est:.6f}, 95% CI = ({ci[0]:.6f}, {ci[1]:.6f})")

SimPy로 M/M/1 대기행렬 모델링하기

import simpy
import random
import statistics

RANDOM_SEED = 42
LAMBDA = 0.9  # 도착률
MU = 1.0      # 서비스율
SIM_TIME = 20_000
WARMUP = 2_000

def customer(env, name, server, service_rate, wait_times):
    arrive = env.now
    with server.request() as req:
        yield req
        wait = env.now - arrive
        if env.now > WARMUP:
            wait_times.append(wait)
        service_time = random.expovariate(service_rate)
        yield env.timeout(service_time)

def source(env, arrival_rate, server, wait_times):
    i = 0
    while True:
        inter = random.expovariate(arrival_rate)
        yield env.timeout(inter)
        i += 1
        env.process(customer(env, f"cust{i}", server, MU, wait_times))

def run():
    random.seed(RANDOM_SEED)
    env = simpy.Environment()
    server = simpy.Resource(env, capacity=1)
    wait_times = []
    env.process(source(env, LAMBDA, server, wait_times))
    env.run(until=SIM_TIME)
    avg_wait = statistics.mean(wait_times)
    rho = LAMBDA / MU
    theo = rho / (MU * (1 - rho))  # M/M/1 평균 대기시간(리틀 공식)
    print(f"Avg wait(sim)={avg_wait:.4f}, Avg wait(theory)={theo:.4f}, n={len(wait_times)}")

if __name__ == "__main__":
    run()

금융부터 인프라까지 이어지는 적용 범위

금융 리스크와 포트폴리오 관리에서는 MCS로 VaR/CVaR, 신용 스프레드 시나리오, 파생상품 그릭스를 근사한다. 이때 분산 축소와 공분산의 일관성이 핵심이다.

제조·물류·콜센터의 용량 계획은 DES가 잘 맞는다. 라인 밸런싱과 병목 자원 식별, SLA 기반 스태핑을 모델링하고 우선순위나 배치 크기 같은 정책을 비교해 비용과 서비스의 균형을 찾는다.

클라우드와 네트워크 성능 분석에서는 두 방식을 함께 쓸 수 있다. DES로 이벤트 기반 트래픽을 모델링한 다음, 부하와 장애율의 불확실성은 MCS로 감싼다. 신뢰구간을 바탕으로 SLO 달성 확률도 추정할 수 있다.

실험 설계와 A/B 테스트의 불확실성 분석에서는 MCS로 표본 수를 계획하고, 베이즈 후행 예측 분포를 시뮬레이션하며, 민감도 분석으로 리스크를 관리한다.

MCS에 분산 축소를 적용해 표본 수를 최적화하면 연산량을 3070% 절감할 수 있다. 정확한 캘리브레이션을 전제로 DES는 처리량과 대기시간의 예측 오차를 510% 내에서 관리할 수 있다. 두 기법은 병목과 리스크를 가시화하고, 정책 변화가 미치는 경로를 추적하는 데도 도움이 된다.

재현성과 모델 비용 사이의 균형

MCS에서는 시드와 스트림을 분리하고, 층화·대칭표본·제어변수를 적용하며, QMC로 분산을 낮추는 방식이 유효하다. 대신 구현 복잡도는 늘어난다. 상관 구조를 정교하게 모델링할수록 계산량도 커진다.

DES에서는 워밍업 제거, 독립 반복과 신뢰구간 보고, 이벤트 로깅과 측정 포인트 설계, 정책 파라미터 스윕 자동화가 운영 품질을 좌우한다. 현실성이 높은 모델을 만들수록 운영 복잡성은 커지고, 분산 시뮬레이션의 확장성은 이벤트 동기화 비용과 맞바꿔야 한다.

확률 통합과 고차원 불확실성이 중심이면 MCS를, 이벤트와 자원 경합이 중심이면 DES를 선택한다. 두 조건이 함께 존재하는 시스템에서는 하이브리드 모델을 검토할 수 있다. 시드 관리, 신뢰구간, 모델 검증 절차는 기법과 관계없이 운영 표준으로 남겨야 한다.

시뮬레이션몬테카를로이산 이벤트알고리즘큐잉 모델