무작위 번호 생성 원리
작성일 2026-11-09
컴퓨터는 정해진 명령만 수행하는 기계입니다. 그런데 어떻게 '예측할 수 없는' 숫자를 만들 수 있을까요? 이 글에서는 로또번호 생성기 뒤에서 일어나는 일을 쉽게 설명합니다.
의사난수(PRNG)
대부분의 프로그래밍 언어가 제공하는 기본 난수 함수는 의사난수 생성기입니다. 시작값(시드)을 넣으면 복잡한 수식을 반복해 무작위처럼 보이는 숫자를 차례로 내놓습니다. 겉으로는 무작위 같지만, 시드와 알고리즘을 알면 다음 숫자를 계산해 낼 수 있습니다. 자바스크립트의 Math.random()도 이런 방식이며, 게임이나 애니메이션에는 충분하지만 보안 용도로는 권장되지 않습니다.
암호학적 난수(CSPRNG)
암호학적으로 안전한 난수 생성기는 운영체제가 모은 예측 불가능한 정보(하드웨어 잡음, 입력 타이밍 등)를 바탕으로 숫자를 만듭니다. 앞서 나온 숫자를 모두 알아도 다음 숫자를 예측할 수 없도록 설계되어 있습니다. 브라우저에서는 crypto.getRandomValues()로 사용할 수 있고, 이 사이트의 생성기도 이 함수를 씁니다.
모듈로 편향이란
난수 생성기는 보통 0부터 약 43억(2³²−1) 사이의 큰 정수를 줍니다. 이것을 45로 나눈 나머지를 쓰면 0~44 범위의 숫자를 얻을 수 있습니다. 그런데 43억이 45로 딱 나누어떨어지지 않기 때문에, 앞쪽 몇 개의 숫자가 아주 조금 더 자주 나오게 됩니다. 이를 모듈로 편향이라고 합니다.
이 사이트는 45의 배수가 되는 경계를 넘는 값이 나오면 버리고 다시 뽑습니다(거부 샘플링). 그래서 45개 숫자가 정확히 같은 확률로 나옵니다.
중복 없이 6개 고르기
로또 번호는 중복이 없어야 합니다. 생성기는 1~45를 담은 목록을 만든 뒤, 무작위 위치의 숫자를 하나 꺼내고 목록에서 지우는 과정을 6번 반복합니다. 이미 뽑힌 숫자는 목록에 없으니 중복이 생길 수 없습니다. 고정수를 지정하면 그 숫자를 먼저 넣고, 제외수는 처음부터 목록에서 빼 둡니다.
그래서 당첨 확률이 올라가나요?
아니요. 생성기가 아무리 공정해도 추첨기에서 나오는 번호와는 아무 연관이 없습니다. 좋은 생성기가 보장하는 것은 '어느 번호도 편애하지 않는다'는 점뿐입니다. 사람이 직접 고르면 생일(1~31)이나 좋아하는 숫자에 몰리기 쉬운데, 무작위 생성은 그런 쏠림을 없애 줍니다.