사다리타기는 공정할까
사다리는 두 사람이 같은 결과에 도착하지 않는다는 점에서 구조상 깔끔합니다. 그러나 각 출구에 도착할 몫이 같은지는 가로선 밀도와 인원에 따라 달라집니다. 시뮬레이션 표로 확인했습니다.
사다리가 일대일로 이어지는 이유
사다리타기에서 가로선은 늘 이웃한 두 줄만 잇습니다. 그림 속 사람이 가로선을 만나 옆줄로 건너가면, 그 옆줄에 있던 사람은 반대 방향으로 건너옵니다. 즉 가로선 하나는 이웃한 두 줄에 서 있는 두 사람의 위치를 서로 바꾸는 일입니다. 위치를 바꾸는 동작을 아무리 이어 붙여도 두 사람이 같은 줄에 겹쳐 서는 순간은 생기지 않습니다.
같은 설명을 거꾸로 해도 됩니다. 아래에서 출발해 가로선을 반대로 따라 올라가면 항상 한 사람의 출발점에 닿습니다. 출구마다 정확히 한 명이 대응되고, 그래서 “한 사람에게 결과 하나씩”을 나눠 줄 때 사다리가 깔끔한 도구가 됩니다. 이 성질은 가로선을 몇 개 긋든 달라지지 않습니다.
다만 일대일이라는 사실은 어느 출구에 누가 도착할 몫이 같다는 뜻이 아닙니다. 출구가 겹치지 않는다는 구조적 성질과, 각 출구에 도착할 몫이 고르다는 확률적 성질은 서로 다른 이야기입니다. 이 글의 나머지는 두 번째 성질을 다룹니다.
이 사이트가 가로선을 만드는 방식
사다리 엔진의 코드는 높이를 24단계로 나누고, 그중 위아래 가장자리를 비운 2단계부터 21단계까지에서 가로선을 놓습니다. 단계마다 이웃한 줄 쌍을 차례로 살피면서, 바로 위 단계에 같은 쌍의 가로선이 없고 옆 쌍에 가로선이 닿지 않을 때만 정해진 확률로 가로선을 만듭니다. 밀도가 적음이면 0.25, 보통이면 0.45, 많음이면 0.65를 씁니다.
그다음에는 각 줄 사이에 가로선이 너무 적지 않도록 보충합니다. 적음은 2개, 보통은 3개, 많음은 5개를 최소로 맞추려고 하며, 무작위 위치를 최대 50번 시도해서 주변과 겹치지 않는 자리에만 놓습니다. 사람이 가로선을 손으로 그리는 것이 아니라 이 규칙에 따라 컴퓨터가 새로 만들기 때문에, 같은 설정에서도 버튼을 누를 때마다 다른 사다리가 나옵니다.
시뮬레이션은 이렇게 돌렸습니다
아래 표의 값은 설정마다 사다리를 20,000번 새로 만들고, 1번 줄에서 출발한 사람이 각 출구에 도착한 횟수를 센 비율입니다. 무작위 수는 고정된 시드의 생성기로 바꿔 넣었기 때문에 몇 번을 다시 계산해도 같은 값이 나옵니다. 표시는 가장 가까운 정수 퍼센트입니다. 인원이 같다면 1번 줄이 아닌 다른 출발점도 비슷한 방식으로 계산되며, 저장소의 scripts/odds-values.js가 모든 출발점의 값을 만듭니다.
균등하다는 것은 인원이 n명일 때 모든 출구에 도착할 몫이 n분의 1로 같다는 뜻입니다. 4명이면 25%, 6명이면 16.7%, 10명이면 10%가 기준입니다.
| 밀도 | 출구 1 | 출구 2 | 출구 3 | 출구 4 |
|---|---|---|---|---|
| 적음 | 26% | 24% | 25% | 24% |
| 보통 | 25% | 25% | 25% | 25% |
| 많음 | 25% | 25% | 25% | 25% |
| 밀도 | 출구 1 | 출구 2 | 출구 3 | 출구 4 | 출구 5 | 출구 6 |
|---|---|---|---|---|---|---|
| 적음 | 23% | 20% | 18% | 15% | 13% | 12% |
| 보통 | 17% | 17% | 17% | 17% | 16% | 17% |
| 많음 | 17% | 17% | 16% | 16% | 16% | 17% |
| 밀도 | 출구 1 | 출구 2 | 출구 3 | 출구 4 | 출구 5 | 출구 6 | 출구 7 | 출구 8 | 출구 9 | 출구 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 적음 | 22% | 19% | 17% | 14% | 10% | 8% | 4% | 2% | 1% | 1% |
| 보통 | 15% | 15% | 14% | 12% | 11% | 9% | 7% | 6% | 5% | 5% |
| 많음 | 11% | 10% | 10% | 10% | 10% | 10% | 9% | 10% | 10% | 9% |
전체 출발점과 도착점을 통틀어 가장 낮은 값과 가장 높은 값은 다음과 같습니다. 두 값의 간격이 좁을수록 균등에 가깝습니다.
| 인원 | 적음 | 보통 | 많음 |
|---|---|---|---|
| 4명 | 24% ~ 27% | 25% ~ 25% | 25% ~ 25% |
| 6명 | 11% ~ 24% | 16% ~ 17% | 16% ~ 17% |
| 8명 | 3% ~ 25% | 9% ~ 16% | 12% ~ 13% |
| 10명 | 1% ~ 24% | 4% ~ 15% | 9% ~ 11% |
표를 읽는 법
4명일 때는 어떤 밀도에서도 값이 균등한 몫에 가깝습니다. 그러나 인원이 늘면 사정이 달라집니다. 10명, 밀도 적음에서 1번 줄 출발자가 출구 1에 도착할 비율은 22%이고 출구 10에는 1%입니다. 균등 기준이 10%이니 많이 쏠린 결과입니다. 한 번의 이동은 이웃한 줄로만 일어나고 높이는 유한하므로, 가로선이 적으면 출발점에서 먼 출구까지 닿기가 어렵기 때문입니다.
밀도를 높이면 이 쏠림이 줄어듭니다. 10명 보통에서는 1번 줄 출발자가 출구 1에 15%, 출구 10에 5%로 간격이 좁아지고, 많음에서는 각각 11%와 9%로 거의 균등합니다. 결론적으로 인원이 7명 이상이면 보통이나 많음을 고르는 편이 좋고, 10명 안팎에서는 표에서 보듯 많음이 균등에 가장 가깝습니다.
이 표는 설정으로 사다리를 새로 만들 때의 통계입니다. 이미 화면에 그려진 사다리 한 장에서는 모든 사람의 도착 칸이 정해져 있으므로, 그 한 장은 표의 비율과 다를 수 있습니다.
결과 칸을 섞으면 쏠림이 사라지는 이유
사다리 화면에는 입력 순서를 섞는 기능이 있습니다. 코드를 보면 이름 목록과 결과 목록을 각각 따로 섞습니다. 출구에 도착할 몫이 쏠려 있더라도 어느 출구에 어떤 결과가 적혀 있는지가 무작위라면, 한 사람이 받을 결과의 몫은 출구의 쏠림과 무관하게 모든 결과에서 같아집니다. 출구가 아니라 결과 쪽을 섞었기 때문입니다.
단, 이 효과는 섞은 다음에 사다리를 타야 성립합니다. 결과를 이미 본 상태에서 이름만 옮기거나, 이름 위치를 사람이 직접 고르게 하면 위치의 영향이 다시 생깁니다. 종이 사다리에서 이름과 결과를 사람이 직접 적는다면 먼저 번호표를 뽑아 자리를 정하는 단계가 필요합니다.
화면의 확률 분석 버튼과 이 글의 차이
사다리 화면의 확률 분석 버튼은 500회 시뮬레이션을 돌려 결과를 보여 줍니다. 이 글은 20,000회를 기준으로 합니다. 횟수가 적으면 같은 설정에서도 버튼을 누를 때마다 몇 퍼센트포인트씩 값이 달라질 수 있습니다. 화면의 값은 대략의 경향을 보는 용도이고, 이 글의 표는 같은 경향을 더 안정된 값으로 확인한 것입니다.
이 숫자를 확인하는 방법
표의 모든 값은 scripts/odds-values.js가 사다리 엔진 파일을 직접 불러와 계산한 것입니다. 이 스크립트는 난수 생성기를 고정 시드 하나로 바꾼 뒤 20,000번의 사다리를 만들고 도착 횟수를 셉니다. scripts/odds.test.js는 같은 계산을 두 번 돌려 결과가 일치하는지 확인하고, 이 페이지의 숫자가 계산값과 같은지 대조합니다.
종이로 직접 확인해 보려면 4줄 사다리를 그리는 방법이 가장 간단합니다. 가로선을 여러 사람이 번갈아 하나씩 긋고 1번 줄에서 출발하는 경로를 따라가 도착 칸을 표에 적습니다. 서로 다른 사다리를 20장쯤 그려도 도착 칸이 고르게 나오는지는 한 번에 판단하기 어렵습니다. 대신 “도착 칸이 겹친 적이 없다”는 일대일 성질을 확인하기에는 충분합니다.
| 사다리 번호 | 출구 1 | 출구 2 | 출구 3 | 출구 4 |
|---|---|---|---|---|
| 1번째 사다리 | ||||
| 2번째 사다리 | ||||
| 3번째 사다리 | ||||
| 4번째 사다리 |
사다리의 원리 자체는 사다리타기 화면에서 직접 해 볼 수 있고, 이웃 시리즈 글은 순서가 확률을 바꿀까와 주사위와 가위바위보의 확률입니다. 추첨 전반의 원칙은 같은 확률로 뽑는 방법에 정리되어 있습니다.