이번 글에서는 숫자 n과 두 개의 숫자로 이루어진 배열(범위)을 인자로 받아, 해당 범위 안에 속하는 난수 n개를 배열 형태로 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 개요
예를 들어 n이 10이고 범위가 [5, 15]라면, 함수는 5 이상 15 이하의 값을 가지는 난수 10개를 담은 배열을 반환해야 합니다.
핵심 아이디어는 다음과 같습니다.
Math.random()은 0 이상 1 미만의 난수를 반환합니다.- 이 값에
(최댓값 - 최솟값)을 곱하고 최솟값을 더하면 원하는 범위의 난수를 얻을 수 있습니다. toFixed(2)를 사용해 소수점 둘째 자리까지 반올림하여 가독성을 높입니다.- 이미 생성된 값과 중복되지 않도록
includes()로 검사한 뒤 배열에 추가합니다.
예제 코드
const num = 10;
const range = [5, 15];
const randomBetween = (a, b) => {
return ((Math.random() * (b - a)) + a).toFixed(2);
};
const randomBetweenRange = (num, range) => {
const res = [];
for(let i = 0; i < num; ){
const random = randomBetween(range[0], range[1]);
if(!res.includes(random)){
res.push(random);
i++;
}
}
return res;
};
console.log(randomBetweenRange(num, range));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
[ '13.25', '10.31', '11.83', '5.25', '6.28', '9.99', '6.09', '7.58', '12.64', '8.92' ]
난수이기 때문에 실행할 때마다 결과는 달라집니다. 다시 한 번 실행하면 다음과 같은 다른 출력을 확인할 수 있습니다.
[ '5.29', '7.95', '11.61', '7.83', '10.56', '7.48', '12.96', '6.92', '8.98', '9.43' ]
참고 사항
toFixed()는 문자열을 반환하므로, 숫자 타입이 필요한 경우 Number() 또는 단항 연산자 +를 사용해 변환하면 됩니다. 또한 범위가 좁고 요청한 개수가 많으면 중복 제거 과정에서 반복 횟수가 늘어날 수 있으므로, 범위 크기와 n 값의 관계를 고려하는 것이 좋습니다.