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

在pl/sql中生成不重复的随机数?,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我需要写一个程序,生成从x到y的n个唯一数字?不允许重复。我知道可以用dbms_random.valuex,y生成随机数,但是值是重复的。首先,如果必须生成没有重复的数字,那么它们就不是真正的随机数 因为这听起来像是一个课堂作业,所以我不打算为你们写代码。但是,您可以尝试以下方法: 创建一个表UNIQUE_NUMBERS,其中一列名为UNIQUE_NUMBER,类型为NUMBER,该列被约束为唯一。在您的函数中,生成您喜欢的数字,然后将其插入到唯一的\u数字中。如果它正确插入,那么一切都很好,值

我需要写一个程序,生成从x到y的n个唯一数字?不允许重复。我知道可以用dbms_random.valuex,y生成随机数,但是值是重复的。

首先,如果必须生成没有重复的数字,那么它们就不是真正的随机数

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

创建一个表UNIQUE_NUMBERS,其中一列名为UNIQUE_NUMBER,类型为NUMBER,该列被约束为唯一。在您的函数中,生成您喜欢的数字,然后将其插入到唯一的\u数字中。如果它正确插入,那么一切都很好,值是唯一的,并且您的函数可以提交插入并返回该值。如果出现异常,则表示该值已经存在,未插入,需要循环并生成另一个随机数


祝你好运。

首先,如果必须生成没有重复的数字,那么它们就不是真正随机的

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

创建一个表UNIQUE_NUMBERS,其中一列名为UNIQUE_NUMBER,类型为NUMBER,该列被约束为唯一。在您的函数中,生成您喜欢的数字,然后将其插入到唯一的\u数字中。如果它正确插入,那么一切都很好,值是唯一的,并且您的函数可以提交插入并返回该值。如果出现异常,则表示该值已经存在,未插入,需要循环并生成另一个随机数


祝您好运。

您可以使用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之间的差异不是很大。

您可以使用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之间的差异不是很大。

一种方法是生成n个以上的数字,例如,多10%。在1.1*n的范围内,拥有少于n个不同数字的几率可能非常低,如果n相当小,在出现这种情况之前的预期时间比太阳系的寿命要长


然后,对于1.1*n个随机数,您完全希望其中至少有n个是不同的,您可以选择不同的并按rownum进行过滤。

一种方法是生成n个以上的数字,例如,多10%。在1.1*n的范围内,拥有少于n个不同数字的几率可能非常低,如果n相当小,在出现这种情况之前的预期时间比太阳系的寿命要长


然后,对于1.1*n个随机数,您完全希望其中至少有n个是不同的,您可以选择distinct并按rownum过滤。

您需要提供n的上限。如果n太大,问题可能没有解决方案。机器中可以表示的数字数量总是有限的,因此如果n大于该数字,则没有解决方案。如果n仍然很大,但在第一种意义上不是太大,那么这个问题可能是可以解决的,但时间估计为9000年。那么:为什么需要编写一个过程?这可以在普通SQL中完成。过程是字面意思吗?这是用于PL/SQL中的类还是用于编写过程?或者一个简单的SQL解决方案就足够了吗?您需要提供n的上限。如果n太大,问题可能没有解决方案。机器中可以表示的数字数量总是有限的,因此如果n大于该数字,则没有解决方案。如果n仍然很大,但在第一种意义上不是太大,那么这个问题可能是可以解决的,但时间估计为9000年。那么:为什么需要编写一个过程?这可以在普通SQL中完成。过程是字面意思吗?这是用于PL/SQL中的类还是用于编写过程?或者简单的SQL解决方案就足够了???您的意思是在外部查询中有一个限制过滤器,比如rownum??您的意思是在外部查询中有一个限制过滤器,比如rownum