Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 특정 범위 내의 중복 없는 난수 배열 생성하기

JavaScript에서 숫자 n과 두 개의 숫자로 구성된 범위 배열을 인자로 받아, 해당 범위 안에 속하는 난수 n개를 배열 형태로 반환하는 함수를 작성해야 하는 경우가 있습니다. 예를 들어, 5부터 15 사이의 서로 다른 난수 10개를 만드는 것이 대표적인 예입니다.

구현 아이디어

핵심은 Math.random() 함수입니다. 이 함수는 0 이상 1 미만의 임의의 실수를 반환하므로, 다음 공식을 활용하면 원하는 범위의 난수를 손쉽게 얻을 수 있습니다.

Math.random() * (max - min) + min

여기에 toFixed(2)를 적용해 소수점 둘째 자리까지 정리하고, 이미 생성된 값과 중복되지 않는지 검사한 후 결과 배열에 추가하는 방식으로 구현합니다.

예제 코드

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));

코드 설명

  • randomBetween(a, b): 최솟값 a와 최댓값 b 사이의 난수를 생성한 뒤, 소수점 둘째 자리까지 반올림하여 문자열로 반환합니다.
  • randomBetweenRange(num, range): 증감식 없이 조건만 검사하는 for문을 사용해, 중복되지 않은 난수가 num개 채워질 때까지 반복합니다.
  • res.includes(random)로 중복 여부를 확인하며, 중복된 값은 배열에 추가하지 않고 카운터도 증가시키지 않습니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

[
    '13.25', '10.31',
    '11.83', '5.25',
    '6.28', '9.99',
    '6.09', '7.58',
    '12.64', '8.92'
]

난수이기 때문에 위 결과는 가능한 여러 출력 중 하나일 뿐이며, 실행할 때마다 값이 달라집니다. 다만 모든 값은 항상 지정한 범위인 5 이상 15 미만에 속한다는 점은 보장됩니다.

주의할 점

  • toFixed(2)는 문자열을 반환하므로, 결과 배열의 요소는 숫자가 아닌 문자열입니다. 수치 연산이 필요하다면 Number()parseFloat()으로 변환해야 합니다.
  • 범위가 좁거나 요청 개수(n)가 범위 내 가능한 고유 값의 수보다 많으면 무한 루프에 빠질 수 있으므로, 범위 크기와 개수를 함께 고려해 설계하는 것이 좋습니다.