선형 합동 생성기
IT 위키
선형 합동 생성기(linear congruential generator, LCG)는 가장 오래되고 단순한 형태의 의사난수 생성기(pseudorandom number generator)로, 다음과 같은 점화식으로 무작위 수열을 생성한다.
정의[편집 | 원본 편집]
LCG는 다음과 같은 점화식을 따른다:
Xn+1 = (aXn + c) mod m
- Xn: 현재 상태 (난수)
- a: 곱셈 계수 (multiplier)
- c: 증가 값 (increment)
- m: 모듈로 값 (modulus)
- X0: 초기값 또는 시드(seed)
이 수열에서 각 Xn은 0 이상 m 미만의 정수이며, 정규화된 난수를 생성하려면 Xn / m 값을 사용한다.
조건[편집 | 원본 편집]
좋은 품질의 난수열을 생성하기 위해 다음 조건을 만족해야 한다:
- c ≠ 0일 경우 (혼합형): m, c는 서로소
- a − 1은 m의 모든 소인수로 나누어떨어져야 함
- a − 1은 4의 배수여야 할 수도 있음 (m이 4의 배수일 때)
- 주기(period)는 최대 m이며, 위 조건을 만족할 때 최대 주기를 가짐
예시[편집 | 원본 편집]
- RANDU (역사적으로 유명한 잘못된 LCG)
- Xn+1 = (65539 × Xn) mod 231
- 나쁜 품질의 난수로 악명이 높음
- glibc 기본 random():
- Xn+1 = (1103515245 × Xn + 12345) mod 231
파이썬 예제[편집 | 원본 편집]
다음은 선형 합동 생성기의 간단한 구현 예시이다:
def lcg(a, c, m, seed, n): numbers = [] x = seed for _ in range(n): x = (a * x + c) % m numbers.append(x / m) # 0 이상 1 미만으로 정규화 return numbers # 예시: glibc 파라미터 사용 a = 1103515245 c = 12345 m = 2**31 seed = 42 n = 10 print(lcg(a, c, m, seed, n))
장점[편집 | 원본 편집]
- 구현이 매우 간단하고 빠름
- 정수 연산만으로 계산 가능
- 많은 언어와 시스템에서 기본으로 사용
단점[편집 | 원본 편집]
- 차원 상의 분포가 나쁨 (특히 고차원 공간에서)
- 매개변수 선택이 까다로움
- 보안에 매우 취약 (암호학적 용도에 부적합)
활용[편집 | 원본 편집]
- 간단한 시뮬레이션, 샘플링, 게임 등에서 사용
- 난수 시퀀스의 기초 모델로 소개됨
- 고급 난수 생성기의 참고 구성 요소로 사용되기도 함
같이 보기[편집 | 원본 편집]
참고 문헌[편집 | 원본 편집]
- Knuth, D. E. (1997). The Art of Computer Programming, Vol. 2: Seminumerical Algorithms. Addison-Wesley
- Park, S. K., & Miller, K. W. (1988). Random number generators: good ones are hard to find. Communications of the ACM, 31(10), 1192–1201