100만 번 섞어 봤습니다: 흔한 「무작위 정렬」은 왜 치우칠까

「무작위로 섞는다」는 말은 쉽지만, 어떻게 섞느냐에 따라 결과의 공평함이 크게 달라집니다. 이 글은 추측이 아니라 실제로 100만 번을 돌려 본 기록입니다. 같은 네 장의 카드를 인터넷에서 가장 흔히 보이는 방법과 뽑고가 쓰는 방법으로 각각 섞어서, 24가지 순서가 얼마나 고르게 나오는지 쟀습니다.
실험은 이렇게 했습니다
네 개의 항목 0, 1, 2, 3을 섞으면 나올 수 있는 순서는 4×3×2×1 = 24가지입니다. 완벽하게 공평하다면 100만 번 중 각 순서가 약 4.167%씩, 즉 4만 1,667번 안팎으로 나와야 합니다.
비교한 방법은 두 가지입니다. 첫째는 자바스크립트에서 가장 흔히 소개되는 「무작위 정렬」로, 정렬 함수에 Math.random() − 0.5를 넣는 방식입니다. 둘째는 뽑고가 실제로 쓰는 shuffle 함수로, 피셔–예이츠 알고리즘과 편향 없는 정수 추출을 합친 것입니다. 실험은 Node.js v23.10.0(V8 엔진), 2026년 10월 13일 실행했고, 두 방법 모두 같은 횟수(100만 번)로 돌렸습니다.
24가지 순서는 얼마나 고르게 나왔나
뽑고 방식에서는 가장 적게 나온 순서가 4.121%, 가장 많이 나온 순서가 4.198%였습니다. 이상적인 값 4.167%에서 거의 벗어나지 않았습니다.
흔한 무작위 정렬은 전혀 달랐습니다. 가장 드문 순서는 1.545%, 가장 흔한 순서는 18.757%였어요. 가장 흔한 순서가 가장 드문 순서보다 약 12배 더 자주 나온 셈입니다. 겉으로는 잘 섞이는 것처럼 보이지만 실제로는 어떤 순서는 거의 나오지 않고 어떤 순서는 다섯 번에 한 번 가까이 나오는 도구였습니다.
| 방법 | 가장 드문 순서 | 가장 흔한 순서 | 카이제곱 | 5% 기준 |
|---|---|---|---|---|
| 뽑고 shuffle | 4.121% | 4.198% | 24.7 | 35.172 |
| 무작위 정렬 | 1.545% | 18.757% | 1,156,774 | 35.172 |
가장 알기 쉬운 증거: 첫 자리에 누가 오는가
섞은 뒤 맨 앞에 오는 항목만 따로 보면 차이가 더 분명합니다. 공평하다면 네 항목이 각각 25%여야 하는데, 무작위 정렬에서는 원래 맨 앞에 있던 0번이 35.93%, 맨 뒤에 있던 3번이 31.23%를 가져갔고 1번은 14.10%에 그쳤습니다.
이 결과가 실생활에서 뜻하는 바는 이렇습니다. 이름 목록의 맨 위에 적은 사람이 「첫 번째 발표자」가 될 확률이 다른 사람보다 훨씬 높은 도구가 있다는 것입니다. 입력한 순서가 결과에 영향을 주지 않는다는 약속은, 어떻게 섞느냐에 달려 있습니다.
| 항목 | 무작위 정렬 | 뽑고 shuffle |
|---|---|---|
| 0번 | 35.93% | 25.01% |
| 1번 | 14.10% | 25.03% |
| 2번 | 18.74% | 24.93% |
| 3번 | 31.23% | 25.03% |
왜 이런 일이 생길까
정렬 알고리즘은 「두 값을 비교하면 늘 같은 답이 나온다」는 가정 위에서 만들어졌습니다. 그런데 비교할 때마다 무작위로 답을 바꾸면 그 가정이 깨지고, 알고리즘이 어떤 비교를 하고 어떤 비교를 건너뛰는지에 따라 결과가 한쪽으로 기웁니다. 이 숫자들은 위에 적은 환경에서 잰 것이고, 다른 엔진이나 버전에서는 달라질 수 있습니다. 중요한 것은 정렬이라는 도구가 섞기를 위해 만들어지지 않았다는 점입니다.
피셔–예이츠 방식은 처음부터 섞기를 위해 설계되었습니다. 마지막 칸부터 시작해서 그 칸과 그 앞의 칸 가운데 무작위로 하나를 골라 서로 바꾸는 일을 반복하면, 가능한 모든 순서가 정확히 같은 확률로 나온다는 것이 수학적으로 증명되어 있습니다.
숫자 하나를 고를 때의 작은 편향
섞기보다 단순한 상황인 「0부터 9까지 숫자 하나 고르기」에서도 비슷한 문제가 있습니다. 컴퓨터가 주는 0~255 사이의 값을 10으로 나눈 나머지를 쓰는 방법은 간단하지만, 256이 10으로 나누어떨어지지 않아서 0~5가 6~9보다 조금 더 자주 나옵니다.
500만 번 실험에서 이 방법은 0~5가 약 10.15%, 6~9가 약 9.77%씩 나왔습니다. 차이는 0.4%p 정도로 작아서 몇 번 해 보는 정도로는 눈치챌 수 없지만, 횟수가 많아지면 통계적으로 분명한 치우침입니다. 뽑고는 범위를 넘어가는 값이 나오면 버리고 다시 뽑는 방식을 써서, 같은 실험에서 모든 숫자가 9.97%~10.02% 사이에 들어왔습니다.
| 숫자 | 나머지 방식 | 뽑고 방식 |
|---|---|---|
| 0 | 10.148% | 10.008% |
| 1 | 10.153% | 9.974% |
| 2 | 10.149% | 10.023% |
| 3 | 10.164% | 10.000% |
| 4 | 10.157% | 10.008% |
| 5 | 10.148% | 10.009% |
| 6 | 9.778% | 9.998% |
| 7 | 9.751% | 9.999% |
| 8 | 9.771% | 9.986% |
| 9 | 9.781% | 9.995% |
이 숫자를 읽는 법
표의 「카이제곱」은 실제 관측 횟수가 이상적인 기대 횟수에서 얼마나 멀리 떨어졌는지를 하나의 수로 요약한 값입니다. 값이 작을수록 고르고, 「5% 기준」보다 크면 「우연이라고 보기 어려운 치우침」으로 판단합니다. 뽑고 shuffle은 24.7로 기준 35.172보다 작았고, 무작위 정렬은 100만이 넘어 비교가 되지 않았습니다.
다만 이 실험이 증명하는 것은 「결과가 고르게 분포한다」는 것까지입니다. 난수 자체가 예측 불가능한지는 다른 문제이고, 실험 환경이 조작되지 않았다는 것도 증명하지 않습니다. 이 한계는 추첨 방식 안내 페이지에 따로 적어 두었습니다.
참고한 자료
바로 써 보기
- 발표 순서·짝 정하기 — 누가 먼저? 누구랑?
- 제비뽑기 — 두근두근, 행운의 한 장