주사위 앱을 굴리거나 로또 번호를 생성할 때, 컴퓨터는 어떻게 "랜덤"한 숫자를 만들까요? 사실 컴퓨터는 정해진 명령을 정확히 수행하는 기계라서, 원리적으로는 스스로 무작위를 만들어낼 수 없습니다. 그런데도 우리가 매일 쓰는 랜덤 뽑기는 잘 작동합니다. 이 역설의 답이 바로 오늘의 주제, 난수 생성의 원리입니다.
의사난수(PRNG): 계산으로 만드는 "랜덤처럼 보이는" 수
컴퓨터가 만드는 난수 대부분은 **의사난수(Pseudo-Random Number)**입니다. 이름 그대로 "가짜(pseudo) 난수" — 실제로는 수학 공식으로 계산된 결과입니다.
원리는 간단합니다:
- **시드(seed)**라는 시작값을 하나 정한다 (보통 현재 시각 등을 사용)
- 시드를 알고리즘(수학 공식)에 넣어 숫자를 하나 뽑는다
- 그 결과를 다시 공식에 넣어 다음 숫자를 뽑는다 — 무한 반복
핵심 성질은 두 가지입니다:
| 성질 | 의미 |
|---|---|
| 결정론적 | 같은 시드로 시작하면 항상 똑같은 숫자열이 나옴 |
| 통계적 무작위 | 결과만 보면 패턴을 찾을 수 없고, 각 숫자가 고르게 분포함 |
"결정론적인데 무작위"라니 모순처럼 들리지만, 그렇지 않습니다. 만드는 과정은 완전히 정해져 있어도, 결과 숫자열이 통계적으로 진짜 난수와 구분되지 않으면 실용적으로는 난수로 쓸 수 있다는 뜻입니다. 잘 설계된 현대 PRNG는 수많은 통계 검정을 통과하며, 게임·시뮬레이션·뽑기 같은 용도에서 진짜 난수와 사실상 구분되지 않습니다.
진짜 난수(TRNG): 자연에서 가져오는 무작위
계산이 아니라 물리 현상 자체의 예측 불가능성에서 난수를 얻는 방법도 있습니다. 이를 하드웨어 난수 또는 **TRNG(True Random Number Generator)**라고 부릅니다.
- 전자 회로의 열잡음
- 방사성 붕괴 시점
- 대기 잡음 (random.org이 사용하는 방식으로 유명)
- 마우스 움직임·키 입력 타이밍 같은 사용자 행동
이런 현상은 되풀이해도 같은 결과가 나오지 않으므로, 시드도 알고리즘도 없는 진짜 무작위입니다.
| 구분 | 의사난수 (PRNG) | 진짜 난수 (TRNG) |
|---|---|---|
| 생성 방법 | 수학 알고리즘 | 물리 현상 측정 |
| 재현 가능성 | 같은 시드면 재현 가능 | 재현 불가능 |
| 속도 | 매우 빠름 | 상대적으로 느림 |
| 필요 장비 | 없음 (소프트웨어만) | 측정 하드웨어 필요 |
| 주 용도 | 게임, 시뮬레이션, 뽑기 | 암호 키 생성, 보안 |
일상 뽑기에는 PRNG로 충분한 이유
"가짜 난수라니, 그럼 뽑기 결과도 못 믿는 것 아닌가?" 하는 걱정은 하지 않으셔도 됩니다. 용도에 따라 필요한 난수의 수준이 다르기 때문입니다.
✅ 일상 용도 (뽑기·게임·시뮬레이션)
여기서 중요한 것은 공평한 분포와 예측 불가능한 체감입니다. 주사위를 굴렸을 때 1~6이 고르게 나오고, 다음 눈을 아무도 못 맞히면 충분합니다. 현대 PRNG는 이 조건을 넉넉히 만족합니다. 시드가 매번 달라지므로(현재 시각 등) 사용자 입장에서 결과를 예측할 방법도 없습니다.
🔒 암호학 용도 (비밀번호·암호 키·보안 토큰)
반면 보안에서는 상대가 작정하고 다음 값을 역산하려는 공격자입니다. 일반 PRNG는 출력을 충분히 관찰하면 내부 상태를 추정해 다음 값을 예측할 수 있는 경우가 있어 위험합니다. 그래서 암호학에서는 **CSPRNG(암호학적으로 안전한 의사난수 생성기)**를 씁니다 — 출력을 아무리 봐도 다음 값을 계산할 수 없도록 설계되고, 하드웨어 난수를 시드로 섞어 예측 가능성을 차단합니다.
정리하면: 뽑기·게임 = PRNG로 충분, 보안 = CSPRNG 필수. 로또 번호 생성기나 주사위 앱이 PRNG를 쓰는 것은 전혀 문제가 아니라, 용도에 맞는 올바른 선택입니다.
흔한 오해: "이제 나올 때가 됐다" — 도박사의 오류
난수 이야기에서 빼놓을 수 없는 것이 **도박사의 오류(Gambler's Fallacy)**입니다.
- "주사위에서 6이 다섯 번 연속 안 나왔으니, 이번엔 6이 나올 때가 됐어"
- "이 로또 번호는 최근에 안 나왔으니 곧 나올 차례야"
모두 착각입니다. 공정한 난수는 기억이 없습니다. 주사위를 던질 때마다 6이 나올 확률은 언제나 1/6이고, 직전에 무슨 눈이 나왔는지는 아무 영향을 주지 않습니다. "다섯 번 연속 6이 안 나옴"은 이미 지나간 사건일 뿐, 다음 던지기의 확률을 바꾸지 못합니다.
이 오류가 강력한 이유는 우리의 직관이 "결과는 골고루 나와야 한다"고 기대하기 때문입니다. 실제로 무작위 수열에는 연속과 쏠림이 자연스럽게 나타납니다. 같은 숫자가 연달아 나오거나, 특정 번호가 한동안 안 나오는 것이 오히려 정상입니다. 뽑기 앱에서 같은 사람이 두 번 연속 걸렸다고 해서 조작이 아닌 것과 같은 원리입니다.
직접 체감해 보기
원리를 알았으니 직접 굴려 보는 게 가장 빠릅니다. 주사위를 여러 번 굴리면서 "연속으로 같은 눈이 나오는 일"이 생각보다 자주 일어나는지 관찰해 보세요. 도박사의 오류가 왜 착각인지 몸으로 느낄 수 있습니다.
로또 번호도 마찬가지입니다. "안 나온 번호"를 고르려 애쓰기보다, 모든 조합의 확률이 동일하다는 사실을 받아들이고 편하게 무작위 생성에 맡기는 것이 합리적입니다.
결론
컴퓨터의 랜덤은 대부분 계산된 의사난수지만, 그것이 "믿을 수 없다"는 뜻은 아닙니다. 잘 만든 PRNG는 일상의 모든 뽑기·게임 용도에서 진짜 난수와 구분되지 않으며, 보안이 필요한 곳에는 CSPRNG라는 더 강한 도구가 따로 있습니다. 그리고 어떤 난수를 쓰든 기억하세요 — 난수에는 기억이 없습니다. "나올 때가 됐다"는 느낌이 들 때가, 바로 확률을 다시 떠올릴 때입니다.