通过循环在[0,1001]中生成随机数,即非重复的随机数 [英] Generate a random number of non duplicated random number in [0, 1001] through a loop
问题描述
我需要在plpgsql中生成一个随机数,即非重复的随机数.不可重复的数字应在[1,1001]范围内.但是,该代码生成的数字超过1001.
I need to generate a random number of non duplicated random number in plpgsql. The non duplicated number shall fall in the range of [1,1001]. However, the code generates number exceeding 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;
推荐答案
如果我理解正确
- 您需要一个随机数( 1到8 ).
- 随机数的范围是 1到1001 .
- 随机数必须唯一.没有一个应出现超过一次.
- You need a random number (1 to 8) of random numbers.
- The random numbers span 1 to 1001.
- The random numbers need to be unique. None shall appear more than once.
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
使数字唯一.我生成的数字是需要的两倍,以提供足够的数字,以防重复项被删除.对于给定的任务规模(最多1001个数字中的8个),从天文学角度来看,剩余数量不足是不可能的.最坏的情况是:返回了观看者编号.
Numbers are made unique by the GROUP BY
. I generate twice as many numbers as needed to provide enough numbers in case duplicates are removed. With the given dimensions of the task (max. 8 of 1001 numbers) it is astronomically unlikely that not enough numbers remain. Worst case scenario: viewer numbers are returned.
这篇关于通过循环在[0,1001]中生成随机数,即非重复的随机数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!