랜덤 숫자 도구에서 중요한 것은 ‘다음 추첨에서 무엇을 다시 뽑을 수 있는가’와 ‘잘못된 입력을 어떻게 안내하는가’입니다. 2026년 9월 20일 점검에서는 중복을 허용해도 후보보다 많은 숫자를 뽑지 못하는 오류와 큰 범위를 검사 전에 펼치는 문제를 발견했습니다. 이 글은 두 문제의 수정 방식과 입력·기록 동작을 검증한 개발 기록입니다.

후보 2개에서 중복을 허용해 5개 뽑기

범위가 1~5이고 제외 입력이 2, 3~4이면 남은 후보는 1과 5입니다. 기존 코드는 중복 옵션과 관계없이 ‘후보 수 ≥ 추첨 개수’를 요구했습니다. 하지만 중복을 허용하면 같은 숫자를 여러 번 선택할 수 있으므로 후보 두 개에서 다섯 번 뽑는 것도 가능합니다.

수정한 검사는 두 단계입니다. 후보가 하나도 없으면 항상 중단하고, 중복 제외를 켠 경우에만 남은 후보 수와 요청 개수를 비교합니다. 입력 검사를 통과한 뒤에만 결과와 기록을 바꾸므로 실패한 요청이 후보를 소모하지 않습니다.

범위·제외 조건 개수·중복 설정 확인한 동작
1~5, 제외 2, 3~4 5개, 중복 허용 1 또는 5를 총 5개 추첨
같은 조건 3개, 중복 제외 후보 부족 안내, 추첨하지 않음
같은 조건 2개, 중복 제외 1과 5를 한 번씩 추첨
바로 다시 같은 조건 실행 2개, 중복 제외 이미 두 숫자를 사용해 후보 없음 안내
기록 지우기 후 재실행 2개, 중복 제외 1과 5가 다시 후보가 됨

실제 페이지 스크립트의 버튼 처리 함수를 Node 테스트에서 실행했습니다. 첫 사례는 난수를 0으로 고정했을 때 1, 1, 1, 1, 1, 합계 5가 나왔습니다. 이는 동작을 반복 검증하기 위한 조건이며 실제 서비스의 난수를 고정한 것은 아닙니다. 일반 추첨의 순서와 결과는 달라질 수 있습니다.

큰 입력은 계산을 시작하기 전에 검사하기

기존 구현은 후보 배열과 제외 집합을 먼저 만든 뒤 입력을 검사했습니다. 큰 범위를 입력하면 안내를 표시하기 전에 반복문이 오래 실행될 수 있었습니다. 수정 후에는 아래 한도를 먼저 검사합니다.

항목 허용 범위
최소·최대 숫자 -1,000,000,000~1,000,000,000 사이 정수
제외 전 추첨 범위 양 끝을 포함해 최대 100,000개 정수
한 번에 뽑을 개수 1~1,000개 정수
제외 입력 최대 10,000자, 쉼표로 구분한 정수 또는 10~20 형식

1~100,000은 허용하지만 0~100,000은 정수 100,001개가 들어 있어 거절합니다. 소수나 2x, 1~2~3처럼 잘못된 제외 입력은 일부만 숫자로 해석하지 않고 오류를 안내합니다. 추첨 개수는 직접 입력할 수 있으며 ‘여러 개 뽑기’를 끄면 한 개만 뽑습니다.

제외 구간은 추첨 범위와 겹치는 부분만 남기고, 겹친 구간을 합친 뒤 처리합니다. 예를 들어 범위 -2~2에 제외 -1000000000~-1, 2~1을 입력하면 0만 남습니다. 거꾸로 적은 2~1도 1~2를 제외하는 의미로 처리하며, 10억 개의 제외 숫자를 먼저 펼치지 않습니다.

회귀 테스트에서는 범위 안 정수 100,000개에서 중복 없이 1,000개를 추첨해 개수·중복·합계를 확인했습니다. 이 결과가 모든 휴대전화의 처리 시간을 보증하는 것은 아닙니다. 장시간 누적한 기록의 성능은 별도 점검 대상입니다.

이번 추첨과 다음 추첨의 중복 관리

후보 배열은 한 번 만들고 재사용합니다. 중복 제외 상태에서 숫자를 선택하면 해당 항목을 배열의 마지막 값으로 교체하고 마지막 항목을 제거합니다. 이후 선택에는 방금 나온 숫자가 포함되지 않습니다. 매번 전체 범위를 다시 만드는 작업도 줄였습니다.

다음 추첨을 위한 사용 숫자는 usedNumbers 집합에 보관합니다. 중복 제외를 켠 상태에서 나온 숫자만 이 집합에 추가합니다. 중복 허용 상태에서 나온 결과까지 소급해 제외하지는 않습니다.

동작 사용 숫자와 기록의 변화
범위만 변경 사용 숫자는 유지되며, 새 범위와 겹치는 숫자는 계속 제외
기록 안 함 결과 기록을 추가하지 않지만 중복 제외용 숫자는 유지
기록 지우기 기록과 사용 숫자를 함께 비워 이전 숫자를 다시 추첨 가능
전체 초기화 입력 조건·결과 화면·기록·사용 숫자 초기화
새로고침 현재 페이지 메모리의 기록·사용 숫자 소멸

‘기록 지우기’가 화면만 비우는 동작으로 오해되지 않도록 안내를 고쳤습니다. 화면의 회차도 ‘기록된 회차’로 표시합니다. 기록 안 함 모드에서의 버튼 실행 횟수와는 다른 값입니다.

검증 범위와 난수의 한계

추첨 개수 입력, 중복 옵션 변경, 후보 부족, 잘못된 숫자, 큰 제외 구간, 기록 지우기와 초기화까지 11개 회귀 테스트로 확인했습니다. 0~0 범위의 표시 효과에서 0 외의 숫자가 잠시 나타나던 처리도 수정했습니다. 함수 테스트는 화면 배치나 모든 모바일 환경 검사를 대신하지 않습니다.

숫자 선택에는 Math.random()을 사용합니다. 입력 검사를 고쳤다고 암호학적으로 안전한 난수나 외부 감사 기능이 생기는 것은 아닙니다. 이 도구는 일반적인 순서 정하기와 임의 선택을 위한 것이며, 결과 조작 불가능성이나 공식 추첨 인증을 보증하지 않습니다. MDN의 난수 API 구분

랜덤 도구 디자인 개편 당시 사용한 화면

위 이미지는 이전 디자인 개편 기록입니다. 현재 입력 한도와 개수 직접 입력 기능은 이 글의 설명 및 실제 도구 화면을 기준으로 확인할 수 있습니다.

직접 사용할 수 있는 랜덤 숫자 뽑기와 직전 결과를 일정 횟수 재시도하는 골프 벌칙 구현은 중복 처리 방식이 다릅니다. 도구별로 후보가 만들어지고 초기화되는 규칙을 확인하면 원하는 추첨 조건을 설정하기 쉽습니다.