RNGCT
Generates pseudorandom numbers from a general continuous distribution.
Required Arguments
TABLE —
NDATA by 5 table to be used for interpolation of the cumulative distribution function. (Input)
The first column of
TABLE contains abscissas of the cumulative distribution function in ascending order, the second column contains the values of the CDF (which must be strictly increasing beginning with 0.0 and ending at 1.0) and the remaining columns contain values used in interpolation. This table is set up using routine
RNGCS.
R — Vector of length NR containing the random deviates. (Output)
Optional Arguments
NR — Number of random numbers to generate. (Input)
Default: NR = size (R,1).
NDATA — Number of points at which the cumulative distribution function is evaluated for interpolation. (Input)
NDATA must be greater than or equal to 4.
Default: NDATA = size (TABLE,1).
LDTABL — Leading dimension of TABLE exactly as specified in the dimension statement in the calling program. (Input)
Default: LDTABL = size (TABLE,1).
FORTRAN 90 Interface
Generic: CALL RNGCT (TABLE, R [, …])
Specific: The specific interface names are S_RNGCT and D_RNGCT.
FORTRAN 77 Interface
Single: CALL RNGCT (NR, NDATA, TABLE, LDTABL, R)
Double: The double precision name is DRNGCT.
Description
Routine
RNGCT generates pseudorandom numbers from a continuous distribution using the inverse CDF technique, by interpolation of points of the distribution function given in
TABLE, which is set up by routine
RNGCS. A strictly monotone increasing distribution function is assumed. The interpolation is by an algorithm attributable to Akima (1970), using piecewise cubics. The use of this technique for generation of random numbers is due to Guerra, Tapia, and Thompson (1976), who give a description of the algorithm and accuracy comparisons between this method and linear interpolation. The relative errors using the Akima interpolation are generally considered very good.
Comments
1. 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.
2. In the interest of efficiency, this routine does only limited error checking. If
TABLE is generated by the routine
RNGCS, the error checking is sufficient.
Example
In this example,
RNGCS is used to set up a table for generation of beta pseudorandom deviates. The CDF for this distribution is computed by the routine
BETDF (see
Chapter 17, “Probability Distribution Function and Inverses”). The table contains 100 points at which the CDF is evaluated and that are used for interpolation.
USE RNGCT_INT
USE UMACH_INT
USE RNGCS_INT
USE RNSET_INT
IMPLICIT NONE
INTEGER LDTABL, NR
PARAMETER (LDTABL=100, NR=5)
!
INTEGER I, IOPT, ISEED, NINT, NOUT
REAL CDF, PIN, QIN, R(NR), TABLE(LDTABL,5), X
COMMON /BCOM/ PIN, QIN
EXTERNAL CDF
!
CALL UMACH (2, NOUT)
PIN = 3.0
QIN = 2.0
IOPT = 0
NINT = 100
X = 0.0
! Fill the first column of the table
! with abscissas for interpolation.
DO 10 I=1, NINT
TABLE(I,1) = X
X = X + 0.01
10 CONTINUE
CALL RNGCS (CDF, IOPT, TABLE)
! Initialize seed of random number
! generator.
ISEED = 123457
CALL RNSET (ISEED)
! Now generate the random deviates.
CALL RNGCT (TABLE, R)
WRITE (NOUT,99999) R
99999 FORMAT (' Beta (3,2) random deviates: ', 5F7.4)
END
!
! Beta distribution function
REAL FUNCTION CDF (X)
REAL X
!
REAL BETDF, PIN, QIN
COMMON /BCOM/ PIN, QIN
EXTERNAL BETDF
!
CDF = BETDF(X,PIN,QIN)
RETURN
END
Output
*** WARNING ERROR 1 from RNGCS. The values of the CDF in the second
*** column of TABLE did not begin at 0.0 and end at 1.0, but they
*** have been adjusted. Prior to adjustment,
*** TABLE(1,2) = 0.000000E+00 and TABLE(NDATA,2) = 9.994079E-01.
Beta (3,2) random deviates: 0.9208 0.4641 0.7668 0.6536 0.8171