랜덤 뽑기 · 조 나누기
이름이나 항목을 줄마다 입력하면 무작위로 뽑거나 순서를 섞고, 원하는 조 수로 균등하게 나눕니다.
입력한 항목 중 원하는 개수만큼 무작위로 고릅니다.
- 김민준
- 이서연
- 박지호
- 최수아
- 정하윤
- 강도윤
- 조은우
- 윤서아
참고 · 추첨 방식
Fisher-Yates 알고리즘과 암호학적 난수를 써서 편향 없이 섞습니다. 결과는 버튼을 누른 시점에 이미 정해지며, 룰렛과 순차 공개는 표현일 뿐 결과에 영향을 주지 않습니다. 입력한 명단은 서버로 전송되지 않습니다.
세 가지 방식
뽑기는 입력한 항목 중 원하는 개수만큼 무작위로 고릅니다. 당첨자 추첨, 발표자 선정, 점심 메뉴 고르기에 씁니다.
순서 섞기는 전체 항목의 순서를 무작위로 다시 배열합니다. 발표 순서, 면접 순서, 게임 순번을 정할 때 유용합니다.
조 나누기는 항목을 지정한 조 수로 최대한 균등하게 나눕니다. 인원이 딱 나누어떨어지지 않으면 한 명씩 차이가 나도록 배분합니다.
명단은 한 줄에 하나씩
항목은 줄바꿈으로 구분합니다. 빈 줄과 앞뒤 공백은 자동으로 버려지므로 엑셀이나 구글 시트의 한 열을 복사해 그대로 붙여 넣으면 됩니다. 쉼표로 이어 붙인 명단은 한 항목으로 취급되니 줄바꿈으로 바꿔 넣어야 합니다.
같은 이름이 두 줄 있으면 두 개의 다른 항목으로 봅니다. 동명이인이 있다면 부서나 번호를 붙여 구분해 두는 편이 결과를 읽기 편합니다.
뽑을 개수가 1이고 항목이 24개 이하이면 룰렛이 돌아가는 연출이 나옵니다. 화면 공유 중에 긴장감을 주는 용도입니다. 항목이 그보다 많거나 운영체제의 "동작 줄이기" 설정을 켜 두었으면 연출 없이 바로 결과가 나옵니다. 연출은 보여 주기 위한 것일 뿐이고, 결과는 룰렛이 돌기 전에 이미 정해져 있습니다.
정말 무작위인가요
두 가지를 신경 써서 구현했습니다.
Fisher-Yates 셔플
흔히 쓰이는 방법 중에 이런 것이 있습니다.
items.sort(() => Math.random() - 0.5)
간단해 보이지만 실제로는 편향이 심합니다. 정렬 알고리즘이 비교자를 일관되게 호출한다고 가정하는데, 무작위 비교자는 그 가정을 깨뜨립니다. 결과적으로 원래 앞쪽에 있던 항목이 여전히 앞쪽에 나올 확률이 높아집니다.
이 도구는 Fisher-Yates 알고리즘을 씁니다. 뒤에서부터 하나씩 무작위 위치와 맞바꾸는 방식으로, 모든 순열이 정확히 같은 확률로 나오는 것이 수학적으로 증명되어 있습니다.
모듈로 편향 제거
난수를 원하는 범위로 맞출 때 나머지 연산을 쓰면 문제가 생깁니다.
32비트 난수를 10으로 나눈 나머지를 쓴다고 해봅시다. 2³²는 10으로 나누어떨어지지 않으므로 0~5가 6~9보다 미세하게 더 자주 나옵니다. 범위가 클수록 편향도 커집니다.
이 도구는 편향이 생기는 구간의 값을 버리고 다시 뽑아 이 문제를 없앴습니다. 난수원은 Math.random()이 아니라 브라우저의 암호학적 난수 생성기입니다.
중복 허용은 언제 쓰나요
끄는 경우 (기본) — 당첨자 뽑기, 발표 순서, 팀 배정처럼 같은 항목이 두 번 나오면 안 되는 상황입니다.
켜는 경우 — 주사위 굴리기, 랜덤 메뉴를 반복해서 고르기, 시뮬레이션처럼 매번 독립적으로 뽑아야 하는 상황입니다. 통계에서는 이를 복원 추출이라고 합니다.
중복을 허용하면 항목 수보다 많은 개수도 뽑을 수 있습니다.
중복 허용을 켠 채로 당첨자를 뽑으면 생각보다 자주 같은 사람이 두 번 나옵니다. 10명 중 2명을 복원 추출하면 겹칠 확률이 10%이고, 30명 중 5명이면 29.6%, 30명 중 10명이면 81.5%입니다. 생일이 같은 사람이 있을 확률이 예상보다 높은 것과 같은 원리입니다. 당첨자 뽑기에서 "같은 사람이 또 나왔다"는 항의를 받지 않으려면 중복 허용을 꺼 두어야 합니다.
가중치를 주고 싶다면
이 도구에는 항목마다 확률을 다르게 주는 기능이 없습니다. 대신 같은 항목을 여러 줄 넣으면 같은 효과가 납니다. 응모권을 세 장 낸 사람은 세 줄, 한 장 낸 사람은 한 줄로 넣고 중복 허용을 끈 채 뽑으면, 세 줄 넣은 사람은 뽑힐 확률이 세 배가 되고 최대 세 번까지 뽑힐 수 있습니다. 한 사람이 한 번만 당첨되어야 한다면 뽑을 개수를 넉넉히 잡은 뒤 위에서부터 중복을 걷어 내면 됩니다.
확률은 얼마인가
중복 없이 뽑을 때 각 항목이 뽑힐 확률은 뽑을 개수 ÷ 전체 항목 수로 모두 같습니다. 30명 중 3명을 뽑으면 누구나 10%입니다. 명단에 먼저 적힌 사람이나 나중에 적힌 사람이나 차이가 없고, 명단 순서를 바꿔도 확률은 그대로입니다.
순서 섞기에서 특정 사람이 1번이 될 확률은 1 ÷ 전체 인원입니다. 30명이면 3.3%입니다. 조 나누기에서 특정 두 사람이 같은 조에 들어갈 확률은 조 수에 반비례해서, 4개 조면 대략 25%입니다.
조 나누기 요령
인원이 조 수로 나누어떨어지지 않으면 어떤 조는 한 명 더 많습니다. 이 도구는 섞은 뒤 순서대로 배분하므로 차이가 최대 한 명입니다.
실무에서는 완전 무작위가 늘 좋은 것은 아닙니다.
- 역량을 고르게 섞고 싶다면 수준별로 나눠 각 조에 한 명씩 배정하는 편이 낫습니다
- 친분을 흩뜨리고 싶다면 무작위가 적합합니다
- 재현이 필요하다면 결과를 복사해 두세요. 새로고침하면 사라집니다
자주 쓰는 장면
자리 배치 — 순서 섞기로 명단을 섞은 뒤 위에서부터 좌석 번호를 붙입니다. 학기 초 교실이나 워크숍 좌석을 정할 때 씁니다. 앞자리를 원하지 않는 사람이 많을수록 무작위가 공정하다는 인상을 줍니다.
청소·당직 순번 — 순서 섞기 결과를 그대로 순번표로 씁니다. 한 번 정한 순서를 계속 돌리면 다음 차례가 누구인지 다툴 일이 없습니다.
발표 순서 — 발표자에게 순서 섞기 결과를 미리 공유하면 준비 시간을 예측할 수 있습니다. 순서를 뽑는 자리에서 화면을 공유하면 "왜 내가 1번이냐"는 불만이 줄어듭니다.
점심 메뉴 — 후보를 넣고 하나를 뽑습니다. 결과가 마음에 안 들면 다시 뽑고 싶어지는데, 그 순간 이미 답을 알고 있는 셈이니 그냥 그 메뉴로 가는 편이 빠릅니다.
조 나누기 — 결과는 조별로 열이 나뉜 표로 나옵니다. 그대로 복사해 메신저에 붙이면 표 형태가 유지됩니다.
공정성이 중요한 상황이라면
경품 추첨처럼 결과에 이해관계가 걸린 경우에는 몇 가지를 갖춰 두는 것이 좋습니다.
- 참가자 명단을 미리 공개합니다
- 추첨 과정을 화면 공유하거나 녹화합니다
- 결과를 즉시 캡처해 남깁니다
이 도구는 결과를 저장하지 않으므로, 나중에 "다시 돌려 보자"는 요구가 나오지 않도록 그 자리에서 확정하는 것이 중요합니다.
결과를 다시 뽑고 싶을 때
뽑기 버튼은 몇 번이든 누를 수 있지만, 이해관계가 걸린 자리에서는 "한 번만 뽑는다"를 먼저 선언하고 시작하는 것이 좋습니다. 결과가 나온 뒤에 다시 뽑자는 말이 나오면 이미 공정성이 의심받기 시작한 것입니다. 연습으로 몇 번 돌려 보고 싶다면 실제 명단 대신 가짜 항목으로 시험한 뒤, 실제 명단은 한 번만 넣으세요.
사다리타기와 무엇이 다른가
사다리타기도 결과는 무작위이지만 출발점과 도착점을 정해 두고 경로를 보여 주는 방식이라, 벌칙이나 역할처럼 "누가 무엇을"을 정하는 데 어울립니다. 이 도구는 명단에서 사람만 골라내거나 순서만 섞는 데 적합하고, 항목이 수십 개를 넘어가도 한 번에 처리됩니다. 인원이 열 명을 넘으면 사다리보다 이쪽이 빠릅니다.
입력한 명단은 저장되지 않습니다
모든 처리가 브라우저 안에서 이루어지며 서버로 전송되지 않습니다. 직원 명단이나 고객 정보처럼 밖으로 나가면 곤란한 자료도 안심하고 넣을 수 있습니다.
새로고침하면 사라지므로 필요한 결과는 복사해 두시기 바랍니다.