컴퓨터 추첨은 정말 공정할까? 난수와 편향 쉽게 이해하기
작성일:
온라인 추첨 결과가 마음에 들지 않으면 "이거 조작 아니야?"라는 말이 절로 나옵니다. 컴퓨터는 정해진 계산만 하는 기계인데, 어떻게 무작위로 고를 수 있을까요? 이 글에서는 추첨을 공정하게 만드는 세 가지 지점을 살펴봅니다.
컴퓨터의 난수는 어디서 올까?
많은 프로그램은 의사 난수 생성기를 씁니다. 시작값 하나에서 복잡한 계산을 반복해 무작위처럼 보이는 숫자를 만드는 방식입니다. 일상적인 용도에는 충분하지만, 시작값과 계산 방식을 알면 다음 숫자를 예측할 수 있습니다.
반면 암호학적 난수 생성기는 운영체제가 모은 예측하기 어려운 값을 바탕으로 만들어지고, 지금까지 나온 숫자로 다음 숫자를 알아내기 어렵게 설계되어 있습니다. 브라우저에서는 Web Crypto API의 crypto.getRandomValues로 쓸 수 있으며, 이 사이트의 추첨도 이 기능을 사용합니다.
좋은 난수도 잘못 쓰면 치우친다
좋은 난수를 받아도 끝이 아닙니다. 가장 흔한 실수는 나머지 연산입니다. 0부터 255까지 나오는 숫자를 3으로 나눈 나머지로 세 명 중 한 명을 뽑는다고 해 봅시다. 256은 3으로 딱 나누어떨어지지 않아서 0번 사람이 나올 경우의 수는 86가지, 나머지 두 사람은 85가지가 됩니다. 아주 작지만 분명한 차이입니다.
해결책은 간단합니다. 나누어떨어지는 범위까지만 받아들이고, 그보다 큰 숫자가 나오면 버리고 다시 뽑습니다. 위 예시라면 0부터 254까지만 쓰고 255가 나오면 다시 뽑는 식입니다. 이 사이트도 같은 방식으로 정수를 뽑습니다.
순서를 섞을 때의 함정
차례를 섞을 때도 비슷한 문제가 있습니다. 목록을 처음부터 돌면서 각 항목을 아무 위치와 바꾸는 방법은 쉬워 보이지만, 특정 순서가 더 자주 나옵니다. 3명만 해도 경우의 수가 27가지인데 가능한 순서는 6가지라, 27이 6으로 나누어떨어지지 않으므로 공평할 수 없습니다.
널리 쓰이는 피셔-예이츠 셔플은 맨 뒤부터 차례로, 아직 확정되지 않은 범위 안에서만 교환 상대를 고릅니다. 그러면 모든 순서가 정확히 같은 확률로 나옵니다.
연출과 결과의 관계
돌림판이 경계에서 아슬아슬하게 넘어가는 장면은 결과를 결정하는 과정이 아닙니다. 대부분의 게임은 누르는 순간 결과를 먼저 정하고 그 결과에 맞게 움직입니다. 그래서 돌림판의 속도나 시작 위치에 '요령'은 없습니다.
예외도 있습니다. 회전 다트판은 다트가 꽂힌 위치로 결과를 계산하고, 핀볼 룰렛은 물리 시뮬레이션의 결과를 그대로 씁니다.
연속으로 걸리면 이상한 걸까?
네 명이 돌림판을 돌렸는데 같은 사람이 두 번 연속 걸릴 확률은 4분의 1이나 됩니다. 사람은 무작위라고 하면 결과가 고르게 섞이기를 기대하지만, 진짜 무작위에는 이런 쏠림이 자연스럽게 나타납니다. 이전 결과는 다음 결과에 영향을 주지 않기 때문입니다. 연속으로 걸린 친구에게는 위로의 말을 전해 주세요.