Chapter 18: Random Number Generation

RNGDT

Generates pseudorandom numbers from a general discrete distribution using a table lookup method.

Required Arguments

IMIN — Smallest value the random deviate can assume.   (Input)
This is the value corresponding to the probability in CUMPR(1).

NMASS — Number of mass points in the discrete distribution.   (Input)

CUMPR — Vector of length at least NMASS + 1 containing in the first NMASS positions the cumulative probabilities and, possibly, indexes to speed access to the probabilities.   (Input)
IMSL routine RNGDS can be used to initialize CUMPR properly. If no elements of CUMPR are used as indexes, CUMPR(NMASS + 1) is 0.0 on input. The value in CUMPR(1) is the probability of IMIN. The value in CUMPR(NMASS) must be exactly 1.0 (since this is the CDF at the upper range of the distribution.

IR — Vector of length NR containing the random discrete deviates.   (Output)

Optional Arguments

NR — Number of random numbers to generate.   (Input)
Default: NR = size (IR,1).

FORTRAN 90 Interface

Generic:                              CALL RNGDT (IMIN, NMASS, CUMPR, IR [,…])

Specific:                             The specific interface names are S_RNGDT and D_RNGDT.

FORTRAN 77 Interface

Single:                                CALL RNGDT (NR, IMIN, NMASS, CUMPR, IR)

Double:                              The double precision name is DRNGDT.

Description

Routine RNGDT generates pseudorandom deviates from a discrete distribution, using the table CUMPR, which contains the cumulative probabilities of the distribution and, possibly, indexes to speed the search of the table. The routine RNGDS can be used to set up the table CUMPR. RNGDT uses the inverse CDF method to generate the variates.

Comments

1.         Informational error

Type Code

3         1                  The value in CUMPR(NMASS) is not exactly 1.0, but it was considered close enough to 1.0 that is was set to that value.

2.         In the interest of efficiency, this routine does only limited error checking. If CUMPR is generated by the routine RNGDS, the error checking is sufficient.

3.         The routine RNSET can be used to initialize the seed of the random number generator. The routine RNOPT can be used to select the form of the generator.

Example 1

These examples are the same ones used for the routine RNGDS. In this first example, RNGDS is used to set up a table and then RNGDT is used to generate five pseudorandom variates from the discrete distribution:

Pr(X = 1) = .05

Pr(X = 2) = .45

Pr(X = 3) = .31

Pr(X = 4) = .04

Pr(X = 5) = .15

The cumulative probabilities are input directly in CUMPR, and three indexes are computed by RNGDS (NNDX = 4 ). Since the number of mass points is so small, the indexes would not have much effect on the speed of the generation of the random variates.

 

      USE UMACH_INT

      USE RNGDS_INT

      USE RNSET_INT

      USE RNGDT_INT

 

      IMPLICIT   NONE

      INTEGER    LCUMPR, NR

      PARAMETER  (LCUMPR=9, NR=5)

!

      INTEGER    IMIN, IOPT, IR(NR), ISEED, NMASS, NNDX, NOUT

      REAL       CUMPR(LCUMPR), DEL, PRF

      EXTERNAL   PRF

!

      CALL UMACH (2, NOUT)

      IMIN     = 1

      NMASS    = 5

      CUMPR(1) = 0.05

      CUMPR(2) = 0.50

      CUMPR(3) = 0.81

      CUMPR(4) = 0.85

      CUMPR(5) = 1.00

      IOPT     = 1

      NNDX     = 4

      DEL      = 0.00001

!                                 Set up table

      CALL RNGDS (PRF, DEL, NNDX, IMIN, NMASS, CUMPR, IOPT=IOPT)

      ISEED = 123457

      CALL RNSET (ISEED)

!                                 Generate variates

      CALL RNGDT (IMIN, NMASS, CUMPR, IR)

      WRITE (NOUT,99999) IR

99999 FORMAT (' Discrete random deviates: ', 5I4)

      END

!

!                                 Dummy function

      REAL FUNCTION PRF (IX)

      INTEGER    IX

!

      PRF = 0.0

      RETURN

      END

Output

 

Discrete random deviates:    5   2   3   3   4

Additional Example

Example 2

In this example, RNGDS is used to set up a table and then RNGDT is used to generate five pseudorandom variates from the binomial distribution with parameters 20 and 0.5. The routine BINPR (see Chapter 17, Probability Distributions Functions and Inverses;) is used to compute the probabilities.

 

      USE UMACH_INT

      USE RNGDS_INT

      USE RNSET_INT

      USE RNGDT_INT

 

      IMPLICIT   NONE

      INTEGER    LCUMPR, NR

      PARAMETER  (LCUMPR=33, NR=5)

!

 

      INTEGER    IMIN, IR(NR), ISEED, NMASS, NNDX, NOUT

      REAL       CUMPR(LCUMPR), DEL, PRF

      EXTERNAL   PRF

!

      CALL UMACH (2, NOUT)

      IMIN  = 0

      NMASS = 21

      NNDX  = 12

      DEL   = 0.00001

!                                 Set up table

      CALL RNGDS (PRF, DEL, NNDX, IMIN, NMASS, CUMPR)

      ISEED = 123457

      CALL RNSET (ISEED)

!                                 Generate variates

      CALL RNGDT (IMIN, NMASS, CUMPR, IR)

      WRITE (NOUT,99999) IR

99999 FORMAT (' Binomial (20, 0.5) random deviates: ', 5I4)

      END

!

!                                 Compute binomial probabilities

      REAL FUNCTION PRF (IX)

      USE BINPR_INT

      INTEGER    IX

!

      PRF = BINPR(IX,20,0.5)

      RETURN

      END

Output

 

Binomial (20, 0.5) random deviates:   14   9  12  10  12



http://www.vni.com/
PHONE: 713.784.3131
FAX:713.781.9260