컴퓨터는 어떻게 무작위를 만들까: 의사난수와 씨앗값

컴퓨터는 시킨 대로만 하는 기계입니다. 같은 입력에 같은 출력을 내놓는 것이 존재 이유인데, 어떻게 매번 다른 숫자를 뽑을까요. 답은 조금 허무합니다. 대부분의 랜덤은 진짜 무작위가 아닙니다. 그런데도 실제로 쓰기에 충분한 이유, 그리고 그 성질을 거꾸로 이용해 추첨 결과를 검증하는 방법까지 살펴봅니다.

최종 업데이트: 2026년 7월

1. 의사난수라는 말

프로그램이 만드는 랜덤 숫자를 의사난수(擬似亂數, pseudo-random number)라고 부릅니다. "무작위인 척하는 수"라는 뜻입니다. 실제로는 정해진 계산식으로 앞의 수에서 다음 수를 만들어 냅니다.

이해를 돕는 아주 단순한 예를 들어 봅시다. "직전 수에 7을 곱하고 100으로 나눈 나머지"라는 규칙에서 3부터 시작하면 21, 47, 29, 3 … 이 나옵니다. 규칙은 완전히 결정되어 있지만, 나오는 수열만 보면 어떤 규칙인지 알아채기 어렵습니다. 실제로 쓰이는 생성기는 이보다 훨씬 정교해서, 수열을 아무리 들여다봐도 패턴이 보이지 않고 통계 검사도 통과합니다.

중요한 성질은 이겁니다. 계산식이 정해져 있으니, 시작 값이 같으면 결과 수열도 완전히 같습니다. 이 시작 값을 씨앗값이라고 부릅니다.

2. 씨앗값이 하는 일

씨앗값(seed)은 난수 수열의 출발점입니다. 위 예에서 3에 해당하는 값이죠. 씨앗값 하나가 정해지면 그 뒤에 나올 수천, 수만 개의 수가 전부 정해집니다.

씨앗값의 이 성질은 약점이면서 동시에 쓸모입니다. 예측 불가능한 씨앗값으로 뽑되 그 씨앗값을 결과와 함께 공개하면, 다른 사람이 같은 계산을 돌려 같은 결과가 나오는지 직접 확인할 수 있습니다. 검증 가능한 추첨이 이렇게 만들어집니다.

3. 진짜 난수는 어디서 오나

계산이 아니라 물리 현상에서 얻습니다. 이런 것들을 씁니다.

이런 값은 원리상 재현이 불가능해서 진짜 난수로 취급합니다. 다만 얻는 속도가 느리고 양이 제한적이라, 보통은 진짜 난수로 씨앗값만 만들고 그 뒤는 의사난수로 빠르게 이어 가는 방식을 씁니다. 이 조합이 현재 표준적인 접근입니다.

4. 암호학적 난수와 일반 난수

브라우저에는 두 가지 난수 창구가 있습니다. 이름이 비슷해도 용도가 다릅니다.

추첨에서 중요한 것은 속도가 아니라 예측 불가능성이므로, 씨앗값은 반드시 암호학적 난수 쪽에서 받아야 합니다.

5. 이 도구는 어떻게 뽑나

랜덤 숫자 생성기는 두 층으로 나눠 씁니다.

  1. 씨앗값 발급: 버튼을 누르는 순간 crypto.getRandomValues()로 예측 불가능한 씨앗값 하나를 받습니다.
  2. 숫자 계산: 그 씨앗값에서 출발하는 의사난수 생성기로 범위 안의 정수를 만듭니다. 같은 씨앗값이면 언제 어디서 계산해도 결과가 같습니다.
  3. 씨앗값 공개: 재현 링크 안에 범위·개수와 함께 씨앗값이 담깁니다. 링크를 여는 사람의 브라우저에서 같은 계산이 다시 돌아가고, 같은 숫자가 나옵니다.

예측은 불가능하게, 검증은 가능하게 두 마리를 함께 잡는 구조입니다. 이 성질을 실제 상황에서 어떻게 쓰는지는 추첨 결과를 증명하는 법에서 이어 다룹니다.

6. 흔한 오해

씨앗값은 암호학적 난수로 받고, 뽑은 뒤에는 링크로 공개합니다. 예측은 못 하고 검증은 되는 방식이에요.

랜덤 숫자 생성기 열기

7. 자주 묻는 질문

씨앗값을 공개하면 다음 결과를 예측당하지 않나요?

공개하는 것은 이미 끝난 뽑기의 씨앗값입니다. 다음 뽑기는 그때 새로 발급받은 다른 씨앗값을 쓰므로, 지난 씨앗값을 안다고 해서 다음 결과를 계산할 수 없습니다.

같은 링크를 여러 번 열면 결과가 바뀌나요?

바뀌지 않습니다. 링크 안의 씨앗값과 설정이 같으면 계산 결과도 같습니다. 이것이 재현 링크의 핵심입니다.

주사위나 동전은 진짜 무작위인가요?

물리적으로는 던지는 힘과 각도로 결정되는 결정론적 현상이지만, 초기 조건에 극도로 민감해서 사실상 예측이 불가능합니다. 실용적으로는 무작위로 취급합니다. 다만 실물은 마모나 무게중심 때문에 미세한 편향이 생길 수 있어, 오히려 잘 만든 난수 쪽이 더 고른 경우도 있습니다.