Oracle dbms_random包主要用於獲得隨機數,可以為數字也可以為字母等,還可以實現混拼。常用函數如下:
dbms_random.value
生成一個指定范圍的38位隨機小數(小數點后38位),若不指定范圍則默認為范圍為[0,1)的隨機數。
Oracle的官方說明為:The VALUE function produces numbers in the range [0,1) with 38 digits of precision.
【舉例】
生成一個0~1間的隨機小數(包括0,不包括1):
select dbms_random.value from dual;
返回:0.800625…
生成一個1~10間的隨機小數(包括1和不包括10):
select dbms_random.value(1,10) from dual;
返回:8.5929…
dbms_random.normal
生成一個符合正態分布的隨機數,此正態分布標准偏差為1,期望值為0。這個函數返回的數值中有68%是介於-1與+1之間, 95%介於-2與+2之間,99%介於-3與+3之間。
【舉例】
select dbms_random.normal from dual;
返回:1.0748…
dbms_random.random
生成一個從-power(2,31)到power(2,31)的整數值,注意,區間為左閉右開。
官方說明為:The RANDOM function produces integers in the range [-2^^31, 2^^31).
【舉例】
select dbms_random.random from dual;
返回:2018005364
隨機從emp表中獲取3條記錄
select * from (select * from scott.emp order by dbms_random.random) where rownum < 4;
dbms_random.string
生成一個指定模式指定位數的隨機字符串,可選模式如下:
'u'或'U',僅返回大寫字母
'l'或'L',僅返回小寫字母
'a'或'A',返回大小寫字母混合
'x'或'X',返回大寫字母和數字混合
'p'或'P',返回任意可顯示字符
【舉例】
select dbms_random.string('u',10) from dual;
返回:MYYUYFQQHS
select dbms_random.string('L',10) from dual;
返回:vuzscusike
select dbms_random.string('a',10) from dual;
返回:oZoGNKAERk
select dbms_random.string('X',10) from dual;
返回:RC6IZ10FVT
select dbms_random.string('X',10) from dual;
返回:A1E-=S)w%1
dbms_random.seed:
生成一個指定起始點的隨機數,對於相同的seed而言,隨機數任意一次變化都是確定的。
在Oracle中的DBMS_RANDOM程序包中封裝了一些生成隨機數和隨機字符串的函數,其中常用的有以下兩個:
DBMS_RANDOM.VALUE函數
該函數用來產生一個隨機數,有兩種用法:
1. 產生一個介於0和1之間(不包含0和1)的38位精度的隨機數,語法為:
DBMS_RANDOM.VALUE RETURN NUMBER; |
這種用法不包含參數。
2. 產生一個介於指定范圍之內的38位精度的隨機數,語法為:
DBMS_RANDOM.VALUE(low IN NUMBER,high IN NUMBER) RETURN NUMBER; |
這種用法包含兩參數,參數low用來指定要生成的隨機數的下限,參數high指定上限,生成的隨機。請注意生成的隨機數有可能等於下限,但絕對小於上限,即“low<=隨機數<high”。
舉個例子: 要產生一個1到100之間的數可以這樣寫: DBMS_RANDOM.VALUE(1,100)
DBMS_RANDOM.STRING函數
該函數產生一個隨機字符串,語法為:
DBMS_RANDOM.STRING (opt IN CHAR,len IN NUMBER) RETURN VARCHAR2; |
參數len指定生成的字符串的長度。
參數opt指定生成的字符串的樣式,允許的取值及其表示的含義如下表所示:
取值 |
含義 |
‘u’或’U’ |
返回一個由大寫字母組成的字符串 |
‘l’或’L’ |
返回一個由小寫字母組成的字符串 |
‘a’或’A’ |
返回一個由大寫字母和小寫字母組成的字符串 |
‘x’或’X’ |
返回一個由大寫字母和數字組成的字符串 |
‘p’或’P’ |
返回一個由任意的可打印字符組成的字符串 |
舉個例子: 要產生一個長度為6且只包括大寫字母的字符串,可以這樣寫: DBMS_RANDOM.STRING('U',6)
附轉:“偽隨機數”和“隨機種子”
首先需要聲明的是,計算機不會產生絕對隨機的隨機數,計算機只能產生“偽隨機數”。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。
所謂的隨機數發生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產生的結果來近似 的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言, 其隨機程度已足夠了。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子 一樣,那么同一個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的參數作為隨機種子。