본문으로 건너뛰기
AZ Tools

온라인 랜덤 추첨은 공정할까? 무작위의 원리

주사위, 이름 뽑기, 추첨 돌림판, 로또 번호 생성기는 모두 공정한 추첨을 약속하고, 대부분의 사람은 결과가 무작위처럼 보이는지로 그 약속을 판단합니다. 하지만 이는 좋은 시험이 아닙니다. 진짜 무작위는 조작된 것처럼 느껴지는 연속, 반복, 뭉침을 만들어 내고, 반대로 흔한 프로그래밍 지름길 몇 가지는 겉보기엔 괜찮지만 측정 가능한 편향을 만듭니다. 이 글은 무작위가 어디서 오는지, 그것을 기울이는 실수, 둘을 구분하는 방법을 설명합니다.

무작위는 어디서 오는가

브라우저에는 두 가지 출처가 있습니다. Math.random()은 빠른 의사난수 생성기로, 통계 검정은 통과하지만 내부 상태를 알아낸 사람이라면 원리상 예측할 수 있는 수열을 공식으로 만들어 냅니다. 게임, 시뮬레이션, 수업 시연에는 충분합니다. crypto.getRandomValues()는 운영체제의 암호학적으로 안전한 생성기에서 값을 가져오며, 이 생성기는 예측할 수 없는 하드웨어 이벤트로 시드를 받고, 지난 출력이 다음 출력에 대해 아무것도 알려 주지 않도록 설계되어 있습니다.

경품 추첨, 사람들이 신경 쓰는 자리나 업무 배정, 비밀번호처럼 결과로 누군가 이득을 보는 일에는 암호학적 출처가 맞습니다. 두 출처 모두 인터넷 연결이 필요 없고, 여러 번 누르거나 버튼을 누르기 전에 오래 기다린다고 더 무작위해지지도 않습니다.

나머지 연산 편향: 가장 흔한 숨은 결함

난수 생성기는 바이트라면 0~255처럼 정해진 범위의 수를 내놓고, 도구는 이를 주사위의 1~6처럼 필요한 범위로 줄여야 합니다. 6으로 나눈 나머지를 쓰는 당연해 보이는 방법은 미묘하게 불공정합니다. 256은 6의 배수가 아니므로 나머지 0~3은 각각 43번, 4와 5는 42번만 나옵니다. 이 면들이 약 2.4% 더 자주 나오는 셈입니다.

해결책은 거부 표본 추출입니다. 불균형을 만드는 범위 맨 위의 몇몇 값을 버리고 다시 뽑는 방식입니다. 비용은 거의 없고 모든 결과가 정확히 같은 확률이 됩니다. 이름 목록에서 당첨자를 고르는 것도 범위만 다를 뿐 같은 문제라서 똑같이 주의해야 합니다.

섞기와 사다리도 편향될 수 있다

목록 섞기는 쉬워 보이지만, 직관적인 방법 여러 가지가 균일하지 않습니다. 무작위 비교로 정렬하거나, 각 항목을 전체 목록의 아무 위치와 바꾸면 어떤 순서가 다른 순서보다 더 잘 나옵니다. 각 항목을 자기 위치나 그 뒤의 항목하고만 바꾸는 표준 피셔-예이츠 섞기는 모든 순서에 정확히 같은 기회를 줍니다.

사다리타기도 같은 문제를 눈에 보이는 형태로 가지고 있습니다. 가로줄 몇 개를 무작위로 놓은 사다리는 대부분의 사람을 출발한 자리 근처에 머물게 해서, 무작위처럼 보여도 결과는 공정과 거리가 멉니다. 공정한 방식은 먼저 편향 없는 섞기로 배정을 정한 뒤 그 결과가 나오는 사다리를 그립니다.

연속과 반복은 정상이다

사람들은 무작위 결과가 실제보다 더 자주 번갈아 나올 것이라고 기대합니다. 공정한 동전을 100번 던지면 같은 면이 6번 이상 연속으로 나오는 구간이 한 번이라도 있을 확률은 약 81%이고, 7번 이상 연속도 절반이 넘는 경우에 나옵니다. 같은 이름이 두 번 연속 뽑히거나 주사위가 6을 세 번 연속 내는 것만으로는 편향의 증거가 되지 않습니다.

우연의 일치도 직관보다 흔합니다. 23명만 모여도 생일이 같은 두 사람이 있을 확률은 약 51%입니다. 각 추첨은 이전 추첨과 독립이므로, 한동안 나오지 않은 번호가 나올 "차례"인 것은 아닙니다. 그렇게 믿는 것을 도박사의 오류라고 합니다. 진짜 편향은 많은 횟수의 추첨으로만 드러나며, 그때도 차이가 우연으로 생길 수 있는 정도보다 커야 합니다.

로또 번호로 할 수 있는 것과 없는 것

45개 중 6개를 고르는 조합은 8,145,060가지, 49개 중 6개는 13,983,816가지입니다. 모든 조합의 확률은 정확히 같으므로, 생성기도 생일도 패턴도 "요즘 안 나온" 번호도 당첨 확률을 높이지 못합니다. 선택이 바꿀 수 있는 유일한 것은 당첨금을 나눌 사람의 수입니다. 인기 있는 패턴과 32 미만의 날짜 숫자는 많은 사람이 고릅니다.

그러니 무작위 생성기는 더 자주 당첨되는 데가 아니라 흔히 고르는 조합을 피하는 데 쓸모가 있습니다. 실제 경품 추첨이라면 암호학적으로 안전한 출처를 쓰고, 추첨 방법을 기록하고, 가능하다면 참가자가 과정을 보거나 다시 해 볼 수 있게 하세요.

  • 걸린 것이 있는 추첨에는 crypto.getRandomValues()를 쓴다
  • 도구가 거부 표본 추출로 나머지 연산 편향을 피하는지 확인한다
  • 무작위 정렬이 아니라 피셔-예이츠 방식으로 섞는다
  • 진짜 무작위에서는 연속과 반복이 나온다고 예상한다
  • 편향은 몇 번의 놀라운 결과가 아니라 많은 추첨으로 판단한다
  • 어떤 생성기나 패턴도 로또 확률을 바꾸지 못한다

관련 도구