🎲 난수 생성기 (랜덤 숫자 뽑기)
최소·최대 범위에서 랜덤 숫자를 원하는 개수만큼 뽑아요. 중복 허용 여부와 정렬을 고를 수 있어요.
사용법
- 최소값과 최대값을 넣어요. 둘 다 결과에 포함돼요(예: 1~10이면 1과 10도 나와요). 음수도 쓸 수 있어요.
- 개수를 정하고, 중복을 허용할지 고르세요. "중복 없음"은 같은 숫자가 두 번 나오지 않아요. 추첨·번호 뽑기에 알맞아요. 개수가 범위의 숫자 개수보다 많으면 중복 없이 뽑을 수 없어요.
- 정렬(뽑힌 순서 / 작은 순 / 큰 순)을 고르고 뽑기를 누르세요. 다시 누르면 새로 뽑아요. 프리셋 버튼(로또 6/45, 주사위, 1~100 등)으로 바로 설정할 수도 있어요.
어떻게 무작위로 뽑나요
브라우저의 암호학적 난수 생성기(crypto.getRandomValues)로 뽑아요. 일반적으로 쓰는 Math.random보다 예측하기 어려워요. 또 "난수를 범위 크기로 나눈 나머지"를 그대로 쓰면 범위가 2의 거듭제곱이 아닐 때 특정 숫자가 조금 더 자주 나오는 편향이 생기는데, 이 도구는 범위를 넘는 값은 버리고 다시 뽑는 거절 샘플링을 써서 모든 숫자가 같은 확률로 나오게 했어요. 중복 없이 뽑을 때는 Fisher-Yates 섞기 방식으로 뽑아서, 범위가 아주 커도(예: 1~10억) 필요한 개수만큼만 계산해요.
검산도 했어요. 주사위(1~6)를 12만 번 굴려 각 면이 이론값 20,000번에서 ±4% 안에 들어오는지, 중복 불허로 1~10에서 10개를 뽑으면 1~10이 한 번씩 나오는지 확인했어요.
확률 예시 (직접 계산)
| 상황 | 확률 | 계산 |
|---|---|---|
| 1~6 주사위에서 특정 숫자 하나 | 약 16.7% | 1 ÷ 6 |
| 1~100에서 특정 숫자 하나 | 1% | 1 ÷ 100 |
| 1~10에서 3개 중복 없이 뽑을 때 특정 숫자가 포함될 확률 | 30% | 3 ÷ 10 |
| 로또 6/45 한 조합이 1등 번호와 일치 | 1 ÷ 8,145,060 | 45C6 = 8,145,060 |
| 동전 던지기 연속 3번 앞면 | 12.5% | (1 ÷ 2)³ |
같은 숫자가 연달아 나오거나 규칙처럼 보이는 배열이 나와도 정상이에요. 진짜 무작위 열에서도 우연히 패턴처럼 보이는 일이 흔해요. 이전에 나온 숫자는 다음 결과에 영향을 주지 않아요(독립 시행).
어디에 쓰나요
- 추첨·당첨자 뽑기: 참가자에게 번호를 붙이고 1~참가자 수 범위에서 "중복 없음"으로 당첨 인원만큼 뽑아요. 결과 화면을 캡처해 두면 공정성을 설명하기 쉬워요.
- 순서 정하기: 발표 순서나 청소 당번처럼 전원의 순서를 정할 때는 인원수만큼 중복 없이 뽑아 순서대로 배정해요.
- 로또 번호: 1~45에서 6개를 중복 없이 뽑고 작은 순으로 정렬하면 로또 용지에 적기 편해요. 당첨 확률은 어떤 번호든 같아요. 로또 전용 화면은 로또 번호 생성기가 있어요.
- 게임·테스트 데이터: 보드게임 주사위, 퀴즈 번호, 프로그램 테스트용 임의 값이 필요할 때 써요.
- 이름 뽑기: 숫자가 아니라 이름 목록에서 뽑으려면 랜덤 뽑기가 편해요.
상황별 추천 설정
| 하고 싶은 일 | 최소~최대 | 개수 | 중복 |
|---|---|---|---|
| 반 학생 30명 중 발표자 3명 뽑기 | 1~30 | 3 | 중복 없음 |
| 발표 순서 전체 정하기 (8명) | 1~8 | 8 | 중복 없음 (뽑힌 순서 유지) |
| 주사위 한 번 굴리기 | 1~6 | 1 | 상관없음 |
| 주사위 두 개 합 구하기 | 1~6 | 2 | 중복 허용 |
| 4자리 임의 숫자(예: 인증번호 연습) | 0~9 | 4 | 중복 허용 |
| 사다리 타기 도착 번호 배정 | 1~인원수 | 인원수 | 중복 없음 |
주사위 두 개 합처럼 중복을 허용하면 같은 눈이 둘 다 나올 수 있어요. 이때 합계는 결과 아래 표에 바로 나와요. 인증번호처럼 보안이 필요한 값은 이 도구로 연습만 하고 실제 서비스에서는 서버에서 만드세요.
공정한 추첨을 진행하는 순서
- 참가자 명단에 번호를 먼저 확정하고 모두에게 공개해요. 뽑은 뒤에 번호를 바꾸면 분쟁이 생겨요.
- 당첨 인원과 중복 여부(한 사람이 두 번 당첨될 수 있는지)를 미리 정해요. 한 사람이 한 번만 당첨되어야 하면 "중복 없음"이에요.
- 모두가 보는 앞에서 뽑아요. 화면 공유나 캡처로 범위, 개수, 결과가 한 화면에 보이도록 남기면 설명하기 쉬워요.
- 예비 당첨자가 필요하면 처음부터 "당첨 인원 + 예비 인원"만큼 뽑아 앞에서부터 순서를 매겨요. 다시 뽑는 방식은 분쟁이 생기기 쉬워요.
코드로 같은 걸 만들려면
웹 개발자라면 같은 방식을 직접 만들 수 있어요. 정수 하나를 균등하게 뽑는 가장 간단한 방법은 Math.random을 쓰는 거예요.
// min~max 포함 정수 1개
const r = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
r(1, 6);
위 코드는 연습·게임용으로 충분해요. 보안이 필요하면 crypto.getRandomValues를 쓰고 거절 샘플링으로 편향을 없애야 해요. 중복 없는 N개 뽑기는 배열을 만들어 Fisher-Yates로 섞은 뒤 앞에서 N개를 가져가는 방식이 정석이고, 범위가 아주 큰 경우에는 이 도구처럼 바뀐 자리만 Map에 기록하는 방식이 메모리를 아껴요. 파이썬은 random.sample(range(1, 46), 6)이 중복 없는 6개를 뽑아 줘요. 암호용은 secrets 모듈을 쓰세요.
랜덤에 대한 흔한 오해
- "아직 안 나왔으니 이제 나올 차례": 도박사의 오류라고 불러요. 독립 시행이라 앞 결과는 다음 확률에 영향이 없어요. 주사위에서 6이 열 번 안 나왔어도 다음에 6이 나올 확률은 여전히 6분의 1이에요.
- "고르게 섞여 보이는 게 진짜 랜덤": 실제 무작위는 같은 숫자가 몰려 나오는 구간도 자주 생겨요. 오히려 너무 골고루 나오면 사람이 손으로 만든 배열일 가능성이 커요.
- "번호를 직접 고르면 당첨 확률이 다르다": 로또처럼 번호를 맞추는 추첨은 어떤 조합이든 확률이 같아요. 다만 많은 사람이 고르는 번호(생일 등)는 당첨 시 나눠 갖는 사람이 많을 수 있어요.
- "뽑는 횟수가 많으면 각 숫자가 정확히 같은 횟수 나온다": 횟수가 많을수록 비율은 이론값에 가까워지지만(큰수의 법칙) 횟수 자체가 정확히 같아지는 건 아니에요. 12만 번 주사위를 굴려도 면마다 몇백 번 차이는 정상이에요.
큰 수의 법칙을 직접 확인해 보기
주사위 프리셋(1~6)에서 개수를 100, 1,000으로 바꿔 가며 뽑고 평균을 보세요. 이론상 평균은 (1+2+3+4+5+6) ÷ 6 = 3.5예요. 10개만 뽑으면 평균이 3.0이나 4.2처럼 크게 흔들리지만, 1,000개를 뽑으면 대체로 3.4~3.6 사이에 들어와요. 표본이 커질수록 평균의 흔들림이 줄어드는 것을 통계에서 큰 수의 법칙이라고 해요. 같은 방식으로 1~100에서 1,000개를 뽑으면 평균이 50 근처로 모이고, 1~10에서 뽑으면 5.5 근처로 모여요. 학교 수업의 통계 실습이나 간단한 시뮬레이션에서 표본을 빠르게 만들 때 활용하세요. 같은 설정으로 여러 번 뽑아 결과가 매번 달라지는지 확인해 보는 것도 난수가 제대로 작동하는지 이해하는 좋은 방법이에요. 결과는 새로고침해도 다시 뽑히니 필요한 값은 미리 복사해 두세요. 합계와 평균은 결과 아래 줄에 바로 나오고, "복사용" 줄의 값을 그대로 복사해 스프레드시트에 붙여 넣을 수 있어요. 더 자세한 분산·표준편차는 표준편차 계산기에 붙여 넣어 구하면 돼요.
주의할 점
이 도구의 결과는 브라우저 안에서만 만들어지고 서버로 보내지 않아요. 다만 보안용 값(비밀번호, 토큰, 암호 키)을 만들 때는 숫자만 뽑기보다 비밀번호 생성기처럼 목적에 맞는 도구를 쓰세요. 금전이 걸린 추첨은 법과 약관에 맞는 절차와 기록이 필요해요. 이 도구는 참고용이라 공식 추첨 증빙으로 쓰기에는 부족할 수 있어요.
범위를 크게 잡으면(1~10억) 숫자가 길어지니 화면에 줄바꿈으로 보여 줘요. 한 번에 뽑을 수 있는 개수는 1,000개까지로 제한했고, 합계와 평균을 같이 보여 주니 통계 연습용 표본 데이터로도 쓸 수 있어요. 범위 안에서 균등하게 뽑으므로 평균은 범위의 중간값(최소+최대의 반)에 가까워지고, 뽑는 개수가 많을수록 더 가까워져요. 예를 들어 1~100에서 1,000개를 뽑으면 평균이 대체로 50 근처로 나와요.
난수는 브라우저의 crypto.getRandomValues로 만들어요. 로또 등 복권은 어떤 번호든 당첨 확률이 같아요. 입력값은 이 브라우저 밖으로 나가지 않아요.