PostgreSQL: 특정 범위의 랜덤 숫자 추출하는 방법


PGSQL에서 SELECT random(); 사용하면 0.0 <= x < 1.0 범위의 난수를 반환해주는데, random()을 이용하여 특정 범위의 정수 값을 램덤하게 추출하는 방법을 소개합니다.

random()은 난수를 반환하기 때문에 trunc()를 이용하여 정수로 바꾸고, generate_series()를 이용하여 1백만번의 반복 실행으로 최소값과 최대값을 확인하여 지정한 범위대로 실행이되는지 확인해보겠습니다.

0 ~ 10 사이의 정수

trunc() 제거하면 0.0 <= x < 11.0 범위의 난수가 반환됩니다.
-- 0 <= x < 10 범위의 정수
-- "SELECT trunc(random() * 11);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * 11) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max 
-----+-----
   0 |  10

1 ~ 10 사이의 정수

trunc() 제거하면 1.0 <= x < 11.0 범위의 난수가 반환됩니다.
-- 1 <= x < 11 범위의 정수
-- "SELECT trunc(random() * 10 + 1);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * 10 + 1) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max 
-----+-----
   1 |  10

5 ~ 10 사이의 정수

trunc() 제거하면 5.0 <= x < 11.0 범위의 난수가 반환됩니다.
-- 5 <= x < 11 범위의 정수
-- "SELECT trunc(random() * (11-5) + 5);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * (11-5) + 5) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max 
-----+-----
   5 |  10

함수 생성 후 사용하기

위 예제에서는 원하는 최대값에 +1된 값을 사용했는데, 아래 예제는 함수내에서 +1 처리하여 함수를 사용하는 곳에서 직관적으로 확인 가능하도록 만들었습니다.
-- DROP FUNCTION custom_random(start_number integer, end_number integer);
CREATE OR REPLACE FUNCTION custom_random(start_number integer, end_number integer)
RETURNS integer
LANGUAGE plpgsql
STRICT
AS $BODY$
    BEGIN
        RETURN trunc(random() * ((end_number + 1) - start_number) + start_number);
    END;
$BODY$;
생성한 custom_random() 사용하기
-- 5 <= x < 11 범위의 정수
-- "SELECT custom_random(5, 10);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT custom_random(5, 10) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max 
-----+-----
   5 |  10

함께보기