컴퓨터는 어떻게 무작위를 만들까: 의사난수와 씨앗값
컴퓨터는 시킨 대로만 하는 기계입니다. 같은 입력에 같은 출력을 내놓는 것이 존재 이유인데, 어떻게 매번 다른 숫자를 뽑을까요. 답은 조금 허무합니다. 대부분의 랜덤은 진짜 무작위가 아닙니다. 그런데도 실제로 쓰기에 충분한 이유, 그리고 그 성질을 거꾸로 이용해 추첨 결과를 검증하는 방법까지 살펴봅니다.
최종 업데이트: 2026년 7월
1. 의사난수라는 말
프로그램이 만드는 랜덤 숫자를 의사난수(擬似亂數, pseudo-random number)라고 부릅니다. "무작위인 척하는 수"라는 뜻입니다. 실제로는 정해진 계산식으로 앞의 수에서 다음 수를 만들어 냅니다.
이해를 돕는 아주 단순한 예를 들어 봅시다. "직전 수에 7을 곱하고 100으로 나눈 나머지"라는 규칙에서 3부터 시작하면 21, 47, 29, 3 … 이 나옵니다. 규칙은 완전히 결정되어 있지만, 나오는 수열만 보면 어떤 규칙인지 알아채기 어렵습니다. 실제로 쓰이는 생성기는 이보다 훨씬 정교해서, 수열을 아무리 들여다봐도 패턴이 보이지 않고 통계 검사도 통과합니다.
중요한 성질은 이겁니다. 계산식이 정해져 있으니, 시작 값이 같으면 결과 수열도 완전히 같습니다. 이 시작 값을 씨앗값이라고 부릅니다.
2. 씨앗값이 하는 일
씨앗값(seed)은 난수 수열의 출발점입니다. 위 예에서 3에 해당하는 값이죠. 씨앗값 하나가 정해지면 그 뒤에 나올 수천, 수만 개의 수가 전부 정해집니다.
- 씨앗값이 예측 가능하면 결과도 예측 가능합니다. 옛날 프로그램들이 현재 시각을 씨앗값으로 쓰다가, 시각을 맞히면 결과를 맞힐 수 있어 문제가 된 사례가 있습니다.
- 씨앗값이 예측 불가능하면 결과도 예측 불가능합니다. 뒤에 이어지는 계산식이 아무리 단순해도 출발점을 모르면 손댈 수가 없습니다.
씨앗값의 이 성질은 약점이면서 동시에 쓸모입니다. 예측 불가능한 씨앗값으로 뽑되 그 씨앗값을 결과와 함께 공개하면, 다른 사람이 같은 계산을 돌려 같은 결과가 나오는지 직접 확인할 수 있습니다. 검증 가능한 추첨이 이렇게 만들어집니다.
3. 진짜 난수는 어디서 오나
계산이 아니라 물리 현상에서 얻습니다. 이런 것들을 씁니다.
- 회로에서 자연히 생기는 전기 잡음
- 방사성 물질의 붕괴 시점
- 사용자의 마우스 움직임과 키 입력 간격 같은 미세한 흔들림
- 운영체제가 모아 두는 여러 하드웨어 이벤트의 타이밍
이런 값은 원리상 재현이 불가능해서 진짜 난수로 취급합니다. 다만 얻는 속도가 느리고 양이 제한적이라, 보통은 진짜 난수로 씨앗값만 만들고 그 뒤는 의사난수로 빠르게 이어 가는 방식을 씁니다. 이 조합이 현재 표준적인 접근입니다.
4. 암호학적 난수와 일반 난수
브라우저에는 두 가지 난수 창구가 있습니다. 이름이 비슷해도 용도가 다릅니다.
- 일반 난수: 흔히 쓰는
Math.random()입니다. 빠르고 편하지만, 앞의 출력 몇 개를 보면 뒤를 계산해 낼 수 있는 구조입니다. 게임 연출이나 화면 효과에는 충분합니다. - 암호학적 난수:
crypto.getRandomValues()입니다. 운영체제가 모은 물리적 잡음을 바탕으로 하며, 출력을 아무리 많이 봐도 다음 값을 계산할 수 없게 설계되어 있습니다. 비밀번호 생성이나 추첨처럼 예측되면 곤란한 일에 씁니다.
추첨에서 중요한 것은 속도가 아니라 예측 불가능성이므로, 씨앗값은 반드시 암호학적 난수 쪽에서 받아야 합니다.
5. 이 도구는 어떻게 뽑나
랜덤 숫자 생성기는 두 층으로 나눠 씁니다.
- 씨앗값 발급: 버튼을 누르는 순간
crypto.getRandomValues()로 예측 불가능한 씨앗값 하나를 받습니다. - 숫자 계산: 그 씨앗값에서 출발하는 의사난수 생성기로 범위 안의 정수를 만듭니다. 같은 씨앗값이면 언제 어디서 계산해도 결과가 같습니다.
- 씨앗값 공개: 재현 링크 안에 범위·개수와 함께 씨앗값이 담깁니다. 링크를 여는 사람의 브라우저에서 같은 계산이 다시 돌아가고, 같은 숫자가 나옵니다.
즉 예측은 불가능하게, 검증은 가능하게 두 마리를 함께 잡는 구조입니다. 이 성질을 실제 상황에서 어떻게 쓰는지는 추첨 결과를 증명하는 법에서 이어 다룹니다.
6. 흔한 오해
- "같은 숫자가 두 번 나왔으니 고장이다": 중복 허용으로 뽑으면 매번의 뽑기가 독립이라, 1 ~ 10에서 두 번 연속 같은 숫자가 나올 확률은 10분의 1입니다. 열 번에 한 번은 겪는 일입니다.
- "한동안 안 나온 숫자가 나올 차례다": 난수에는 기억이 없습니다. 직전까지 무엇이 나왔든 다음 뽑기의 확률은 그대로입니다.
- "결과가 고르게 흩어져야 무작위다": 오히려 반대입니다. 진짜 무작위는 뭉치기도 합니다. 사람이 손으로 적은 "무작위처럼 보이는" 수열이 지나치게 고른 것으로 판별되는 이유입니다.
- "의사난수는 못 믿는다": 씨앗값만 제대로 받으면 일상적인 추첨·배정에서는 진짜 난수와 구분할 수 없습니다. 문제가 되는 것은 씨앗값이 뻔한 경우입니다.
씨앗값은 암호학적 난수로 받고, 뽑은 뒤에는 링크로 공개합니다. 예측은 못 하고 검증은 되는 방식이에요.
랜덤 숫자 생성기 열기7. 자주 묻는 질문
씨앗값을 공개하면 다음 결과를 예측당하지 않나요?
공개하는 것은 이미 끝난 뽑기의 씨앗값입니다. 다음 뽑기는 그때 새로 발급받은 다른 씨앗값을 쓰므로, 지난 씨앗값을 안다고 해서 다음 결과를 계산할 수 없습니다.
같은 링크를 여러 번 열면 결과가 바뀌나요?
바뀌지 않습니다. 링크 안의 씨앗값과 설정이 같으면 계산 결과도 같습니다. 이것이 재현 링크의 핵심입니다.
주사위나 동전은 진짜 무작위인가요?
물리적으로는 던지는 힘과 각도로 결정되는 결정론적 현상이지만, 초기 조건에 극도로 민감해서 사실상 예측이 불가능합니다. 실용적으로는 무작위로 취급합니다. 다만 실물은 마모나 무게중심 때문에 미세한 편향이 생길 수 있어, 오히려 잘 만든 난수 쪽이 더 고른 경우도 있습니다.