랜덤 뽑기

이름을 넣고 버튼만 누르면 랜덤으로 뽑아줍니다. 벌칙 정하기, 발표 순서, 경품 추첨에 사용하세요.

빈 줄과 앞뒤 공백은 무시합니다.

사다리타기와 무엇이 다른가

사다리타기는 참가자 수만큼 세로줄을 그어야 해서 스무 명만 넘어가도 화면이 읽히지 않습니다. 결과도 한 사람당 하나씩만 배정되니, 열 명 중 세 명을 뽑는 식의 추첨에는 맞지 않습니다. 여기서는 명단 길이와 상관없이 화면이 그대로이고, 뽑을 인원을 원하는 만큼 지정합니다. 엑셀 한 열이나 메모장 목록을 그대로 붙여넣어도 되고, 결과는 쉼표로 이어진 한 줄로 복사되어 단톡방에 바로 올라갑니다.

이런 경우에 씁니다

가장 흔한 쓰임은 벌칙이나 궂은 역할 정하기입니다. 회식 총무, 발표 자료 취합, 청소 당번처럼 아무도 손들지 않는 일은 논의가 길어질수록 사이만 나빠집니다. 명단을 넣고 한 명 뽑으면 30초 만에 끝납니다. 두 번째는 발표 순서 정하기입니다. 중복 허용을 끄고 뽑을 인원을 전체 인원과 같게 넣으면 명단 전체가 섞인 순서로 나오므로, 1번부터 끝번까지 순서를 한 번에 정할 수 있습니다. 먼저 하겠다는 사람도 없고 마지막을 하겠다는 사람도 없을 때 이게 제일 깔끔합니다.

세 번째는 경품 추첨입니다. 사내 행사나 커뮤니티 이벤트에서 응모자 명단을 붙여넣고 당첨 인원만큼 뽑으면 됩니다. 한 사람이 여러 경품을 받을 수 있는 규칙이면 중복 허용을 켜고, 1인 1경품이면 꺼두세요. 이 밖에도 조 발표 순서, 인터뷰 순서, 스터디 발제자, 게임 선공 정하기처럼 “누가 할래”로 시작하는 모든 상황에 쓸 수 있습니다. 한 명이 아니라 팀 단위로 나눠야 한다면 팀 나누기가 더 맞고, 점심 메뉴처럼 사람이 아니라 항목을 고르는 거라면 점심 메뉴 추천에 후보가 이미 들어 있습니다.

정말 무작위인가요 - crypto 난수와 Math.random의 차이

추첨 도구에서 가장 중요한 건 화면 효과가 아니라 난수의 품질입니다. 웹에서 난수를 만드는 방법은 크게 둘입니다. 하나는 Math.random인데, 이건 의사난수입니다. 내부에 씨앗값 하나를 두고 정해진 수식을 반복해 다음 값을 만듭니다. 결과가 무작위로 보일 뿐, 씨앗값과 수식을 알면 다음 값이 무엇인지 계산할 수 있습니다. 실제로 브라우저 구현에 따라 앞선 출력 몇 개만으로 내부 상태를 역산해 이후 값을 전부 맞히는 시연이 여러 차례 공개된 적이 있습니다. 명세상 예측 불가능성을 보장하지 않는다고 못 박혀 있기도 합니다.

다른 하나가 이 도구가 쓰는 crypto.getRandomValues입니다. 운영체제가 모아 둔 엔트로피 풀에서 값을 가져오는데, 이 풀은 장치 인터럽트 타이밍이나 하드웨어 잡음처럼 예측할 수 없는 물리적 사건에서 채워집니다. 암호 키를 만들 때 쓰는 것과 같은 등급이라, 이전 결과를 아무리 많이 모아도 다음 값을 계산해 낼 수 없습니다.

여기에 한 가지를 더 했습니다. 난수를 특정 범위로 줄일 때 흔히 쓰는 나머지 연산은 그 자체로 아주 작은 치우침을 만듭니다. 예를 들어 0부터 2까지의 난수를 0, 1, 2 세 개로 나누면 딱 떨어지지만, 범위가 나누어떨어지지 않으면 앞쪽 값이 아주 조금 더 자주 나옵니다. 이 도구는 범위에 딱 떨어지지 않는 구간의 값이 나오면 버리고 다시 뽑습니다. 이렇게 하면 명단이 몇 명이든 모든 사람의 확률이 정확히 같아집니다. 섞기에는 Fisher-Yates 알고리즘을 씁니다. 뒤에서부터 한 칸씩 무작위 위치와 자리를 바꾸는 방식으로, 가능한 모든 순열이 똑같은 확률로 나온다는 것이 수학적으로 증명된 방법입니다. 흔히 쓰는 “정렬 함수에 난수를 넣어 섞기”는 이 성질이 깨져서 특정 순서가 더 자주 나옵니다.

공정하게 뽑아서 뒷말이 없게 하려면

  • 뽑기 전에 명단을 화면에 띄워 전원이 확인하게 합니다. 명단이 확정되면 개입할 여지가 없습니다.
  • 재뽑기 횟수를 미리 정합니다. 무제한이면 원하는 결과가 나올 때까지 돌리게 됩니다.
  • 버튼은 진행자가 아니라 참가자 중 한 명이 누르게 합니다.
  • 결과가 나오면 복사해서 바로 단톡방에 올립니다. 기록이 남으면 논란이 줄어듭니다.
  • 연속으로 같은 사람이 걸렸다고 봐주기 시작하면 그때부터는 랜덤이 아닙니다.

자주 묻는 질문

정말 랜덤인가요?

브라우저에 내장된 암호학적 난수 생성기(crypto.getRandomValues)를 씁니다. 운영체제가 모은 예측 불가능한 물리적 잡음에서 값을 뽑기 때문에, 다음에 무엇이 나올지 이전 결과로 추측할 수 없습니다. 여기에 나머지 연산에서 생기는 미세한 치우침까지 제거하는 방식을 더해, 명단의 모든 사람이 정확히 같은 확률로 뽑힙니다.

결과를 조작할 수 있나요?

이 페이지에는 특정 이름을 뽑히게 하거나 빼는 코드가 없습니다. 다만 어떤 웹 뽑기 도구든 화면만 보고는 내부를 알 수 없다는 점은 같습니다. 진행자가 의심받고 싶지 않다면, 뽑기 전에 명단 입력 화면을 참가자에게 그대로 보여주고 버튼도 참가자 중 한 명이 누르게 하세요. 명단이 확정된 뒤에 뽑으면 진행자가 개입할 여지가 없습니다.

한 번에 몇 명까지 뽑을 수 있나요?

뽑을 인원 수 칸에 원하는 숫자를 넣으면 됩니다. 중복 허용을 끄면 명단 인원 수를 넘겨 뽑을 수 없고, 자동으로 명단 전체 인원까지만 뽑습니다. 중복을 허용하면 같은 사람이 여러 번 뽑힐 수 있습니다.

중복 허용은 언제 켜나요?

경품 추첨처럼 한 사람이 여러 개 받을 수 있는 경우에 켭니다. 반대로 발표 순서를 정하거나 서로 다른 당첨자를 뽑을 때는 꺼두세요. 껐을 때는 명단을 섞은 뒤 앞에서부터 필요한 만큼 가져오므로 같은 사람이 두 번 나오지 않습니다.

같은 사람이 계속 뽑히는데 이상한 거 아닌가요?

무작위라면 자연스러운 일입니다. 5명 중 1명을 뽑을 때 같은 사람이 세 번 연속 뽑힐 확률은 25분의 1로, 스무 번쯤 돌리면 한 번은 나옵니다. 사람은 규칙이 없는 데서 규칙을 찾도록 되어 있어서 우연한 반복을 조작으로 오해하기 쉽습니다. 매번 이전 결과와 무관하게 새로 뽑기 때문에, 앞에서 뽑혔다고 다음에 불리해지지도 유리해지지도 않습니다.

명단이 서버에 저장되나요?

저장되지 않습니다. 이름 입력, 섞기, 뽑기까지 전부 브라우저 안에서만 처리되고 서버로 전송되는 값이 없습니다. 페이지를 새로 고치면 입력한 명단도 사라집니다.

결과를 단톡방에 어떻게 올리나요?

결과 아래 복사 버튼을 누르면 뽑힌 사람이 쉼표로 구분된 한 줄로 클립보드에 담깁니다. 그대로 붙여넣으면 됩니다.

함께 쓰는 계산