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