June Kim's Web Apps
명단 추첨기
명단을 줄마다 한 명씩 붙여 넣고, 몇 명을 뽑을지 정한 뒤 뽑기를 누르세요. 같은 사람이 두 번 뽑히지 않고, 누구에게나 같은 확률로 뽑습니다.
명단을 넣고 뽑기를 누르면 여기에 결과가 나옵니다.
명단은 서버로 보내지 않고 브라우저 안에서만 추첨합니다. 명단은 다음에 쓰도록 이 브라우저에만 남습니다.
공정하게 뽑는 방법
- 난수는
Math.random이 아니라 브라우저의 암호용 난수 crypto.getRandomValues에서 받습니다.
- 치우침 없음: 32비트 난수를 사람 수로 나눈 나머지를 쓰면 앞 번호가 아주 조금 유리해집니다. 나눠떨어지지 않는 끝 구간의 값은 버리고 다시 받아 모두 같은 확률로 만듭니다.
- 중복 없이: 뽑힌 사람은 그 회차에서 빠지고 남은 사람 중에서 다음 사람을 고릅니다(Fisher–Yates). 번호는 뽑힌 차례입니다.
- 뽑힌 사람 빼고 다시 뽑기는 1등, 2등처럼 여러 번 나눠 뽑을 때 씁니다. 처음부터를 누르면 뺀 사람이 모두 돌아옵니다. 연출은 보여 주기만 하고 결과는 누르는 순간 정해집니다.