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

Description

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.

Examples

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

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 Distribution 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