在pl / sql中生成随机数而不重复?

时间:2016-11-12 12:51:58

标签: sql database oracle plsql

我需要编写一个生成n个唯一数字的过程,范围从x到y?不允许重复。我知道可以使用dbms_random.value(x,y)生成随机数,但重复值。

3 个答案:

答案 0 :(得分:3)

嗯,首先关闭 - 如果必须生成没有重复的数字,那么它们并不是真正随机的。

因为这听起来像是一个课程作业,所以我不会为你编写代码。但是,您可以尝试以下方法:

创建一个表UNIQUE_NUMBERS,其中一列名为UNIQUE_NUMBER,类型为NUMBER,它被限制为唯一。在您的函数中,生成您喜欢的数字,然后将其插入UNIQUE_NUMBERS。如果正确插入,则一切都很好,值是唯一的,并且您的函数可以COMMIT插入并返回该值。如果存在异常,则表示该值已存在,未插入,您需要循环返回并生成随机的其他数字。

祝你好运。

答案 1 :(得分:1)

您可以使用CTE生成从x到y的数字。然后你可以随机排序:

with n as (
      select level as n
      from dual
      connect by level <= ("x" - "y" + 1)
     ),
     rand_n as (
      select n + "x" - 1
      from n
      order by dbms_random.random
     )
select *
from rand_n;

当然,这假设“x”和“y”之间的差异并不是很大。

答案 2 :(得分:1)

一种方法是生成超过n个数字(例如,多10%)。在n个数字内具有少于1.1 * n个不同数字的几率可能很低,在遇到这种情况之前的预期时间比太阳系的寿命长(如果n相当小)。

然后,对于1.1 * n随机数,您完全可以预期至少n将是不同的,您可以选择不同并按rownum进行过滤。