有没有办法用一些种子生成随机数?
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中有没有办法做到这一点?
答案 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;