룰렛 돌리기
당첨자는 휠이 움직이기 전에 crypto.getRandomValues로 뽑히고, 애니메이션은 그 조각을 향해 멈춥니다. 돌리는 방식이 결과를 바꿀 수 없으며 모든 항목의 확률은 완전히 같습니다. 같은 이름을 여러 줄에 적으면 그만큼 조각이 늘어납니다.
입력한 내용은 저장, 기록, 공유되지 않습니다.
이름이나 숫자 목록을 붙여넣고 룰렛을 돌려 하나를 무작위로 뽑으세요. 당첨자는 룰렛이 움직이기 전에 정해지므로 애니메이션이 결과에 영향을 줄 수 없습니다.
사용 방법
- 항목을 한 줄에 하나씩 입력하거나 붙여넣으세요.
- 돌리기를 누르세요. 멈추면 당첨자가 발표됩니다.
- 당첨자를 제거하고 다시 돌리면 중복 없이 뽑을 수 있습니다.
돌림판이 움직이기 전에 당첨자가 정해지는 이유
연산 순서가 이 설계의 전부입니다. 먼저 브라우저의 암호학적 난수원에서 기각 샘플링으로 값을 뽑으므로 모든 항목의 확률이 정확히 같습니다. 그런 다음에야 최종 회전량을 계산합니다. 돌아가는 것처럼 보일 만큼의 바퀴 수에, 이미 당첨된 칸에 바늘이 멈추도록 하는 오프셋을 더한 값입니다.
뻔한 대안은 무작위 힘으로 돌림판을 돌리고 바늘 아래 멈춘 칸을 읽는 것입니다. 더 정직해 보이지만 덜 공정합니다. 결과가 애니메이션에 좌우되기 때문입니다. 이징 곡선, 프레임 속도, 물리 계산의 부동소수점 반올림, 백그라운드 탭에 대한 브라우저의 제한 같은 것들 말이죠. 이 중 어느 것도 균일하지 않고, 일부는 특정 칸을 꾸준히 유리하게 만듭니다. 느린 노트북에서 조금 다르게 도는 돌림판은 확률 분포가 조금 다른 돌림판입니다.
먼저 뽑으면 애니메이션은 순전히 장식이 되며, 그래야 마땅합니다. 돌아가는 모습을 지켜보든, 도는 도중에 페이지를 새로 고치든 결과는 같습니다.
가중치, 그리고 여러 명 뽑기
한 항목의 당첨 확률을 높이는 유일한 방법은 그 항목을 여러 번 적는 것입니다. 중복은 합치지 않고 그대로 두며 한 줄이 한 칸이 되므로, 열 개 목록에 세 번 나오는 이름은 열 칸 중 세 칸을 차지해 열 번에 세 번 당첨됩니다.
이는 의도된 것입니다. 설정 화면에 숨은 가중치 입력란은 지켜보는 누구에게도 보이지 않지만, 돌림판의 세 칸을 차지한 이름은 그 자리의 모두가 보고 셀 수 있습니다. 참가자들에게 공정해 보여야 하는 추첨이라면 가중치는 돌림판 위에 드러나 있어야 합니다.
중복 없이 여러 명을 뽑으려면 돌리고, 당첨자를 지우고, 다시 돌리세요. 지울 때마다 그 칸이 빠지므로 이후의 추첨은 남은 것에서 이루어집니다. 팀 나누기, 발표 순서 정하기, 순위가 있는 경품 정하기에 알맞은 방식입니다. 다시 뽑는 대신 지우면 돌림판이 눈에 띄게 줄어들어, 이것 역시 모두가 따라올 수 있습니다.
목록이 저장되는 곳
요청하지 않는 한 어디에도 저장되지 않습니다. 저장 상자에 체크하면 목록이 로컬 스토리지에 기록되는데, 이는 그 기기 한 대의 브라우저 안에 있는 사이트별 저장 공간입니다. 계정이 아니고, 동기화되지 않으며, 이 사이트나 다른 어디로도 전송되지 않습니다.
여기서 몇 가지가 따라옵니다. 노트북에 저장한 목록은 휴대폰에 없습니다. 브라우저 데이터를 지우면 사라집니다. 시크릿 창에서는 보이지 않고, 같은 컴퓨터의 다른 브라우저에서도 보이지 않습니다. 체크를 해제하면 즉시 지워집니다.
가입을 요구하지 않는 대신 치르는 대가입니다. 두 곳에서 같은 목록이 필요하다면 메모에 적어 두었다가 붙여 넣으세요.
돌림판이 맞지 않는 경우
수업 중 발표자 지목, 스탠드업 순서, 회고 진행, 식사 장소 고르기, 주최자를 이미 믿는 사람들 사이의 경품 추첨이라면 돌림판이 딱 맞습니다. 빠르고, 눈에 보이며, 누군가가 정하는 어색함을 없애 줍니다.
하지만 지켜보지 않은 사람이나 진행자를 의심할 이유가 있는 사람에게 결과를 증명해야 하는 경우에는 맞지 않습니다. 여기에는 증거를 만들어 내는 것이 없습니다. 공개된 시드도, 사전 약속도 없으며, 스크린숏은 스크린숏이 존재한다는 것만 증명합니다. 돈이나 법적 효력이 걸린 추첨에는 공개된 시드, 응모 마감 전의 약속, 독립적인 입회인 같은 문서화된 절차가 필요하며, 이는 전혀 다른 종류의 도구입니다.
눈에 보이는 추첨은 받아들이는 느낌을 바꾼다
혼자 정해서 발표하는 것과 모두가 지켜보는 앞에서 뽑는 것은 절차상 완전히 같지만, 받아들여지는 방식은 전혀 다릅니다. 절차적 공정성 연구는 과정이 공정하고 투명하다고 여겨질 때 사람들이 마음에 들지 않는 결과도 받아들인다는 사실을 일관되게 보여 줍니다. 눈에 보이는 무작위 추첨은 그 투명성을 마련하는 가장 값싼 방법입니다.
그래서 실제 무작위성이 핵심이 아닌 상황에서도 휠이 쓸모 있습니다. 회고에서 누가 먼저 말할지를 퍼실리테이터가 조작할까 봐 걱정하는 사람은 없습니다. 가치는 고르는 일의 어색함을 특정 개인에게서 떼어 내, 모두가 볼 수 있는 장치에 맡긴다는 데 있습니다.
같은 논리로, 다시 뽑는 것보다 당첨자를 빼고 휠을 줄이는 편이 더 잘 작동합니다. 당첨자를 제거해 남은 조각이 커지면 확률이 달라졌다는 사실과 어떻게 달라졌는지를 모두가 눈으로 확인할 수 있습니다. 처음과 똑같아 보이는 목록에서 한 번 더 뽑는 것보다 훨씬 받아들이기 쉽습니다.
휠이 제 몫을 하는 자리
교실에서 휠로 발표자를 지목하면 교사의 기억에 의존할 때보다 참여가 고르게 퍼지고, 지목당한 것이 곧 평가라는 인상도 사라집니다. 흔히 쓰는 보완책은 나온 이름을 그때그때 빼는 것입니다. 그러면 누군가 두 번째로 걸리기 전에 반 전체가 한 바퀴 돕니다.
스탠드업이나 회고에서는 연차가 아니라 추첨으로 발언 순서를 정할 수 있습니다. 매일 먼저 음소거를 푸는 사람이 늘 같은 사람인 분산 팀에서는 더욱 중요합니다. 퍼실리테이션 용도로는 무엇이 뜻밖이었는지, 무엇이 발목을 잡았는지 같은 질문을 휠에 담아 두면, 스프린트마다 똑같은 관찰 세 가지만 나오는 패턴을 깨뜨릴 수 있습니다.
업무 밖에서는 결정하는 비용보다 논의하는 비용이 더 큰 선택을 대신 처리해 줍니다. 어느 식당으로 갈지, 누가 먼저 할지, 똑같이 괜찮은 네 가지 중 무엇을 고를지. 휠이 당신보다 더 잘 고르는 것은 아닙니다. 대화를 끝내는 데 더 능할 뿐입니다.
그 자리에 없던 사람도 믿을 수 있는 추첨 만들기
돈이나 의무가 걸린 일이라면 화면 녹화는 아무것도 증명하지 못합니다. 결과를 보여 줄 뿐, 그 결과가 공정하게 정해졌음을 보여 주지는 않기 때문입니다. 표준적인 방법은 커밋 후 공개입니다. 응모를 마감하기 전에 응모자 목록과 비밀 시드를 합친 해시를 공개합니다. 추첨이 끝나면 목록과 시드를 공개해, 누구나 당첨자를 다시 계산하고 해시가 미리 약속한 값과 맞는지 확인할 수 있게 합니다.
시드 자체를 아무도 통제할 수 없고 나중에 누구나 검증할 수 있는 곳에서 가져올 수도 있습니다. 지정한 높이의 비트코인 블록 해시나 공개된 무작위성 비컨 같은 것입니다. 그러면 주최자가 마음에 드는 결과가 나올 때까지 시드를 바꿔 가며 돌려 볼 여지조차 사라집니다.
규제를 받는 경품 행사에서는 요구 사항을 정하는 것이 암호학이 아니라 법이며, 보통 절차의 문서화와 독립적인 입회가 뒤따릅니다. 이런 도구는 그 기준에 미치지 않는 추첨, 즉 거의 모든 추첨을 위한 것입니다.
이는 일반적인 설명일 뿐 법률 자문이 아닙니다. 해당 지역의 사행 행위나 소비자 보호 규정이 적용되는 판촉이라면 그 규정의 요구 사항이 우선합니다.
보이는 상태로 남는 가중치
여기서 어떤 항목의 당첨 확률을 높이는 유일한 방법은 그 항목을 여러 번 적는 것이고, 이는 빠진 기능이 아니라 의도한 제약입니다. 설정 패널의 가중치 입력란은 지켜보는 사람들에게 보이지 않지만, 열 조각 중 세 조각을 차지한 이름은 그 자리에서 셀 수 있습니다.
따져 보기도 더 쉽습니다. 열 중 셋은 30퍼센트이고, 휠의 30퍼센트가 눈에 그대로 보입니다. 가중치 1.0짜리 항목 옆의 가중치 3.0은 아무도 하지 않을 산수를 모두에게 강요하고, 그 산수가 당신이 생각하는 그것이라고 믿어 달라고 요구하는 셈입니다.
표를 산 수량이 제각각인 경품 추첨처럼 정말로 세밀한 가중치가 필요한 경우에도, 표 한 장에 한 줄인 목록이 여전히 정직한 표현입니다. 판매 데이터에서 그 목록을 만드는 일은 기능이 아니라 두 줄짜리 스크립트로 끝납니다.
애니메이션, 움직임 민감성, 그리고 결과 읽기
돌아가는 휠은 크게 움직이는 요소이고, 어떤 사람에게는 그것이 중립적인 장식이 아닙니다. 전정기관 질환이 있으면 계속되는 회전이 정말로 괴롭습니다. 운영체제가 움직임 줄이기 설정을 제공하는 이유이자, 인터페이스가 그 설정을 존중해야 하는 이유입니다.
당첨자는 애니메이션이 시작되기 전에 이미 뽑히므로 애니메이션은 표현일 뿐입니다. 줄이거나 건너뛰어도 결과는 전혀 달라지지 않습니다. 이것이 인터페이스의 모든 움직임이 갖춰야 할 성질입니다. 없애도 정보가 사라지지 않아야 한다는 것입니다.
결과는 바늘의 위치만이 아니라 텍스트로도 존재해야 합니다. 당첨자를 라이브 리전으로 알리면 스크린 리더가 읽어 주고, 잠깐 눈을 돌렸거나 늦게 합류한 사람, 휠의 라벨이 너무 작아 읽기 어려운 해상도로 공유 화면을 보는 사람에게도 결과가 전달됩니다.
자주 묻는 질문
- 이 추첨은 실제로 공정한가요?
- 네, 그리고 그 근거는 처리 순서에 있습니다. 당첨자는 먼저 브라우저의 암호학적으로 안전한 난수원인 crypto.getRandomValues에서 거부 샘플링으로 뽑히므로 어떤 항목도 유리해지지 않습니다. 그다음에야 그 조각에 멈추도록 회전 각도를 계산합니다. 많은 룰렛 도구는 반대로 애니메이션을 먼저 돌리고 바늘 아래 온 조각을 결과로 삼는데, 그러면 프레임 타이밍과 이징이 추첨의 일부가 됩니다.
- 특정 이름의 당첨 확률을 높일 수 있나요?
- 네. 같은 이름을 여러 줄에 쓰면 됩니다. 중복은 합쳐지지 않고 한 줄이 한 조각이 되므로, 열 줄 중 세 줄이 같은 이름이면 확률은 30%입니다. 이 도구가 제공하는 가중치는 이것뿐이며 의도적입니다. 설정 화면에 숨지 않고 룰렛 위에 그대로 보이기 때문입니다.
- 제 목록은 어디에 저장되나요?
- 체크박스를 켠 경우에만, 이 브라우저의 이 기기에만 저장됩니다. 로컬 스토리지에 보관되며 기기를 벗어나지 않고 이 사이트나 다른 누구에게도 전송되지 않습니다. 체크를 해제하면 즉시 지워지고, 브라우저 데이터를 삭제해도 사라집니다.
- 다른 기기에서도 목록이 보이나요?
- 아닙니다. 계정도 동기화도 없으므로 노트북에 저장한 목록이 휴대폰에 나타나지 않습니다. 가입을 요구하지 않고 데이터를 서버에 두지 않는 대가입니다.
- 중복 없이 여러 명을 뽑으려면 어떻게 하나요?
- 돌린 뒤 당첨자 제거를 누르고 다시 돌리세요. 제거할 때마다 해당 항목이 룰렛에서 빠지므로 다음 추첨은 남은 항목에서만 이루어집니다. 팀을 나누거나 순위별 경품을 정할 때 쓰는 일반적인 방법입니다.
- 항목은 몇 개까지 넣을 수 있나요?
- 최대 500개입니다. 약 40개를 넘으면 조각의 글자가 너무 작아 숨겨지지만, 룰렛은 그대로 돌아가고 당첨자도 온전히 표시됩니다.
마지막 업데이트:
진행 단계, 예상 결과, 실제 결과를 적어 주세요. 비밀 정보와 개인 정보는 삭제해 주세요.
