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

2 min read

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

함께보기


관심 있을 만한 글

  • 응용프로그램을 테스트하기 위해 대용량 테스트 데이터가 필요하다면 generate_series를 사용해보세요. 엑셀로 테스트 데이터를 만들어 DB에 넣거나 간단한 스크립트를 만들어 사용하시는 분들도 있으실텐데요. 간단한 쿼리문으로 테스트 데이터를 원하는 데이터 만큼 빠르게 만들 수 있습니다. 100만건의 테스트 데이터…
  • PGSQL에서는 INSERT, UPDATE, DELETE 쿼리 실행 후 처리 ROWS만 알려주는데, 조금더 상세한 정보를 알수 있는 방법이 있습니다. INSERT, UPDATE, DELETE 쿼리 뒤에 RETURNING *난 입력해주면 실행한 쿼리의 결과를 출력해주게됩니다. UPDATE member SET id = 't…
  • PGSQL에서 스키마를 복제하는 간단한 예제입니다. 스키마 복제셀 커맨드 창에서 pg_dump, sed, psql 3개의 명령어로 스키마를 복제합니다. |로 3개의 명령어를 연결했으며 "스키마 덤프 > 스키마 명 치환 > 스키마 추가"" 순으로 진행됩니다. # 스키마 / 데이터 모두 복제 pg_dump -…
  • PostgreSQL에서 "pg_stat_activity" 통계 정보를 이용한 현재 실행 중인 쿼리를 조회하고 실행 취소하는 방법을 소개합니다. 버전에 따라 차이가 있을 수 있으며 9.4버전을 기준으로 작성했습니다. 실행중인 쿼리 확인하기SELECT * FROM pg_stat_activity ORDER BY query_…
  • PGSQL에서 정규식을 이용하여 한글이 포함된 텍스트인지 확인하는 방법입니다. 알파벳만 찾는 경우 "[a-z]" 입력하여 그 범위에 포함되는 모든 문자를 찾도록 합니다. 한글도 동일하게 첫 글자와 끝 글자를 입력하여 찾고자 하는 범위를 지정해주면됩니다. 그런데 한글의 첫 글자와 끝 글자만 알면되는데 여기서 많은 분들이…
  • PGSQL에서 다중 행 혹은 다중 열 데이터를 한 문자열로 만드는 쿼리 예제입니다. 더 다양한 방법과 상세한 설명은 하단의 "함께보기"에 있는 링크를 통해서 확인 가능합니다. 참고로 문자열 작업 시 가장 많은 실수는 데이터 타입 오류가 많습니다. 서로 다른 데이터 타입이라면 :: 이용하여 데이터 타입을 지정해서 확인해…
대화 참여하기

댓글 쓰기