유틸리티

랜덤 숫자 뽑기, 공정한 추첨과 무작위 번호 생성하는 법

회식 장소를 정할 때 "1번부터 5번까지 중에 골라"라고 하면, 결국 목소리 큰 사람 의견대로 된다. 팀 프로젝트 발표 순서, 경품 추첨, 자리 배정까지, 공정하게 뽑아야 하는 순간은 생각보다 자주 온다.

랜덤 숫자가 필요한 상황

  • 순서 정하기: 발표 순서, 당번, 조 편성 등을 무작위로 배정
  • 추첨/제비뽑기: 경품 당첨자, 이벤트 참가자 중 랜덤 선정
  • 게임: 주사위 굴리기, 동전 던지기, 랜덤 미션 뽑기
  • 로또 번호: 1~45 사이 중복 없는 6개 숫자 생성
  • 테스트 데이터: 개발 시 무작위 샘플 숫자가 필요할 때

사람이 고른 숫자는 랜덤이 아니다

"아무 숫자나 하나 말해봐"라고 하면 7이나 3을 고르는 사람이 유독 많다. 사람은 심리적 편향 때문에 진짜 무작위를 만들지 못한다. 짝수보다 홀수를, 큰 수보다 작은 수를 선호하는 경향이 있고, 직전에 나온 숫자를 피하려는 습성도 있다.

공정한 결과가 필요하면 컴퓨터의 난수 생성기를 쓰는 게 맞다. 암호학적 난수 알고리즘은 패턴이 없기 때문에 예측이 불가능하다.

참고 프로그래밍에서 Math.random()은 의사 난수(pseudo-random)라 보안 용도에는 부적합하다. 추첨처럼 공정성이 중요한 경우에는 crypto.getRandomValues() 같은 암호학적 난수를 쓰는 게 안전하다.

랜덤 숫자 생성하는 법

범위, 개수, 중복 허용 여부까지 설정할 수 있는 랜덤 숫자 생성기를 쓰면 클릭 한 번으로 결과가 나온다. 1~45 중복 없는 6개(로또), 1~6 하나(주사위), 1~100 사이 정수 10개 같은 조건을 프리셋으로 바로 선택할 수도 있다. 결과에 최솟값, 최댓값, 평균, 합계 통계까지 표시되니 데이터 샘플링 용도로도 쓸 만하다.

공정한 추첨이든 단순한 숫자 뽑기든, 사람 손을 거치지 않는 게 가장 깔끔하다.