경품 당첨자를 뽑거나, 수업에서 발표할 학생을 지목하거나, 누가 설거지를 할지 결정해야 하나요? 이 무료 온라인 무작위 추첨기는 여러분이 붙여넣은 어떤 목록에서든 공정하게 이름을 선택합니다. "항목" 상자에 선택 후보를 입력하고(한 줄에 하나씩 적거나 쉼표로 구분), "생성 개수"에서 원하는 결과의 개수를 설정한 다음 "결과 생성"을 누르세요. 목록에는 최소 2개의 항목이 필요하며, 각 항목의 길이는 최대 200자로 최대 1000개의 이름까지 넣을 수 있습니다.
모든 선택 과정은 브라우저에 내장된 시스템의 난수 생성 기능에서 암호학적으로 안전한 무작위 값을 제공하는 Web Crypto API(crypto.getRandomValues)를 사용하여 브라우저 내부에서 직접 실행됩니다. 사용자의 목록은 서버로 전송되거나 기록되지 않으며, 저희가 볼 수도 없습니다. 사람들이 이곳에 붙여넣는 내용이 주로 고객 명단, 학급 출석부, 직장 동료의 이름 등이라는 점을 고려할 때, 이는 다른 어떤 생성기보다 이곳에서 훨씬 더 중요한 부분입니다. "파일에서 로드" 버튼 역시 동일한 약속을 지킵니다. 브라우저가 직접 파일을 읽어 로컬에서 상자를 채우며, 어떠한 데이터도 외부로 업로드되지 않습니다.
제공되는 옵션들은 사람들이 실제로 자주 사용하는 목록 형식에 맞추어 제작되었습니다. "항목 구분 기호"는 기본적으로 "자동 감지"로 설정되어 목록에서 줄바꿈과 쉼표 중 어느 것을 사용했는지 스스로 파악하므로, 스프레드시트나 채팅 메시지, 문서에서 복사한 목록을 서식 수정 없이 그대로 사용할 수 있습니다. 데이터에 여러 형식이 섞여 있는 경우 이 옵션을 "줄바꿈", "쉼표" 또는 "공백"으로 고정하세요. 단, "공백"은 항상 사용자가 의도적으로 선택해야 하며 자동으로 적용되지 않습니다. 성명과 같은 항목 자체에 공백이 포함되어 있는 경우가 많아, 이를 기본값으로 나눌 경우 목록이 망가지는 일이 훨씬 더 많기 때문입니다. "생성 개수"는 1개에서 100개까지 몇 개의 이름을 뽑을지 결정합니다. 200명의 응모자 중에서 3명의 경품 당첨자를 추첨하시나요? 응모자 명단을 붙여넣고 "생성 개수"를 3으로 설정한 후 "결과 생성"을 누르세요. 나머지 두 가지 제어 요소는 생성 개수가 2 이상일 때만 적용되며 그 전까지는 회색으로 비활성화된 상태를 유지합니다. 하나는 같은 항목이 두 번 뽑힐 수 있는지를 결정하는 "중복 제외"이며, 다른 하나는 결과를 어떻게 분리하여 보여줄지 설정하는 "결과 형식"("각 항목을 새 줄에", "공백으로 구분", "쉼표로 구분")입니다.
"항목" 상자 안의 버튼 열은 다른 곳에서 해야 할 편집 작업을 대신 수행해 줍니다. "파일에서 로드"는 일반 텍스트나 CSV 파일에서 직접 목록을 가져옵니다. "섞기"는 상자 안의 항목 순서를 무작위로 재배치하고, "정렬"은 알파벳순 및 숫자의 자연스러운 순서로 배열합니다(다시 클릭하면 순서가 역순으로 바뀝니다). 그리고 "지우기"는 상자를 비웁니다. "샘플 데이터로 채우기"는 클릭 한 번으로 도구를 테스트해 볼 수 있도록 짧은 예시 목록을 넣어 주며, "확장"은 긴 목록을 전체적으로 볼 수 있도록 상자를 펼치고 "축소"는 다시 원래 크기로 접어 줍니다. 결과 영역 아래의 "모두 복사"는 모든 선택 결과를 클립보드에 복사하고, "파일로 저장"은 결과를 기기에 저장합니다. 또한 "기록"은 브라우저에 최근 10번의 추첨 내역을 보관하므로 클릭 한 번으로 이전 결과에 쉽게 접근할 수 있습니다.
선택은 실제로 어떻게 이루어질까요? "결과 생성"을 누르면, 이 페이지는 Math.random()과 같은 JavaScript의 의사 난수 함수를 거치는 대신 crypto.getRandomValues를 통해 브라우저에 무작위 값을 요청하고, 이 값을 사용해 목록 내의 위치를 선택합니다. 32비트의 원시 값을 위치로 변환하는 이 과정에서 추첨 도구들이 종종 눈에 띄지 않게 오류를 범하곤 합니다. 이 값을 목록의 길이로 나눈 나머지(모듈로)를 구하는 것이 가장 흔한 접근법이지만, 이는 편향된 결과를 낳습니다. 2^32이라는 숫자가 목록의 항목 수로 완전히 나누어떨어지지 않는 한, 목록 앞부분에 있는 항목들이 나머지 항목들보다 아주 미세하게 더 자주 나오기 때문입니다. 이러한 결함을 modulo bias라고 부르며, 이는 이론에 그치지 않고 실제로 측정 가능한 수치입니다. 이 추첨기는 대신 목록 길이의 가장 큰 정확한 배수를 넘어서는 값을 버리고 다시 난수를 뽑는 rejection sampling이라는 기술을 사용합니다. 이 방법은 백그라운드에서 몇 번의 추가 추첨을 필요로 하지만, 대략적인 추정이 아닌 정확한 공정성을 보장합니다. 목록 내 위치는 아무것도 바꾸지 않습니다. 첫 번째 항목과 마지막 항목은 모든 추첨에서 항상 정확히 동일한 확률을 갖습니다.
"중복 제외" 스위치는 완전히 다른 두 종류의 추첨을 구분 짓는 기준이며, 통계학에서는 각각을 부르는 이름이 따로 있습니다. 이 기능을 켜면 도구는 Fisher-Yates 알고리즘을 사용해 목록의 복사본을 섞은 다음 위에서부터 차례로 항목을 가져옵니다. 이는 모자에서 뽑은 제비표를 다시 넣지 않고 추첨하는 것과 같아서 아무도 두 번 뽑히지 않으며, 해당 크기의 모든 그룹이 당첨될 확률은 동일합니다. 이것이 바로 sampling without replacement(비복원 추출)이며, 경품 당첨자나 팀을 뽑거나 순서를 정할 때 필요한 방식입니다. 이 기능을 끄면 각 선택이 전체 목록에서 독립적으로 이루어지므로 동일한 항목이 두 번 이상 나올 수 있습니다. 이는 sampling with replacement(복원 추출)라고 하며, 반복되는 추첨이나 빠른 통계적 표본 추출과 같이 매 라운드마다 모든 사람이 선택될 자격을 유지해야 할 때 필요합니다. 두 모드 중 어느 쪽이 더 공정한 것은 아닙니다. 그저 서로 다른 질문에 대한 해답일 뿐입니다.
공정한 추첨은 겉보기에 공정해 보이지 않는 법입니다. 10개의 이름 중 5개를 뽑아보면, 원본 목록에서 나란히 있던 두 이름이 선택되거나 중복이 허용될 경우 같은 이름이 연속해서 두 번 나오는 것을 흔히 볼 수 있으며 이 모든 것은 지극히 정상적인 현상입니다. 각각의 추첨은 철저히 독립적입니다. 이전의 선택은 이후의 선택에 전혀 영향을 미치지 않으며, 누군가가 당첨될 "차례"라는 것은 결코 존재하지 않습니다. 이와 다르게 믿도록 강요하는 인간의 본능을 gambler's fallacy(도박사의 오류)라고 부르며, 우리가 스스로 무작위 선택을 잘하지 못하는 이유도 바로 이 본능 때문입니다. 무작위로 고르라는 요청을 받으면 우리는 첫 번째와 마지막 항목을 피하고, 이름이 반복되는 것을 꺼리며, 실제 우연이 만들어내는 것보다 훨씬 더 고르게 선택을 분산시킵니다. 의심스러울 정도로 너무 깔끔해 보이는 결과는 언제나 인간이 개입한 흔적입니다. 진정한 무작위성은 반드시 뭉침과 반복을 만들어내기 때문입니다.
왜 이 무작위 추첨기를 선택해야 할까요?
- 브라우저 내 추출: 목록은 사용자의 기기에서 읽히며 외부로 전송되지 않습니다
- Web Crypto API 난수: Math.random()이 아닌 암호학적으로 안전한 방식을 사용합니다
- modulo bias 제거: rejection sampling을 통해 모든 항목이 정확히 동일한 확률을 갖습니다
- 모든 형태의 목록 지원: 한 줄, 쉼표, 공백 등으로 된 목록을 수정 없이 바로 사용합니다
- "중복 제외" 모드: 아무도 두 번 뽑히지 않게 당첨자나 팀을 추첨합니다
- 최대 1000개의 항목 입력, 한 번의 추첨에서 최대 100개의 결과 생성 가능
- 기본 제공 목록 도구: 파일에서 로드, 섞기, 정렬, 지우기, 샘플 데이터
- 기록 및 파일로 저장: 나중에 증명해야 할 상황을 위해 추첨 내역을 보관합니다
- 무제한 무료 사용: 가입 및 사용 횟수 제한이 없으며 서버에 데이터가 남지 않습니다
무작위 선택은 나중에 그 결정에 대한 의문이 제기되더라도 이를 방어할 수 있어야 하는 모든 상황에서 사용됩니다. 교사는 편애 없이 학생을 지목하고 학급을 수행평가 조로 나눕니다. 스트리머와 마케터는 결과를 믿어야 하는 시청자 앞에서 경품 이벤트나 추첨 행사 당첨자를 추첨합니다. 관리자는 아무도 자원하지 않는 업무를 배분하고, 팀은 프레젠테이션 순서나 온콜 당번을 정합니다. 연구자는 감사를 위해 기록의 무작위 표본을 추출합니다. 가족은 어떤 영화를 볼지에 대한 논쟁을 끝내고, 배고픈 친구들은 고깃집에 갈지 식당에 갈지 고릅니다. 이 모든 시나리오의 공통점은 나중에 누구에게나 설명할 수 있는 선택이라는 것입니다. 이 추첨은 암호학적 난수를 사용하고 모든 과정이 사용자의 기기에서만 이루어지며, 나중에 누군가 결과를 묻더라도 "기록"에 해당 내용이 안전하게 보관되어 있습니다.
이 도구가 지닌 몇 가지 정직한 한계는 알아둘 가치가 있습니다. 이 추첨기는 목록에 있는 항목의 수보다 더 많은 중복되지 않는 결과를 뽑을 수 없습니다(3명의 당첨자를 뽑으려면 최소 3개의 이름이 필요합니다). 또한 최대 200자로 이루어진 1000개의 항목으로 제한되며, 한 번의 추첨에서 최대 100개까지만 선택할 수 있습니다. "섞기"와 "정렬" 버튼은 줄 단위로 작동하므로, 한 줄에 쉼표로 구분하여 붙여넣은 목록은 각 항목이 새 줄로 나뉜 후에야 순서가 재배열됩니다. 그리고 이 두 버튼은 추출 방식이 아닌 상자 안의 항목을 재배열하는 기능일 뿐이며, 추첨은 항목의 순서에 상관없이 똑같이 공정하게 이루어집니다. 더불어 모든 항목은 설계상 정확히 동일한 가중치를 가지므로, 만약 추첨에서 두 배로 계산되어야 하는 이름이 있다면 해당 이름을 목록에 두 번 적어야 합니다. 이러한 한계 내에서 보장되는 원칙은 매우 강력합니다. 목록의 모든 항목은 매번 이루어지는 각각의 추첨에서 항상 정확히 동일한 확률을 갖는다는 것입니다.