Oracle隨機函數

DBMS_RANDOM包提供了內置的隨機數生成器。

大多數語言的隨機函數生成器都需要提供一個種子,在Oracle中,選取種子的過程叫做初始化,再執行隨機函數之前,可以不用顯式地執行初始化,Oracle會自動使用日期、用戶ID、進程ID來進行初始化。當然,也可以顯式地初始化或者叫自定義初始化。

INITIALIZE過程


  • 作用

    自定義選擇初始化種子,初始化DBMS_RANDOM包中的隨機函數生成器

  • 語法:

DBMS_RANDOM.INITIALIZE (
   val  IN  BINARY_INTEGER);

val參數表示種子數字

  • 示例:
SQL> exec dbms_random.initialize(1);

PL/SQL procedure successfully completed.

SEED過程


  • 作用

    和INITIALIZE過程作用一樣,只是添加了字符串作爲初始化種子的支持。

  • 語法

DBMS_RANDOM.SEED (
   val  IN  BINARY_INTEGER);

DBMS_RANDOM.SEED (
   val  IN  VARCHAR2);
  • 示例
SQL> exec dbms_random.seed(1828);

PL/SQL procedure successfully completed.

SQL> exec dbms_random.seed('ASDFadre');

PL/SQL procedure successfully completed.

字符串長度最多可以爲2000.

RANDOM函數


  • 作用:

    生成[ -231,231 ]範圍內的隨機整數

  • 語法:

DBMS_RANDOM.RANDOM
   RETURN binary_integer;
  • 示例:
SQL> select dbms_random.random from dual;

    RANDOM
----------
-239250746

RANDOM函數的返回值取值範圍是[ -231,231 ],因此如果我們若想得到[-1,1]範圍內的僞隨機結果:

SQL> select dbms_random.random/power(2,32) from dual;

DBMS_RANDOM.RANDOM/POWER(2,32)
------------------------------
            .013329373

如果是[0,1],取絕對值即可

SQL> select abs(dbms_random.random/power(2,32)) from dual;

ABS(DBMS_RANDOM.RANDOM/POWER(2,32))
-----------------------------------
             .061013688

若想[m,n] (m<n)這種形式,例如[3,9]

SQL> select abs(dbms_random.random/power(2,32))*(9-3)+3 from dual;

ABS(DBMS_RANDOM.RANDOM/POWER(2,32))*(9-3)+3
-------------------------------------------
                  5.3434754

[m,n] (m<n)這種形式的一般表達式爲
select abs(dbms_random.random/power(2,32))*(n-m)+m from dual;

NORMAL函數


  • 作用

    在RANDOM函數的示例中,我們已經討論了[-1,1]區間上的隨機數的生成方法,而NORMAL函數就是專門用於生成[-1,1]上的隨機數,[-1,1]上的隨機數也叫標準正態分佈的隨機數。

  • 語法

DBMS_RANDOM.NORMAL
  RETURN NUMBER;
  • 示例
SQL> select dbms_random.normal from dual;

    NORMAL
----------
-.53885116

VALUE函數


  • 作用

在RANDOM函數的示例中,我們已經討論了[0,1]區間和[m,n](m<n)區間上的隨機數的生成方法,而VALUE函數即可以生成[0,1]上的隨機數,又可以生成[m,n](m<n)上的隨機數,

  • 語法
DBMS_RANDOM.VALUE
  RETURN NUMBER;

DBMS_RANDOM.VALUE(
  low  IN  NUMBER,
  high IN  NUMBER)
RETURN NUMBER;

當沒有參數時,返回[0,1]上的隨機數。

low參數表示最小值,high參數表示最大值,返回[low,high]區間內的隨機數

  • 示例
SQL> select dbms_random.value from dual;

     VALUE
----------
.835104115

SQL> select dbms_random.value(2,8) from dual;

DBMS_RANDOM.VALUE(2,8)
----------------------
        2.62556781

STRING函數


  • 作用

    返回固定長度和格式的隨機字符串

  • 語法

DBMS_RANDOM.STRING
   opt  IN  CHAR,
   len  IN  NUMBER)
  RETURN VARCHAR2;

opt參數控制字符串的大小寫格式,可選值及含義如下:
‘u’或'U':表示大寫字母
‘l’或‘L’:表示小寫字母
‘a’或‘A’:表示大小寫混合
‘x’或‘X’:表示大寫字母和數字混合
‘p’或‘P’:表示任意可顯示字符

len表示字符串長度

  • 示例
SQL> select dbms_random.string('u',20) from dual;

DBMS_RANDOM.STRING('U',20)
--------------------------------------------------------------------------------
TBRGRBXIIKHZCEWKYELY

SQL> c/'u'/'l' 
  1* select dbms_random.string('l',20) from dual
SQL> /

DBMS_RANDOM.STRING('L',20)
--------------------------------------------------------------------------------
hujwzvftjdrazveywlkv

SQL> c/'l'/'a'
  1* select dbms_random.string('a',20) from dual
SQL> /

DBMS_RANDOM.STRING('A',20)
--------------------------------------------------------------------------------
LQNjEgWzZABDcAHgDdCU

SQL> c/'a'/'x'
  1* select dbms_random.string('x',20) from dual
SQL> /

DBMS_RANDOM.STRING('X',20)
--------------------------------------------------------------------------------
X0HX6GU4YB9YFTJDFSUH

SQL> c/'x'/'p'
  1* select dbms_random.string('p',20) from dual
SQL> /

DBMS_RANDOM.STRING('P',20)
--------------------------------------------------------------------------------
m6mw/l[%D3BmLsgEi)l%
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章