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
함께보기
- PostgreSQL: Mathematical Functions and Operators
- PostgreSQL: CREATE FUNCTION
- PostgreSQL: Set Returning Functions