선형 합동 난수 생성기(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가지 상태를 모두 지납니다
최대 주기 조건 (헐-더먼-그린버거 정리)
첫 12개
| n | X(n) | 최하위 비트 |
|---|---|---|
| 1 | 1,015,568,748 | 0 |
| 2 | 1,586,005,467 | 1 |
| 3 | 2,165,703,038 | 0 |
| 4 | 3,027,450,565 | 1 |
| 5 | 217,083,232 | 0 |
| 6 | 1,587,069,247 | 1 |
| 7 | 3,327,581,586 | 0 |
| 8 | 2,388,811,721 | 1 |
| 9 | 70,837,908 | 0 |
| 10 | 2,745,540,835 | 1 |
| 11 | 1,075,679,462 | 0 |
| 12 | 1,814,098,701 | 1 |
하위 비트의 주기
m이 2의 거듭제곱이고 최대 주기이면 하위 k비트의 주기는 정확히 2ᵏ입니다. 전체 주기가 아무리 길어도 최하위 비트는 0과 1을 번갈아 낼 뿐입니다.
사용 방법
- 1널리 쓰였던 상수(glibc·Numerical Recipes·자바·MINSTD) 가운데 하나를 고르거나 a·c·m을 직접 넣습니다.
- 2씨앗을 바꿔 가며 첫 값들과 주기가 어떻게 달라지는지 봅니다.
- 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일 · 결과는 참고용 추정치입니다.