微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle DBMS_RANDOM包生成随机数

Oracle dbms_random是一个生成随机数值或字符串的程序包。这个包包含以下几个方法

  • initialize()
  • seed()
  • terminate()
  • value()
  • normal()
  • random()
  • string()
下文分别介绍各个方法的使用方法:

--1. dbms_random.value([low IN NUMBER,high IN NUMBER]): 该函数用来获取一个0~1之间的随机数,精度为38位;相应的,如果制定了上限和下限,则返回大于等于low小于等于high的随机数。
-- 示例1: 生成10个0~1之间的随机数:
select dbms_random.value
from dual
connect by level<=10;


--示例2:生成10个1000~10000之间的随机数:
select dbms_random.value(1000,10000)
from dual
connect by level<=10;


--2. DBMS_RANDOM.INITIALIZE(val IN BINARY_INTEGER): 用种子值来初始化DBMS_RANDOM包,认情况下,DBMS_RANDOM包是根据用户、时间、会话来进行初始化,这样,即便是同一个语句,每次生成的数值都会不一样,但这样会产生一个问题,在测试环境下,如果要求每次生成随机数序列都是一样的,那该怎么办?INITIALIZE函数很好的解决了这个问题,通过设置种子值,则每次生成随机序列都是一样的:
SET serveroutput ON
BEGIN
  dbms_random.initialize(100);
  FOR i IN 1 .. 10
  LOOP
    dbms_output.put_line(dbms_random.random);
  END LOOP;
END;

--3. DBMS_RANDOM.SEED():功能和INITIALIZE函数类似,实际上,INITIALIZE函数被淘汰,推荐的替代函数即是SEED函数。与INITIALIZE函数不同的是SEED函数同时支持数值和字符作为种子值,而INITIALIZE函数支持数值。
SET serveroutput ON
BEGIN  
  dbms_random.seed('A');  
  FOR i IN 1 .. 10 LOOP  
    dbms_output.put_line(round(dbms_random.value * 100));  
  END LOOP;  
END;   

注: 如果种子为字符串,则最大长度不超过2000。


--4. DBMS_RANDOM.STRING(opt IN CHAR,len IN NUMBER): 随机生成字符串,关于opt和len的参数说明如下:

示例:
select 
dbms_random.string('u',8) "u",dbms_random.string('U',8) "U",dbms_random.string('l',8) "l",dbms_random.string('L',8) "L",dbms_random.string('a',8) "a",dbms_random.string('A',8) "A",dbms_random.string('p',8) "p",dbms_random.string('P',8) "P"
from dual;



--5. DBMS_RANDOM.random:random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数,RANDOM返回值的范围为: [-2^31,2^31),返回的是整数.

示例: 随机生成10个随机数:
--6. DBMS_RANDOM.terminate(): 该函数用来在使用完DBMS_RANDOM包后,用该函数进行终止。该函数在11gR1中即不推荐使用了。
例如:
sql> exec DBMS_RANDOM.TERMINATE;

--7. DBMS_RANDOM.normal:norMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

示例:
select dbms_random.normal from dual connect by level<=10;


本文系原创,转载请表明出处!

原文地址:https://www.jb51.cc/oracle/211451.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐