균등 분포의 구간 변환과 난수 샘플링

균등 분포 U(a,b)의 PDF·CDF·역변환 표본추출과 경계 처리, 난수 품질 검증 방법을 정리합니다.

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

구간 전체에 같은 밀도를 두는 분포

연속형 균등 분포 (U(a,b))는 (a < b)인 구간 ([a,b])에서 값이 같은 확률 밀도로 나타나는 모델이다. 확률밀도함수는 구간 안에서 (f(x) = 1/(b-a))이고, 구간 밖에서는 0이다.

누적분포함수는 (x \in [a,b])에서 (F(x) = (x-a)/(b-a))로 쓸 수 있다. 기댓값은 (E[X] = (a+b)/2), 분산은 (Var[X] = (b-a)^2/12)이다.

이론상 연속형 분포의 단일점 확률은 0이므로 경계 포함 여부의 차이는 작다. 하지만 구현에서는 부동소수점과 난수 생성기의 반환 범위 때문에 ((a,b)), ([a,b)), ((a,b])를 구분해야 하며, 보통은 ([a,b)) 형태를 사용한다.

파라미터와 누적분포함수가 만드는 변환 기반

(a), (b)는 실수이며 (a < b)를 만족해야 한다. (a=b)는 퇴화 분포이므로 사용할 수 없다. 지지집합은 연속 구간이고, 경계를 포함할지는 구현 세부 사항에 따라 정한다.

균등 분포의 PDF는 상수라 샘플링·적분·조건부 계산이 단순하다. CDF는 단조 증가하므로 역함수가 존재하며, 이 성질은 역변환 표본추출에 바로 연결된다.

일반적인 난수 생성 경로는 PRNG가 (U(0,1))을 만들고, 이를 목표 구간으로 선형 변환하는 방식이다. 같은 균등 난수는 역변환이나 박스-뮬러 같은 합성 변환의 입력으로도 사용된다.

경계값을 구현 계약으로 다루기

PRNG가 ([0,1))을 반환하는지 확인해야 한다. 1.0이 포함되면 스케일링 결과가 (b)를 넘을 수 있다. 0 또는 1을 피해야 하는 계산에서는 재추출(rejection)이나 nextafter 기반의 미세 조정을 적용할 수 있다.

난수 품질은 분포 적합도와 생성열의 성질을 나누어 점검한다. 단변량 적합도에는 Kolmogorov–Smirnov(KS), Chi-square 테스트를 사용할 수 있고, 랜덤성은 자기상관·주기·낮은 차원 균질성으로 확인한다. 재현이 필요한 작업에서는 시드와 PRNG를 명시한다.

균등 난수를 다른 형태로 옮기는 방법

아핀 변환으로 U(a,b) 생성

(U \sim U(0,1))일 때 다음 식으로 목표 구간의 균등 난수를 얻는다.

[ X = a + (b-a)U ]

구현에서는 (U \in [0,1))을 전제로 두고 U=1이 들어오지 않도록 처리한다. (a \geq b) 입력은 예외로 다룬다.

역변환으로 대상 분포 표본화

대상 분포의 CDF를 (F_Y)라고 하면, 균등 난수로부터 다음과 같이 표본을 만들 수 있다.

[ Y = F_Y^{-1}(U) ]

예를 들어 지수분포 ((\lambda))에서는 (Y = -\ln(1-U)/\lambda)이다. 닫힌형 역함수가 없으면 수치역함수가 필요해진다.

정수 범위의 균등 샘플링

정수 구간 ([m,n])에서는 다음 식을 사용할 수 있다.

[ K = m + floor(U \cdot (n-m+1)) ]

여기서 (U \in [0,1))이다. 정수 PRNG 결과에 나머지 연산을 적용할 때는 모듈로 바이어스를 피하기 위해 rejection-sampling을 사용한다.

박스-뮬러와 합성 변환

독립인 (U1,U2 \sim U(0,1))에 대해 표준정규 난수는 다음과 같이 만들 수 있다.

[ Z = sqrt(-2 \ln U1) \cos(2πU2) ]

균등 분포는 이처럼 정규 분포를 비롯한 고차원 샘플링 구성의 기저가 된다.

입력 검증부터 변환 결과까지

NoYesNoYes입력: a, b, seed검증: a < b ?오류 반환: InvalidParameterPRNG 초기화 U ~ U(0,1)경계 점검: U [0,1) ?선형 변환: X = a + (b - a) * U출력: X ~ U(a,b)역변환: Y = F^{-1}(U)출력: Y ~ 대상 분포

Python과 SQL 구현

아래 예시는 Python 3.10+, NumPy 1.26+, SciPy 1.11+를 전제로 한다. 재현성이 필요하면 시드를 고정한다.

연속형 U(a,b) 생성과 적합도 검증

import numpy as np
from scipy.stats import kstest

rng = np.random.default_rng(seed=42)
a, b, n = -2.0, 3.5, 100000

# 방법 1: 라이브러리 함수
x1 = rng.uniform(a, b, size=n)

# 방법 2: 아핀 변환 (U ∈ [0,1))
u = rng.random(n)  # [0,1)
x2 = a + (b - a) * u

# KS 적합도 검증: 이론 CDF 사용
def F_uniform(x, a=a, b=b):
    x = np.asarray(x)
    return np.where(x < a, 0.0,
           np.where(x > b, 1.0, (x - a) / (b - a)))

stat1, p1 = kstest(x1, lambda t: F_uniform(t))
stat2, p2 = kstest(x2, lambda t: F_uniform(t))
print(f"KS stat={stat1:.4f}, p={p1:.4f}")
print(f"KS stat={stat2:.4f}, p={p2:.4f}")

지수분포 λ=2의 역변환

lam = 2.0
u = rng.random(100000)
y = -np.log1p(-u) / lam  # -ln(1-u)

모듈로 바이어스를 피하는 정수 균등 생성

def randint_uniform(rng, m, n):
    # 반환 범위: [m, n], n >= m
    span = n - m + 1
    if span <= 0:
        raise ValueError("n must be >= m")
    # 32비트 정수 소스 사용
    limit = (1 << 32) - ((1 << 32) % span)
    while True:
        r = rng.integers(0, 1 << 32, dtype=np.uint32)
        if r < limit:
            return m + int(r % span)

print(randint_uniform(rng, 10, 17))

SQL에서의 U(a,b) 샘플링

  • PostgreSQL: SELECT a + (b - a) * random(); -- random() ∈ [0,1)
  • BigQuery: SELECT a + (b - a) * RAND(); -- RAND() ∈ [0,1)

생성 방식별 운영 특성

생성 방법 성능 확장성 일관성 안정성 운영 편의
라이브러리 uniform(a,b) 직접 호출 매우 높음: 벡터화·SIMD 최적화 대규모 배치/분산에 적합 PRNG 일관성 보장 경계 처리 내장, 오류 적음 API 간단, 권장 기본 방식
아핀 변환 a+(b−a)U 높음: PRNG 비용 지배 파이프라인 합성 유연 구현에 따라 경계 포함 위험 U 경계 재추출 필요 구현 단순, 이식성 높음
정수 PRNG 스케일링(나머지) 중간: 재시도 발생 가능 다양한 범위 지원 모듈로 바이어스 우려 rejection 적용 시 안전 저수준 환경에서 유용

시뮬레이션과 무작위화에서의 사용

몬테카를로 시뮬레이션은 균등 분포를 입력으로 사용해 불확실성 변수를 재현하고, 역변환으로 목표 분포까지 확장한다. 금융 리스크, 재고 최적화, 네트워크 신뢰성 평가가 적용 대상이다.

트래픽 라우팅과 A/B 테스트 할당에서는 균등 난수로 집단을 배정할 수 있다. 해시와 균등 분포를 결합하면 일관 샘플링(consisten sampling)도 구현할 수 있다.

부트스트랩, 데이터 재표본추출, 피처 셔플링, 랜덤 서브스페이스 선택에서도 정수 균등 난수와 인덱스 기반 샘플링을 함께 사용한다.

정확도와 처리량의 기대 범위

이중정밀과 경계 재추출을 가정하면 균등 변환 기반 타 분포 샘플링에서 바이어스 1e−12 수준 이하 달성이 가능하다. 벡터화 환경에서는 대량 샘플링 처리량이 수백 MB/s 이상이 될 수 있다.

시드와 PRNG를 함께 기록하면 재현성을 확보할 수 있고, 구현 단순화와 디버깅 용이성, 시스템 간 이식성 향상으로도 이어진다.

품질 관리에서 남는 선택지

PRNG 알고리즘(PCG64, Philox 등)과 시드를 명시하고, ([0,1)) 경계를 유지한다. 1.0이 나타나면 재추출하거나 nextafter로 보정하며, KS/Chi-square 테스트는 CI에 포함한다.

역변환에서 수치역함수를 사용하면 정확도와 속도 사이에 비용이 생긴다. 재추출 기반 경계 보정은 최악 조건에서 지연을 늘릴 수 있고, 고정 소수점이나 정수 스케일링은 모듈로 바이어스 제거의 대가로 구현 복잡도를 높인다.

균등 분포는 단순한 PDF와 역함수 특성 덕분에 샘플링의 표준 빌딩 블록으로 쓰인다. 운영 환경에서는 PRNG→U(0,1)→아핀 변환 흐름을 기준으로 경계, 정밀도, 검증 조건을 함께 관리한다.

균등분포확률분포난수생성역변환표본추출몬테카를로