【问题标题】:Oracle sql random number by seedOracle sql随机数种子
【发布时间】:2014-09-11 09:10:18
【问题描述】:

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

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中有没有这样的方法?

【问题讨论】:

    标签: java sql oracle random


    【解决方案1】:

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

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

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

    在某些情况下,例如在测试时,您可能希望每次运行的随机数序列都相同。在这种情况下,您可以通过调用 DBMS_RANDOM.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)}
    • @ОлександрСамсонов - 是的,exec 是匿名块的 SQL*PLus 简写,因此 JDBC 无法理解。很高兴它有帮助。
    【解决方案2】:

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

    【讨论】:

    • 如何在 sql 中而不是在 pl/sql 块中使用它?
    • @ОлександрСамсонов 查看 Alex 的回答
    【解决方案3】:

    根据

    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
    

    设置种子。你可以创建一个函数来用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 2011-04-04
      • 2013-05-28
      • 2013-03-27
      • 1970-01-01
      • 2021-05-15
      • 2021-07-28
      相关资源
      最近更新 更多