랜덤초이스
5

공정한 랜덤 뽑기 방법

발표자 선정, 경품 추첨, 순서 정하기처럼 결과에 사람들의 이해관계가 걸릴수록 '정말 공정하게 뽑혔는가'가 중요합니다. 겉으로는 무작위처럼 보여도 방법이 잘못되면 특정 항목이 더 자주 뽑히는 편향이 생길 수 있습니다.

무작위와 공정함은 다르다

무작위(random)는 결과를 예측할 수 없다는 뜻이고, 공정함(fairness)은 모든 항목이 정해진 규칙대로 같은(또는 의도한) 확률을 가진다는 뜻입니다. 예측 불가능하더라도 특정 항목이 구조적으로 유리하다면 그 뽑기는 무작위일 뿐 공정하지 않습니다.

그래서 공정한 뽑기를 만들려면 두 가지가 필요합니다. 첫째, 질 좋은 난수. 둘째, 그 난수를 편향 없이 항목에 배분하는 알고리즘입니다. 둘 중 하나만 어긋나도 결과가 한쪽으로 쏠릴 수 있습니다.

흔한 실수: sort(() => Math.random() - 0.5)

배열을 섞을 때 많이 쓰는 이 코드는 사실 고르게 섞이지 않습니다. 정렬 알고리즘이 비교 결과가 일관적이라고 가정하는데, 랜덤 비교는 그 가정을 깨뜨려 원래 순서에 가까운 위치에 남는 항목이 생깁니다. 결과적으로 앞이나 뒤에 있던 항목이 특정 자리에 더 자주 배치됩니다.

이 방식은 항목이 많아질수록 편향이 눈에 띄게 커집니다. 재미로 쓰는 상황이면 상관없지만, 순서나 당첨처럼 결과가 의미 있는 곳에서는 피해야 합니다.

정석: 피셔-예이츠 셔플

피셔-예이츠(Fisher-Yates) 셔플은 뒤에서부터 하나씩, 아직 섞지 않은 범위 안에서 무작위 위치와 교환하는 방식입니다. 모든 순열이 정확히 같은 확률로 나오도록 수학적으로 보장되며, 항목 수와 상관없이 편향이 생기지 않습니다.

이 사이트의 랜덤뽑기, 순서뽑기, 팀 나누기는 모두 피셔-예이츠 셔플을 사용합니다. 그래서 항목이 몇 개든 특정 이름이 구조적으로 유리해지는 일이 없습니다.

가중치가 있을 때의 공정함

모든 항목이 같은 확률이어야만 공정한 것은 아닙니다. 상품 등급이 다르거나, 참여 횟수만큼 확률을 높이고 싶을 때는 의도적으로 가중치를 줍니다. 이때 중요한 건 '설정한 가중치 비율대로 정확히 뽑히는가'입니다.

랜덤뽑기와 룰렛은 이름 뒤에 *숫자 형식으로 가중치를 넣을 수 있고, 실제 선택 확률이 그 비율과 일치하도록 계산합니다. 화면에 확률 미리보기도 함께 보여 주어 참가자에게 규칙을 투명하게 공개할 수 있습니다.

자주 묻는 질문

브라우저 뽑기 결과를 신뢰해도 되나요?

일상적인 선택이라면 충분히 신뢰할 수 있습니다. 다만 금전이나 법적 효력이 걸린 추첨은 별도의 검증 절차나 공개 진행을 함께 두는 것이 좋습니다.

같은 이름을 두 번 넣으면 어떻게 되나요?

서로 다른 항목으로 취급되어 그만큼 뽑힐 확률이 올라갑니다. 중복을 원치 않으면 입력에서 정리하고, 확률을 높이려는 의도라면 가중치 기능을 쓰는 편이 명확합니다.

함께 쓰면 좋은 도구

다른 가이드