RNGDA
Generates pseudorandom numbers from a general discrete distribution using an alias method.
Required Arguments
IOPT — Indicator of whether the alias vectors are to be initialized. (Input)
IOPT
Action
0
The alias vectors are to be initialized using the probabilities in PROBS. IOPT is set to 0 on the first call to RNGDA.
1
The alias vectors IWK and WK are used but PROBS is not used.
IMIN — Smallest value the random deviate can assume. (Input)
This is the value corresponding to the probability in PROBS(1).
PROBS — Vector of length NMASS containing probabilities associated with the individual mass points. (Input)
The elements of PROBS must be nonnegative and must sum to 1.0.
IWK — Index vector of length NMASS. (Input, if IOPT = 1; Output, if IOPT = 0) IWK is a work vector.
WK — Index vector of length NMASS. (Input, if IOPT = 1; Output, if IOPT = 0) WK is a work vector.
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).
NMASS — Number of mass points in the discrete distribution. (Input)
Default: NMASS = size (PROBS,1).
FORTRAN 90 Interface
Generic: CALL RNGDA (IOPT, IMIN, PROBS, IWK, WK, IR [])
Specific: The specific interface names are S_RNGDA and D_RNGDA.
FORTRAN 77 Interface
Single: CALL RNGDA (NR, IOPT, IMIN, NMASS, PROBS, IWK, WK, IR)
Double: The double precision name is DRNGDA.
Description
Routine RNGDA generates pseudorandom numbers from a discrete distribution with probability function given in the vector PROBS; that is
Pr(X = i) = pj
for
The algorithm is the alias method, due to Walker (1974), with modifications suggested by Kronmal and Peterson (1979). The method involves a setup phase, in which the vectors IWK and WK are filled. After the vectors are filled, the generation phase is very fast.
Comments
1. In the interest of efficiency, this routine does only limited error checking when
IOPT = 1.
2. 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
In this example, RNGDA 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
When RNGDA is called the first time, IOPT is input as 0. This causes the work arrays to be initialized. In the next call, IOPT is 1, so the setup phase is bypassed.
 
USE RNGDA_INT
USE UMACH_INT
USE RNSET_INT
 
IMPLICIT NONE
INTEGER NMASS, NR
PARAMETER (NMASS=5, NR=5)
!
INTEGER IMIN, IOPT, IR(NR), ISEED, IWK(NMASS), NOUT
REAL PROBS(NMASS), WK(NMASS)
!
CALL UMACH (2, NOUT)
IMIN = 1
PROBS(1) = 0.05
PROBS(2) = 0.45
PROBS(3) = 0.31
PROBS(4) = 0.04
PROBS(5) = 0.15
IOPT = 0
ISEED = 123457
CALL RNSET (ISEED)
CALL RNGDA (IOPT, IMIN, PROBS, IWK, WK, IR)
WRITE (NOUT,99998) IR
99998 FORMAT (' Random deviates: ', 5I4)
IOPT = 1
CALL RNGDA (IOPT, IMIN, PROBS, IWK, WK, IR)
WRITE (NOUT,99999) IR
99999 FORMAT (' ', 5I4)
END
Output
 
Random deviates: 3 2 2 3 5
1 3 4 5 3
Example 2
In this example, RNGDA is used to generate five pseudorandom binomial variates with parameters 20 and 0.5.
 
USE UMACH_INT
USE RNSET_INT
USE RNGDA_INT
USE BINPR_INT
 
IMPLICIT NONE
INTEGER NMASS, NR
PARAMETER (NMASS=21, NR=5)
!
INTEGER IMIN, IOPT, IR(NR), ISEED, IWK(NMASS), K, N, NOUT
REAL P, PROBS(NMASS), WK(NMASS)
!
CALL UMACH (2, NOUT)
N = 20
P = 0.5
IMIN = 0
DO 10 K=1, NMASS
PROBS(K) = BINPR(K-1,N,P)
10 CONTINUE
IOPT = 0
ISEED = 123457
CALL RNSET (ISEED)
CALL RNGDA (IOPT, IMIN, PROBS, IWK, WK, IR)
 
WRITE (NOUT,99999) IR
99999 FORMAT (' Binomial (20, .5) deviates: ', 5I4)
END
Output
 
Binomial (20, .5) deviates: 12 10 16 12 11