랜덤 뽑기 · 조 나누기
이름이나 항목을 줄마다 입력하면 무작위로 뽑거나 순서를 섞고, 원하는 조 수로 균등하게 나눕니다.
입력한 항목 중 원하는 개수만큼 무작위로 고릅니다.
- 김민준
- 이서연
- 박지호
- 최수아
- 정하윤
- 강도윤
- 조은우
- 윤서아
참고 · 추첨 방식
Fisher-Yates 알고리즘과 암호학적 난수를 써서 편향 없이 섞습니다. 결과는 버튼을 누른 시점에 이미 정해지며, 룰렛과 순차 공개는 표현일 뿐 결과에 영향을 주지 않습니다. 입력한 명단은 서버로 전송되지 않습니다.
세 가지 방식
뽑기는 입력한 항목 중 원하는 개수만큼 무작위로 고릅니다. 당첨자 추첨, 발표자 선정, 점심 메뉴 고르기에 씁니다.
순서 섞기는 전체 항목의 순서를 무작위로 다시 배열합니다. 발표 순서, 면접 순서, 게임 순번을 정할 때 유용합니다.
조 나누기는 항목을 지정한 조 수로 최대한 균등하게 나눕니다. 인원이 딱 나누어떨어지지 않으면 한 명씩 차이가 나도록 배분합니다.
정말 무작위인가요
두 가지를 신경 써서 구현했습니다.
Fisher-Yates 셔플
흔히 쓰이는 방법 중에 이런 것이 있습니다.
items.sort(() => Math.random() - 0.5)
간단해 보이지만 실제로는 편향이 심합니다. 정렬 알고리즘이 비교자를 일관되게 호출한다고 가정하는데, 무작위 비교자는 그 가정을 깨뜨립니다. 결과적으로 원래 앞쪽에 있던 항목이 여전히 앞쪽에 나올 확률이 높아집니다.
이 도구는 Fisher-Yates 알고리즘을 씁니다. 뒤에서부터 하나씩 무작위 위치와 맞바꾸는 방식으로, 모든 순열이 정확히 같은 확률로 나오는 것이 수학적으로 증명되어 있습니다.
모듈로 편향 제거
난수를 원하는 범위로 맞출 때 나머지 연산을 쓰면 문제가 생깁니다.
32비트 난수를 10으로 나눈 나머지를 쓴다고 해봅시다. 2³²는 10으로 나누어떨어지지 않으므로 0~5가 6~9보다 미세하게 더 자주 나옵니다. 범위가 클수록 편향도 커집니다.
이 도구는 편향이 생기는 구간의 값을 버리고 다시 뽑아 이 문제를 없앴습니다. 난수원은 Math.random()이 아니라 브라우저의 암호학적 난수 생성기입니다.
중복 허용은 언제 쓰나요
끄는 경우 (기본) — 당첨자 뽑기, 발표 순서, 팀 배정처럼 같은 항목이 두 번 나오면 안 되는 상황입니다.
켜는 경우 — 주사위 굴리기, 랜덤 메뉴를 반복해서 고르기, 시뮬레이션처럼 매번 독립적으로 뽑아야 하는 상황입니다. 통계에서는 이를 복원 추출이라고 합니다.
중복을 허용하면 항목 수보다 많은 개수도 뽑을 수 있습니다.
조 나누기 요령
인원이 조 수로 나누어떨어지지 않으면 어떤 조는 한 명 더 많습니다. 이 도구는 섞은 뒤 순서대로 배분하므로 차이가 최대 한 명입니다.
실무에서는 완전 무작위가 늘 좋은 것은 아닙니다.
- 역량을 고르게 섞고 싶다면 수준별로 나눠 각 조에 한 명씩 배정하는 편이 낫습니다
- 친분을 흩뜨리고 싶다면 무작위가 적합합니다
- 재현이 필요하다면 결과를 복사해 두세요. 새로고침하면 사라집니다
공정성이 중요한 상황이라면
경품 추첨처럼 결과에 이해관계가 걸린 경우에는 몇 가지를 갖춰 두는 것이 좋습니다.
- 참가자 명단을 미리 공개합니다
- 추첨 과정을 화면 공유하거나 녹화합니다
- 결과를 즉시 캡처해 남깁니다
이 도구는 결과를 저장하지 않으므로, 나중에 "다시 돌려 보자"는 요구가 나오지 않도록 그 자리에서 확정하는 것이 중요합니다.
입력한 명단은 저장되지 않습니다
모든 처리가 브라우저 안에서 이루어지며 서버로 전송되지 않습니다. 직원 명단이나 고객 정보처럼 밖으로 나가면 곤란한 자료도 안심하고 넣을 수 있습니다.
새로고침하면 사라지므로 필요한 결과는 복사해 두시기 바랍니다.