JavaScript / Math.random()으로 범위 내 랜덤 정수 만들기
Math.random()은 0 이상 1 미만의 의사 난수(무작위처럼 생성한 수)를 반환하는 메서드입니다. 특정 범위의 정수가 필요하면 범위 크기를 곱하고 Math.floor()로 내림한 뒤 최솟값을 더합니다. 암호, 인증 토큰 등 보안 목적의 난수에는 이 메서드를 사용하지 마세요.
반환 범위와 호출 방법
Math.random()은 인수가 없고 호출할 때마다 새로운 실수를 반환합니다. 0은 가능하지만 1은 반환하지 않습니다. 개발자가 표준 Math.random()의 시드를 지정하거나 재설정하는 기능은 없습니다.
const value = Math.random();
console.log(value >= 0 && value < 1); // true
결과는 실행할 때마다 달라지므로 예제의 특정 숫자를 정답으로 기대하지 마세요. MDN의 Math.random() 문서는 이 범위와 난수의 보안 한계를 설명합니다.
양 끝을 포함한 정수 범위 만들기
정수 min부터 max까지 모두 가능하게 하려면 범위 크기가 max - min + 1입니다. Math.random()에 이를 곱하면 0 이상 범위 크기 미만의 수가 되고, Math.floor()로 내린 뒤 min을 더합니다.
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(randomInteger(1, 6)); // 1~6 중 하나
예를 들어 주사위 범위는 min=1, max=6입니다. Math.round(Math.random() * 6)처럼 반올림하면 0이 나올 수 있고 양 끝 값의 확률도 달라집니다. 정수 범위의 최솟값·최댓값과 순서를 먼저 검증하세요.
전체 예제: 범위를 입력해 정수 뽑기
다음 코드를 random-integer.html로 저장해 브라우저에서 엽니다. 최솟값과 최댓값을 입력해 버튼을 누르면 해당 범위의 정수가 하나 표시됩니다. 실습에서 지나치게 큰 범위를 피하도록 1~1000의 정수만 허용합니다.
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>범위 안에서 정수 뽑기</title>
</head>
<body>
<label for="minimum">최솟값</label>
<input id="minimum" type="number" min="1" max="1000" step="1" value="1">
<label for="maximum">최댓값</label>
<input id="maximum" type="number" min="1" max="1000" step="1" value="6">
<button id="draw" type="button">정수 뽑기</button>
<p id="result" aria-live="polite"></p>
<script>
const minimum = document.querySelector('#minimum');
const maximum = document.querySelector('#maximum');
const result = document.querySelector('#result');
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
document.querySelector('#draw').addEventListener('click', () => {
const min = Number(minimum.value);
const max = Number(maximum.value);
if (!Number.isInteger(min) || !Number.isInteger(max) ||
min < 1 || max > 1000 || min > max) {
result.textContent = '1~1000에서 최솟값과 최댓값을 올바르게 입력하세요.';
return;
}
result.textContent = `뽑은 수: ${randomInteger(min, max)}`;
});
</script>
</body>
</html>
기본값 1과 6이면 결과는 항상 1~6 중 하나입니다. 두 값을 모두 4로 바꾸면 결과는 언제나 4입니다. 최솟값이 최댓값보다 크거나 소수를 입력하면 안내 문구를 보여 줍니다.
보안 목적에는 별도 난수 API 사용
Math.random()은 보안용으로 설계되지 않았습니다. 비밀번호 재설정 토큰이나 예측되면 안 되는 식별자 등에 쓰지 마세요. 브라우저에서 암호학적으로 강한 난수가 필요하다면 crypto.getRandomValues() 등 Web Crypto API를 사용하고, 토큰 생성·보관을 포함한 전체 보안 설계를 검토해야 합니다. MDN의 Crypto.getRandomValues() 문서가 API의 사용 범위를 설명합니다.




