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

함께보기


database
11월 12, 2015
0

Menu

Search

Popular Posts

디자이너를 위한 최고의 영화 (디자이너에게 영감을 주는 영화)

개인적으로 직접 조립하고 만드는걸 좋아했는데 만들기전에 만들어질 모습을 스케치하는 것을 즐겼습니다. 스케치 할때 머리 속에 있는 멋진 모습…

Bash 입문자를 위한 핵심 요약 정리 (Shell Script)

Bash 입문자를 위한 기본적인 문법과 알고 있으면 좋은 것들만 정리했다. (이런 것도 있구나 싶을 정도만 이해하도록 간단한 설명과 예제로 …

PHP7 공개 전 참고 사이트 소개

PHP7 공개가 2015년 10월이라고 한다. 그래서 인지 모르겠지만 부쩍 PHP7에 대한 글들을 많이 찾아볼 수 있어 참고해볼 만한 …

Contact Me