我需要编写一个生成n个唯一数字的过程,范围从x到y?不允许重复。我知道可以使用dbms_random.value(x,y)生成随机数,但重复值。
答案 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
进行过滤。