빠르고 공정하게 난수를 얻는 방법이 필요하신가요? 이 무료 온라인 난수 생성기는 원하는 범위에서 숫자 하나 — 또는 숫자 전체 목록 — 를 생성합니다. 1부터 10까지의 간단한 범위부터 수십억에 이르는 범위까지 모두 가능합니다. "최소"와 "최대"에 최솟값과 최댓값을 설정하고, "생성 개수"로 필요한 숫자 개수를 정한 후 "결과 생성"을 누르세요. 두 경계 모두 결과에 포함되므로 1에서 10까지의 범위는 1과 10 모두를 생성할 수 있습니다.
모든 결과는 Web Crypto API(crypto.getRandomValues)를 사용하여 브라우저에서 직접 생성됩니다 — 이는 운영체제에서 제공하는 암호학적으로 안전한 무작위성 소스를 사용해 값을 생성합니다. 서버로는 아무것도 전송되지 않고, 서버에 어떠한 기록도 남지 않으며, 저희는 사용자의 숫자를 절대 볼 수 없습니다. 생성은 즉각적이고 비공개이며, 페이지가 로드된 후에는 느린 연결에서도 계속 작동합니다.
이 옵션들은 실제로 난수가 필요한 상황을 위해 만들어졌습니다. "중복 제외"를 켜면 어떤 숫자도 두 번 나오지 않습니다 — 추첨이나 경품 선정, 또는 중복 없이 사람들을 그룹으로 나눌 때 필요한 설정입니다. 500명의 참가자 중 20명의 당첨자가 필요하신가요? "최소"를 1로, "최대"를 500으로 설정하고, "중복 제외"를 켜고, "생성 개수"를 20으로 설정한 후 "결과 생성"을 누르세요. "정렬 순서"는 결과를 오름차순 또는 내림차순으로 정렬하며, 버튼 하나로 모든 결과를 한 번에 복사할 수 있습니다. "결과 형식"을 "줄바꿈"에서 "공백으로 구분" 또는 "쉼표로 구분"으로 바꾸면 "세트 수"가 나타납니다: 한 번의 클릭으로 여러 개의 독립적인 추첨을 생성합니다 — 예를 들어 20번의 추첨 라운드를 위한 3개 숫자로 이루어진 20개 세트 — 그리고 "세트 간 중복 허용"은 같은 숫자가 여러 세트에 나타날 수 있는지를 결정합니다.
이 무작위성은 실제로 어떻게 생성될까요? 브라우저는 Math.random() 같은 JavaScript PRNG 대신 Web Crypto API를 통해 암호학적으로 안전한 무작위 값을 제공합니다. "결과 생성"을 누르면, 페이지가 crypto.getRandomValues로 무작위 값을 요청하고, 이를 사용해 선택한 범위 내의 숫자를 생성합니다. 이 무작위성은 운영체제에서 제공하는 암호학적으로 안전한 무작위성 소스를 기반으로 하므로, 페이지는 자체적인 시드(seed)나 의사 난수 시퀀스를 유지할 필요가 없습니다.
원시 값을 범위에 매핑하는 과정은 생성기들이 조용히 실수를 저지르는 지점이며, 이는 별도로 한 단락을 할애할 가치가 있습니다. 값을 범위 크기로 모듈로 연산하는 것은 가장 간단한 방법처럼 보이지만, 바로 그 방법이 편향된 것입니다: 범위 크기가 2^32를 정확히 나눌 수 없다면, 가장 작은 일부 숫자가 다른 숫자보다 약간 더 자주 나타납니다. 이 결함은 모듈로 편향(modulo bias)이라고 불리며, 이는 이론적인 것이 아니라 측정 가능한 것입니다. 대신 이 생성기는 범위의 가장 큰 정확한 배수를 넘어서는 값을 모두 버리고 새로운 값을 다시 뽑습니다 — 이 기법을 거부 샘플링(rejection sampling)이라고 합니다. 이는 몇 번의 추가 시도가 필요하지만, 그 대가로 정확한 보장을 얻습니다: "최소"와 "최대" 사이의 모든 숫자는 거의 같은 것이 아니라 정확히 동일한 확률을 가집니다.
무엇이 숫자를 진짜로 무작위로 만들까요? 이전 결과가 다음 결과에 대해 아무것도 알려주지 않을 때 숫자는 충분히 무작위입니다 — 그리고 실제로는 여기에 세 가지 수준이 있습니다. Math.random() 같은 일반적인 의사 난수 함수는 결정론적(deterministic) 알고리즘을 실행합니다: 내부 상태를 아는 사람은 누구나 전체 시퀀스를 재현할 수 있습니다 — 이는 프레젠테이션 슬라이드를 섞는 데는 괜찮지만, 결과를 예측할 수 없어야 하는 어떤 작업에도 적합하지 않습니다. 이 도구가 사용하는 암호학적으로 안전한 생성기 역시 알고리즘이지만, 안전한 시스템 무작위성 소스를 사용해 예측할 수 없는 값을 생성하며, 기존 출력만으로 다음 값을 실제로 예측하기 어렵도록 설계되었습니다. 대기 잡음이나 방사성 붕괴 같은 소스에서 나오는 물리적 무작위성은 이 두 가지와는 다른 별개의 범주이지만, 범위 내에서 숫자 하나를 뽑는 데는 실질적인 차이가 사라집니다. 바로 이것이 브라우저가 Math.random()을 개선하는 대신 별도의 crypto API를 제공하는 이유입니다: 둘은 서로 다른 문제를 해결하며, 결과가 누군가에게 중요할 때는 둘 중 하나만이 안전합니다.
실제로 무작위인 시퀀스는 인간의 눈에 무작위로 보이도록 설계되지 않았습니다. 1에서 10 사이의 숫자 열 개를 뽑아보면, 반복이나 7, 7, 8 같은 가까운 쌍, 또는 높은 숫자가 연속으로 나오는 짧은 구간을 자주 보게 될 것입니다 — 이 모든 것은 정상입니다. 진짜 무작위성은 예측할 수 있는 패턴이 없는 것이지, 눈에 고르게 보이는 것이 아닙니다: 각 추첨은 독립적이며, 이전 숫자는 이후 숫자에 전혀 영향을 미치지 않고, 어떤 숫자도 "차례"가 오는 법이 없습니다. 이와 반대로 생각하는 본능을 도박사의 오류(gambler's fallacy)라고 부르며, 바로 이 본능이 인간을 형편없는 난수 생성기로 만들기도 합니다 — 무작위 시퀀스를 직접 만들어보라고 하면, 우리는 반복을 피하고 실제 확률이 만들어내는 것보다 훨씬 더 고르게 값을 퍼뜨립니다. 의심스러울 정도로 깔끔해 보이는 결과는 인위적인 흔적이며, 진짜 무작위성은 오히려 덩어리를 만들어냅니다.
왜 이 난수 생성기를 선택해야 할까요?
- 브라우저 내에서만 생성: 숫자는 사용자의 기기에서 생성되며 어디로도 전송되지 않습니다
- Web Crypto API 기반 무작위성: 암호학적으로 안전, Math.random() 아님
- 모듈로 편향 없음: 거부 샘플링이 범위 내 모든 숫자의 확률을 동일하게 유지합니다
- 모든 범위: 1부터 10까지, 수십억에 이르는 값까지, 두 경계 모두 포함
- "중복 제외" 모드: 추첨과 그룹 분배를 위한 중복 없는 목록 생성
- 여러 세트: 한 번의 클릭으로 여러 개의 독립적인 추첨
- 정렬 및 결과 형식: 오름차순 또는 내림차순, 줄바꿈, 공백, 또는 쉼표
- 기록 및 파일로 저장: 나중에 소명이 필요할 수도 있는 추첨 기록 보관
- 무제한 무료: 가입 불필요, 사용 제한 없음, 저희 서버에는 아무것도 남지 않음
난수는 대부분의 사람이 생각하는 것보다 훨씬 더 많은 곳에서 사용됩니다. 교사는 편애 없이 학생을 지목합니다. 스트리머와 마케팅 팀은 결과를 믿어야 하는 시청자들 앞에서 경품 이벤트와 추첨 당첨자를 뽑습니다. 플레이어는 잃어버린 주사위를 대신하거나 누가 먼저 할지를 정하며, 토너먼트는 출전 순서를 추첨합니다. 연구자는 무작위 표본을 선택해 연구 결과가 자원한 사람들을 넘어 더 넓게 적용되도록 합니다. 개발자는 테스트 데이터를 생성하고, 시뮬레이션을 위한 시드를 설정하며, QA 과정에서 식별자를 선택합니다. 이 모든 것의 공통점은 나중에 설명할 수 있는 무작위 선택 과정이라는 점입니다: 추첨이 암호학적 무작위성을 사용하고 전적으로 사용자의 기기에서 이루어지기 때문에, 누군가 의문을 제기하더라도 추첨 과정이 어떻게 진행되었는지 설명하고 기록할 수 있습니다.
이 생성기에는 알아두어야 할 몇 가지 현실적인 한계가 있습니다. "중복 제외" 모드는 범위에 있는 것보다 더 많은 숫자를 생성할 수 없습니다: 1과 10 사이에 20개의 고유한 값은 애초에 존재하지 않습니다. 추첨은 독립적이며 이전 결과가 이후 결과에 영향을 미치지 않으므로, 페이지를 새로고침해도 어떤 주기도 재설정되지 않습니다 — 애초에 여기에는 주기가 없기 때문입니다. 그리고 숫자가 암호학적으로 안전하더라도, 여기서의 추첨은 예측이 아니라 공정한 선택입니다: 공식 복권 추첨은 자체적인 물리적 또는 공인된 장비를 사용하며, 브라우저에서 계산된 그 어떤 것도 이와는 아무런 관련이 없습니다. 이러한 한계 안에서 보장은 매우 확고합니다 — 범위 내의 모든 숫자는 매 추첨마다 정확히 동일한 확률을 가집니다.