2013年10月16日 星期三

亂數(Random)

對於亂數函數,MSSQL提供的RAND()NEWID()函數,而ORACLE並未提供相關函數可供使用,但可以採用DBMS Packages所提供的DBMS_RANDOM套件以產生亂數(Random)。

MSSQL
MSSQL提供的RAND()亂數函數,可產生0.01.0(不含)的浮點數,語法如下:
RAND ( [ seed ] )
其中seed引數為初始值(或稱為種子)。若未指定則MSSQL將隨機指派一個初始值,但當指定初始值後,所產生結果則一律相同,建議可改採用NEWID()函數。NEWID()函數可產生每次都不同且不重複的全域唯一辨識項(Globally Unique IdentifierGUDI),處理後同樣可產生介於01的浮點數。以下將產生五組亂數,SQL語法及結果如下所示:

SQL /執行結果
SQL
SELECT TOP 5 RAND() "RAND()"
      , CAST(CHECKSUM(NEWID()) & 0x7fffffff AS float) / CAST (0x7fffffff AS int) "NEWID()"
FROM sysobjects

結果

RAND()函數所產生的五組亂數均相同,NEWID()則否,此作法是改寫微軟官方網站所提供「使用TABLESAMPLE限制結果集」範例

ORACLE
ORACLE提供DBMS_RANDOM套裝程式可產生數值字串之亂數,套件中常用為VALUE()函數可用於產生數值亂數,依是否設定上下界參數與否而區分成兩種方法,預設(不含參數)將傳回介於0.01.0(不含)之間,具有38位數的浮點數;傳入下界(low)、上界(high)參數者,將產生介於下界到上界(不含)之間浮點數,整理如下表所示。
語法
說明
DBMS_RANDOM.VALUE
傳回範圍從0.01.0不含)具有38位精準度浮點數,值域為[0, 1)
DBMS_RANDOM.VALUE(low, high)
傳回範圍從lowhigh不含)的浮點數,值域為[low, high)
註:數學值域定義括號[]代表包含,小括號()代表不包含。


CONNECT BY產生五筆資料,測試[0, 1)間浮點數及[1,10]整數兩種形式之亂數,SQL語法及執行結果如下所示
SQL
執行結果
SELECT DBMS_RANDOM.VALUE    "Rand [0, 1)"
  --, TRUNC(DBMS_RANDOM.VALUE()*10)+1 "Rand [1, 10]"
  , TRUNC(DBMS_RANDOM.VALUE(1, 11))   "Rand [1,10]"
FROM DUAL
CONNECT BY LEVEL <=5

沒有留言:

張貼留言