Oracle sql按种子随机数

时间:2014-09-11 09:10:19

标签: java sql oracle random

有没有办法用一些种子生成随机数?

SELECT  DBMS_RANDOM.value FROM dual;

这里的java代码符合我的目的

Random r1 = new Random(47);
        Random r2 = new Random(47);
        System.out.println(r1.nextInt());
        System.out.println(r2.nextInt());
        System.out.println(r1.nextInt());
        System.out.println(r2.nextInt());

这里结果

-1172028779
-1172028779
1717241110
1717241110

如果我将一次又一次地运行此代码,我将得到相同的结果。在Oracle sql中有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

Oracle DBMS_RANDOM包有一个名为SEED的函数,它将种子重置为您可以定义的值。

答案 1 :(得分:2)

documentation for the DBMS_RANDOM package描述了SEED过程,该过程会重置当前会话的种子。

  

DBMS_RANDOM可以显式初始化,但在调用随机数生成器之前不需要初始化。如果未执行显式初始化,它将自动使用日期,用户ID和进程ID进行初始化。

     

如果这个包用相同的种子播种两次,然后以相同的方式访问,它将在两种情况下产生相同的结果。

     

在某些情况下,例如测试时,您可能希望每次运行时随机数序列相同。在这种情况下,通过调用DBMS_RANDOM.SEED的一个重载,您可以使用常量值为生成器设定种子。要为每次运行生成不同的输出,只需省略对" Seed"的调用。系统会为您选择合适的种子。

演示:

exec dbms_random.seed(47);

anonymous block completed

select dbms_random.value from dual;

     VALUE
----------
  .5976804 

select dbms_random.value from dual;

     VALUE
----------
.329618924 

-- reset
exec dbms_random.seed(47);

anonymous block completed

select dbms_random.value from dual;

     VALUE
----------
  .5976804 

select dbms_random.value from dual;

     VALUE
----------
.329618924 

您无法从SQL调用过程,您必须使用PL / SQL块(全部为execute)。如果你真的需要,你可以创建自己的包装函数:

create function my_random_value(p_seed in number default null)
return number is
begin
  if p_seed is not null then
    dbms_random.seed(p_seed);
  end if;
  return dbms_random.value;
end;
/

然后在有或没有种子的情况下调用它:

select my_random_value(47) from dual;

MY_RANDOM_VALUE(47)
-------------------
           .5976804 

select my_random_value from dual;

MY_RANDOM_VALUE
---------------
     .329618924 

答案 2 :(得分:1)

根据

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_random.htm   http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_random.htm#i996798

你应该使用

  DBMS_RANDOM.SEED

设置种子。您可以创建函数以使用种子实现随机生成器:

  create or replace function RandomGen(Seed NUMBER default null) return number is
  begin
    if (Seed is not null) then 
      DBMS_RANDOM.Seed(Seed);
    end if;  

    return DBMS_RANDOM.Value;
  end RandomGen;

    ...

  select RandomGen(123) -- <- Seed 123
    from Dual;

  ...

  select RandomGen -- <- No seed
    from Dual;