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%