Generates pseudorandom numbers from a general discrete distribution using a table lookup method.
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)
NR — Number of
random numbers to generate. (Input)
Default: NR = size (IR,1).
Generic: CALL RNGDT (IMIN, NMASS, CUMPR, IR [,…])
Specific: The specific interface names are S_RNGDT and D_RNGDT.
Single: CALL RNGDT (NR, IMIN, NMASS, CUMPR, IR)
Double: The double precision name is DRNGDT.
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.
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.
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
Discrete random deviates: 5 2 3 3 4
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
Binomial (20, 0.5) random deviates: 14 9 12 10 12
PHONE: 713.784.3131 FAX:713.781.9260 |