我需要在plpgsql中生成一个随机数的非重复随机数。非重复数字应落在[1,1001]范围内。但是,代码生成的数字超过1001.
directed2number := trunc(Random()*7+1);
counter := directed2number
while counter > 0
loop
to_point := trunc((random() * 1/directed2number - counter/directed2number + 1) * 1001 +1);
...
...
counter := counter - 1;
end loop;
答案 0 :(得分:3)
如果我理解正确
CREATE OR REPLACE FUNCTION x.unique_rand_1001()
RETURNS SETOF integer AS
$body$
DECLARE
nrnr int := trunc(random()*7+1); -- number of numbers
BEGIN
RETURN QUERY
SELECT (1000 * random())::integer + 1
FROM generate_series(1, nrnr*2)
GROUP BY 1
LIMIT nrnr;
END;
$body$ LANGUAGE plpgsql VOLATILE;
致电:
SELECT x.unique_rand_1001();
GROUP BY
使数字独一无二。我生成的数字是所需数量的两倍,以便在删除重复项时提供足够的数字。根据任务的给定维度(最多8个1001个数字),天文数据不太可能没有足够的数字。最糟糕的情况:返回查看器编号。
答案 1 :(得分:1)
我不会在PostgreSQL中以这种方式解决问题。沿着这些方向的东西似乎更有意义。
-- Returns a random integer in the interval [n, m].
CREATE OR REPLACE FUNCTION random_integer(integer, integer)
RETURNS integer AS
$BODY$
select trunc( $1 + (($2*random()) ))::integer
$BODY$
LANGUAGE sql VOLATILE
然后选择1到1000之间的单个随机整数
select random_integer(1, 1000);
要选择1到1000之间的100个随机整数,
select random_integer(1, 1000)
from generate_series(1,100);