使用种子生成 Oracle SQL 随机数

4
有没有一种方法可以使用某个种子生成随机数?
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个回答

4
DBMS_RANDOM包的文档描述了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 

谢谢答复。第一段代码符合我的需求。它没有起作用,因为我尝试调用exec dbms_random.seed(47),但在JDBC SQL语句中,我必须调用{call dbms_random.seed(47)} - Oleksandr Samsonov
@ОлександрСамсонов - 是的,exec是SQL*Plus匿名块的简写,所以JDBC不会理解。很高兴能帮到你。 - Alex Poole

2

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


1
它如何在 SQL 中使用而不是在 PL/SQL 块中使用? - Oleksandr Samsonov
@ОлександрСамсонов 请查看 Alex 的答案。 - Uwe Plonus

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

你应该使用 <\p>。
  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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接