通过循环在[0,1001]中生成随机数,即非重复的随机数 [英] Generate a random number of non duplicated random number in [0, 1001] through a loop

查看:139
本文介绍了通过循环在[0,1001]中生成随机数,即非重复的随机数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆