Oracle dbms random隨機數包詳解

2022-05-24 22:39:22 字數 2850 閱讀 5840

oracle dbms_random包主要用於獲得隨機數,可以為數字也可以為字母等,還可以實現混拼。常用函式如下:

生成乙個指定範圍的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…

生成乙個符合正態分佈的隨機數,此正態分佈標準偏差為1,期望值為0。這個函式返回的數值中有68%是介於-1與+1之間, 95%介於-2與+2之間,99%介於-3與+3之間。

【舉例】

select dbms_random.normal from dual;

返回:1.0748…

生成乙個從-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;

生成乙個指定模式指定位數的隨機字串,可選模式如下:

'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

生成乙個指定起始點的隨機數,對於相同的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<=隨機數。

舉個例子: 要產生乙個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)

附**「偽隨機數」和「隨機種子」

首先需要宣告的是,計算機不會產生絕對隨機的隨機數,計算機只能產生「偽隨機數」。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。

所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似 的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言, 其隨機程度已足夠了。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地「隨機」,隨機種子的選擇就顯得非常重要。如果隨機種子 一樣,那麼同乙個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的引數作為隨機種子。

Oracle dbms random隨機數包詳解

oracle dbms random包主要用於獲得隨機數,可以為數字也可以為字母等,還可以實現混拼。常用函式如下 生成乙個指定範圍的38位隨機小數 小數點後38位 若不指定範圍則預設為範圍為 0,1 的隨機數。oracle的官方說明為 the value function produces numb...

Oracle dbms random隨機數包詳解

dbms random.valueselect dbms random.value from dual 0,1 select dbms random.value 1 10 from dual 1,10 dbms random.normalselect dbms random.normal from ...

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...