Mega Code Archive

 
Categories / Oracle PLSQL Tutorial / Function Procedure Packages
 

Generate Random number

SQL> REM 05-RAND.SQL SQL> REM This file contains the code for the Random package in SQL> REM Chapter 5 of "Oracle PL/SQL Programming".  It illustrates SQL> REM package initialization. SQL> SQL> REM This is version 1.0 of this file, updated 2/18/96. SQL> REM Comments and questions should go to Scott Urman at SQL> REM surman@us.oracle.com. SQL> SQL> CREATE OR REPLACE PACKAGE Random AS   2  /* Random number generator.  Uses the same algorithm as the   3     rand() function in C. */   4   5    -- Used to change the seed.  From a given seed, the same   6    -- sequence of random numbers will be generated.   7    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER);   8   9    -- Returns a random integer between 1 and 32767.  10    FUNCTION Rand RETURN NUMBER;  11    --PRAGMA RESTRICT_REFERENCES(rand, WNDS );  12  13    -- Same as Rand, but with a procedural interface.  14    PROCEDURE GetRand(p_RandomNumber OUT NUMBER);  15  16    -- Returns a random integer between 1 and p_MaxVal.  17    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER;  18   -- PRAGMA RESTRICT_REFERENCES(RandMax, WNDS);  19  20    -- Same as RandMax, but with a procedural interface.  21    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,  22                         p_MaxVal IN NUMBER);  23  END Random;  24  / Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY Random AS   2   3    /* Used for calculating the next number. */   4    v_Multiplier  CONSTANT NUMBER := 22695477;   5    v_Increment   CONSTANT NUMBER := 1;   6   7    /* Seed used to generate random sequence. */   8    v_Seed        number := 1;   9  10    PROCEDURE ChangeSeed(p_NewSeed IN NUMBER) IS  11    BEGIN  12      v_Seed := p_NewSeed;  13    END ChangeSeed;  14  15    FUNCTION Rand RETURN NUMBER IS  16    BEGIN  17      v_Seed := MOD(v_Multiplier * v_Seed + v_Increment,  18                    (2 ** 32));  19      RETURN BITAND(v_Seed/(2 ** 16), 32767);  20    END Rand;  21  22    PROCEDURE GetRand(p_RandomNumber OUT NUMBER) IS  23    BEGIN  24      -- Simply call Rand and return the value.  25      p_RandomNumber := Rand;  26    END GetRand;  27  28    FUNCTION RandMax(p_MaxVal IN NUMBER) RETURN NUMBER IS  29    BEGIN  30      RETURN MOD(Rand, p_MaxVal) + 1;  31    END RandMax;  32  33    PROCEDURE GetRandMax(p_RandomNumber OUT NUMBER,  34                         p_MaxVal IN NUMBER) IS  35    BEGIN  36      -- Simply call RandMax and return the value.  37      p_RandomNumber := RandMax(p_MaxVal);  38    END GetRandMax;  39  40  BEGIN  41    /* Package initialization.  Initialize the seed to the current  42       time in seconds. */  43    ChangeSeed(TO_NUMBER(TO_CHAR(SYSDATE, 'SSSSS')));  44  END Random;  45  / Package body created. SQL>