dbms_random
CREATE OR REPLACE PACKAGE SYS.dbms_random AS
------------
-- OVERVIEW
--
-- This package should be installed as SYS. It generates a sequence of
-- random 38-digit Oracle numbers. The expected length of the sequence
-- is about power(10,28), which is hopefully long enough.
--
--------
-- USAGE
--
-- This is a random number generator. Do not use for cryptography.
-- For more options the cryptographic toolkit should be used.
--
-- By default, the package is initialized with the current user
-- name, current time down to the second, and the current session.
--
-- If this package is seeded twice with the same seed, then accessed
-- in the same way, it will produce the same results in both cases.
--
--------
-- EXAMPLES
--
-- To initialize or reset the generator, call the seed procedure as in:
-- execute dbms_random.seed(12345678);
-- or
-- execute dbms_random.seed(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));
-- To get the random number, simply call the function, e.g.
-- my_random_number BINARY_INTEGER;
-- my_random_number := dbms_random.random;
-- or
-- my_random_real NUMBER;
-- my_random_real := dbms_random.value;
-- To use in SQL statements:
-- select dbms_random.value from dual;
-- insert into a values (dbms_random.value);
-- variable x NUMBER;
-- execute :x := dbms_random.value;
-- update a set a2=a2+1 where a1 < :x;
-- Seed with a binary integer
PROCEDURE seed(val IN BINARY_INTEGER );
PRAGMA restrict_references (seed, WNDS );
-- Seed with a string (up to length 2000)
PROCEDURE seed(val IN VARCHAR2 );
PRAGMA restrict_references (seed, WNDS );
-- Get a random 38-digit precision number, 0.0 <= value < 1.0
FUNCTION value RETURN NUMBER ;
PRAGMA restrict_references ( value , WNDS );
-- get a random Oracle number x, low <= x < high
FUNCTION value (low IN NUMBER , high IN NUMBER ) RETURN NUMBER ;
PRAGMA restrict_references ( value , WNDS );
-- get a random number from a normal distribution
FUNCTION normal RETURN NUMBER ;
PRAGMA restrict_references (normal, WNDS );
-- get a random string
FUNCTION string (opt char , len NUMBER )
/* "opt" specifies that the returned string may contain:
'u','U' : upper case alpha characters only
'l','L' : lower case alpha characters only
'a','A' : alpha characters only (mixed case)
'x','X' : any alpha-numeric characters (upper)
'p','P' : any printable characters
*/
RETURN VARCHAR2 ; -- string of <len> characters (max 60)
PRAGMA restrict_references ( string , WNDS );
-- Obsolete, just calls seed(val)
PROCEDURE initialize(val IN BINARY_INTEGER );
PRAGMA restrict_references (initialize, WNDS );
-- Obsolete, get integer in ( -power(2,31) <= random < power(2,31) )
FUNCTION random RETURN BINARY_INTEGER ;
PRAGMA restrict_references (random, WNDS );
-- Obsolete, does nothing
PROCEDURE terminate;
TYPE num_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
END dbms_random;
简单得说,通过dbms_random包调用随机数的方法大致有4种:
1、dbms_random.normal
这个函数不带参数,能返回normal distribution的一个number类型,所以基本上随机数会在-1到1之间。
简单测试了一下,产生100000次最大能到5左右:
SQL> declare
2 i number:=0;
3 j number:=0;
4 begin
5 for k in 1 .. 100000 loop
6 i:= dbms_random.normal;
7 if i > j
8 then j:=i;
9 end if;
10 end loop;
11 dbms_output.put_line(j);
12 end;
13 /
5.15325081797418404136433867107468983182
PL/SQL procedure successfully completed
2、dbms_random.random
这个也没有参数,返回一个从-power(2,31)到power(2,31)的整数值
3、dbms_random.value
这个函数分为两种,一种是没有参数,则直接返回0-1之间的38位小数
SQL > column value format 9.99999999999999999999999999999999999999
SQL > select dbms_random.value from dual;
VALUE
-----------------------------------------
.58983014999643548701631750396301271752
第二种是加上两个参数a、b,则返回值在a、b之间的38位小数