도구스개발

선형 합동 난수 생성기(LCG) 계산기

X(n+1) = (a·X(n) + c) mod m 수열을 만들고 실제 주기와 최대 주기 조건(헐-더먼-그린버거 정리)을 판정합니다. 하위 비트의 주기가 짧아지는 유명한 결함도 숫자로 보여 줍니다.

널리 쓰였던 상수

수치해석 교과서에 실린 32비트 상수. 하위 비트 결함은 그대로 있다

주기 (이론값)

4,294,967,296

X(n+1) = (a·X(n) + c) mod m이 m가지 상태를 모두 지납니다

최대 주기 조건 (헐-더먼-그린버거 정리)

c와 m이 서로소만족
a−1이 m의 모든 소인수의 배수만족소인수 2
m이 4의 배수면 a−1도만족
판정최대 주기 m

첫 12개

nX(n)최하위 비트
11,015,568,7480
21,586,005,4671
32,165,703,0380
43,027,450,5651
5217,083,2320
61,587,069,2471
73,327,581,5860
82,388,811,7211
970,837,9080
102,745,540,8351
111,075,679,4620
121,814,098,7011

하위 비트의 주기

m이 2의 거듭제곱이고 최대 주기이면 하위 k비트의 주기는 정확히 2ᵏ입니다. 전체 주기가 아무리 길어도 최하위 비트는 0과 1을 번갈아 낼 뿐입니다.

하위 1비트주기 2
하위 2비트주기 4
하위 3비트주기 8
LCG는 암호에 쓰면 안 됩니다. 연속한 출력 몇 개만 있으면 a·c·m을 되찾을 수 있고, 하위 비트를 잘라 내도 격자 기법으로 풀립니다. 난수가 예측되면 곤란한 곳에는 운영체제가 주는 암호학적 난수(crypto.getRandomValues 등)를 씁니다.

사용 방법

  1. 1널리 쓰였던 상수(glibc·Numerical Recipes·자바·MINSTD) 가운데 하나를 고르거나 a·c·m을 직접 넣습니다.
  2. 2씨앗을 바꿔 가며 첫 값들과 주기가 어떻게 달라지는지 봅니다.
  3. 3최대 주기 조건 세 가지가 각각 만족되는지, 하위 비트의 주기가 얼마나 짧은지 확인합니다.

자주 묻는 질문

상태가 m가지뿐이므로 아무리 길어도 m입니다. c가 0이 아닐 때 주기가 정확히 m이 되는 조건은 헐-더먼-그린버거 정리로 정해져 있습니다. ① c와 m이 서로소, ② a−1이 m의 모든 소인수로 나누어떨어짐, ③ m이 4의 배수면 a−1도 4의 배수 — 셋을 모두 만족하면 어느 씨앗에서 출발해도 주기가 m입니다.

m이 2의 거듭제곱인 LCG에서는 하위 k비트의 주기가 정확히 2ᵏ이기 때문입니다. 최하위 비트만 보면 주기가 2라서 0과 1이 그저 번갈아 나옵니다. 전체 주기가 40억이어도 이 결함은 그대로입니다. 나머지 연산으로 작은 범위를 만들려면 상위 비트를 쓰거나, 애초에 LCG가 아닌 생성기를 써야 합니다.

절대 안 됩니다. 연속한 출력 몇 개만 관찰하면 a·c·m을 복원할 수 있고, 하위 비트를 잘라 내 감춰도 격자 기법으로 풀립니다. 예측되면 곤란한 값에는 운영체제가 주는 암호학적 난수(브라우저의 crypto.getRandomValues, 리눅스의 /dev/urandom)를 씁니다.

a=65539, c=0, m=2³¹인 이 생성기는 연속한 세 값을 3차원 좌표로 찍으면 겨우 15개 평면 위에만 놓입니다. 1960~70년대에 널리 쓰이면서 그 시기의 여러 시뮬레이션 결과를 신뢰할 수 없게 만들었습니다. 게다가 c가 0이고 씨앗이 홀수면 최하위 비트가 아예 변하지 않습니다.

곱셈형 LCG가 되어 헐-더먼-그린버거 정리가 적용되지 않습니다. 0이 한 번 나오면 영원히 0에 갇히므로 최대 주기가 m이 아니라 m−1이고, m이 소수일 때 주기는 a의 곱셈 위수입니다. MINSTD(a=16807, m=2³¹−1)가 그 예로 주기가 2147483646입니다.

전송되지 않습니다. 계산은 전부 브라우저 안에서 이뤄지고, 입력값은 이 브라우저의 localStorage에만 남습니다.

알아두면 좋은 점

  • a·X가 금세 2⁵³을 넘어 부동소수점으로는 조용히 어긋나므로 계산을 전부 BigInt로 합니다. 자바의 상수(a=25214903917, m=2⁴⁸)에서는 a·X가 7×10²⁴까지 갑니다.
  • 주기는 이론으로 답할 수 있으면 이론값을 씁니다. 최대 주기 조건을 만족하면 m, c가 0이고 m이 소수면 a의 곱셈 위수입니다. 둘 다 아니면 20만 번까지 전수 탐색하고, 그 안에 반복이 없으면 «상한 초과»로 답합니다.
  • 여기 담은 상수들은 전부 널리 쓰였던 «옛것»이며 지금 쓰라는 권장이 아닙니다. 오늘날에는 PCG·xoshiro 계열이나 언어가 기본으로 주는 생성기를 씁니다.
  • C++ 표준이 못박은 값(minstd_rand0을 씨앗 1로 10000번 돌리면 1043618065)과 실제 glibc의 출력을 정답지로 삼아 맞췄습니다(2026-09-01 확인).

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.