Mercurial > octave
diff libcruft/ranlib/Basegen.doc @ 2330:12ff450cbb1f
[project @ 1996-07-19 01:39:22 by jwe]
Initial revision
author | jwe |
---|---|
date | Fri, 19 Jul 1996 01:49:31 +0000 |
parents | |
children | df7c57a6639d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/ranlib/Basegen.doc Fri Jul 19 01:49:31 1996 +0000 @@ -0,0 +1,382 @@ + + + + + + + + + + + + RANLIB + + Library of Fortran Routines for Random Number Generation + + + + + + + + + Base Generator Documentation + + + + + + + + + Compiled and Written by: + + Barry W. Brown + James Lovato + + + + + + + + + + + Department of Biomathematics, Box 237 + The University of Texas, M.D. Anderson Cancer Center + 1515 Holcombe Boulevard + Houston, TX 77030 + + + This work was supported by grant CA-16672 from the National Cancer Institute. + + + + + Base Random Number Generator + + + +I. OVERVIEW AND DEFAULT BEHAVIOR + +This set of programs contains 32 virtual random number generators. +Each generator can provide 1,048,576 blocks of numbers, and each block +is of length 1,073,741,824. Any generator can be set to the beginning +or end of the current block or to its starting value. The methods are +from the paper cited immediately below, and most of the code is a +transliteration from the Pascal of the paper into Fortran. + +P. L'Ecuyer and S. Cote. Implementing a Random Number Package with +Splitting Facilities. ACM Transactions on Mathematical Software 17:1, +pp 98-111. + +Most users won't need the sophisticated capabilities of this package, +and will desire a single generator. This single generator (which will +have a non-repeating length of 2.3 X 10^18 numbers) is the default. +In order to accommodate this use, the concept of the current generator +is added to those of the cited paper; references to a generator are +always to the current generator. The current generator is initially +generator number 1; it can be changed by SETCGN, and the ordinal +number of the current generator can be obtained from GETCGN. + +The user of the default can set the initial values of the two integer +seeds with SETALL. If the user does not set the seeds, the random +number generation will use the default values, 1234567890 and +123456789. The values of the current seeds can be achieved by a call +to GETSD. Random number may be obtained as integers ranging from 1 to +a large integer by reference to function IGNLGI or as a floating point +number between 0 and 1 by a reference to function RANF. These are the +only routines needed by a user desiring a single stream of random +numbers. + +II. CONCEPTS + +A stream of pseudo-random numbers is a sequence, each member of which +can be obtained either as an integer in the range 1..2,147,483,563 or +as a floating point number in the range [0..1]. The user is in charge +of which representation is desired. + +The method contains an algorithm for generating a stream with a very +long period, 2.3 X 10^18. This stream in partitioned into G (=32) +virtual generators. Each virtual generator contains 2^20 (=1,048,576) +blocks of non-overlapping random numbers. Each block is 2^30 +(=1,073,741,824) in length. + + + +Base Random Number Generator Page 2 + + +The state of a generator is determined by two integers called seeds. +The seeds can be initialized by the user; the initial values of the +first must lie between 1 and 2,147,483,562, that of the second between +1 and 2,147,483,398. Each time a number is generated, the values of +the seeds change. Three values of seeds are remembered by the +generators at all times: the value with which the generator was +initialized, the value at the beginning of the current block, and the +value at the beginning of the next block. The seeds of any generator +can be set to any of these three values at any time. + + Of the 32 virtual generators, exactly one will be the current +generator, i.e., that one will be used to generate values for IGNLGI +and RANDF. Initially, the current generator is set to number one. +The current generator may be changed by calling SETCGN, and the number +of the current generator can be obtained using GETCGN. + +III. AN EXAMPLE + +An example of the need for these capabilities is as follows. Two +statistical techniques are being compared on data of different sizes. +The first technique uses bootstrapping and is thought to be as +accurate using less data than the second method which employs only +brute force. + +For the first method, a data set of size uniformly distributed between +25 and 50 will be generated. Then the data set of the specified size +will be generated and alalyzed. The second method will choose a data +set size between 100 and 200, generate the data and alalyze it. This +process will be repeated 1000 times. + +For variance reduction, we want the random numbers used in the two +methods to be the same for each of the 1000 comparisons. But method +two will use more random numbers than method one and without this +package, synchronization might be difficult. + +With the package, it is a snap. Use generator 1 to obtain the sample +size for method one and generator 2 to obtain the data. Then reset +the state to the beginning of the current block and do the same for +the second method. This assures that the initial data for method two +is that used by method one. When both have concluded, advance the +block for both generators. + +IV. THE INTERFACE + +A random number is obtained either as a random integer between 1 and +2,147,483,562 by invoking integer function IGNLGI (I GeNerate LarGe +Integer) or as a random floating point number between 0 and 1 by +invoking real function RANF. Neither function has arguments. + +The seed of the first generator can be set by invoking subroutine +SETALL; the values of the seeds of the other 31 generators are +calculated from this value. + + + +Base Random Number Generator Page 3 + + +The number of the current generator can be set by calling subroutine +SETCGN, which takes a single argument, the integer generator number in +the range 1..32. The number of the current generator can be obtained +by invoking subroutine GETCGN which returns the number in its single +integer argument. + + +V. CALLING SEQUENCES + + A. SETTING THE SEED OF ALL GENERATORS + +C********************************************************************** +C +C SUBROUTINE SETALL(ISEED1,ISEED2) +C SET ALL random number generators +C +C Sets the initial seed of generator 1 to ISEED1 and ISEED2. The +C initial seeds of the other generators are set accordingly, and +C all generators states are set to these seeds. +C +C Arguments +C +C +C ISEED1 -> First of two integer seeds +C INTEGER ISEED1 +C +C ISEED2 -> Second of two integer seeds +C INTEGER ISEED1 +C +C********************************************************************** + + + B. OBTAINING RANDOM NUMBERS + +C********************************************************************** +C +C INTEGER FUNCTION IGNLGI() +C GeNerate LarGe Integer +C +C Returns a random integer following a uniform distribution over +C (1, 2147483562) using the current generator. +C +C********************************************************************** + +C********************************************************************** +C +C REAL FUNCTION RANF() +C RANDom number generator as a Function +C +C Returns a random floating point number from a uniform distribution +C over 0 - 1 (endpoints of this interval are not returned) using the +C current generator +C +C********************************************************************** + + + +Base Random Number Generator Page 4 + + + C. SETTING AND OBTAINING THE NUMBER OF THE CURRENT GENERATOR + +C********************************************************************** +C +C SUBROUTINE SETCGN( G ) +C Set GeNerator +C +C Sets the current generator to G. All references to a generator +C are to the current generator. +C +C Arguments +C +C G --> Number of the current random number generator (1..32) +C INTEGER G +C +C********************************************************************** + +C********************************************************************** +C +C SUBROUTINE GETCGN(G) +C Get GeNerator +C +C Returns in G the number of the current random number generator +C +C Arguments +C +C G <-- Number of the current random number generator (1..32) +C INTEGER G +C +C********************************************************************** + + D. OBTAINING OR CHANGING SEEDS IN CURRENT GENERATOR + +C********************************************************************** +C +C SUBROUTINE ADVNST(K) +C ADV-a-N-ce ST-ate +C +C Advances the state of the current generator by 2^K values and +C resets the initial seed to that value. +C +C Arguments +C +C +C K -> The generator is advanced by 2^K values +C INTEGER K +C +C********************************************************************** + + + +Base Random Number Generator Page 5 + + +C********************************************************************** +C +C SUBROUTINE GETSD(ISEED1,ISEED2) +C GET SeeD +C +C Returns the value of two integer seeds of the current generator +C +C Arguments +C +C +C +C ISEED1 <- First integer seed of generator G +C INTEGER ISEED1 +C +C ISEED2 <- Second integer seed of generator G +C INTEGER ISEED1 +C +C********************************************************************** + +C********************************************************************** +C +C SUBROUTINE INITGN(ISDTYP) +C INIT-ialize current G-e-N-erator +C +C Reinitializes the state of the current generator +C +C Arguments +C +C +C ISDTYP -> The state to which the generator is to be set +C ISDTYP = -1 => sets the seeds to their initial value +C ISDTYP = 0 => sets the seeds to the first value of +C the current block +C ISDTYP = 1 => sets the seeds to the first value of +C the next block +C +C INTEGER ISDTYP +C +C********************************************************************** + +C********************************************************************** +C +C SUBROUTINE SETSD(ISEED1,ISEED2) +C SET S-ee-D of current generator +C +C Resets the initial seed of the current generator to ISEED1 and +C ISEED2. The seeds of the other generators remain unchanged. +C +C Arguments +C +C +C ISEED1 -> First integer seed +C INTEGER ISEED1 +C +C ISEED2 -> Second integer seed +C INTEGER ISEED1 +C +C********************************************************************** + + + +Base Random Number Generator Page 6 + + + E. MISCELLANY + +C********************************************************************** +C +C INTEGER FUNCTION MLTMOD(A,S,M) +C +C Returns (A*S) MOD M +C +C Arguments +C +C +C A, S, M --> +C INTEGER A,S,M +C +C********************************************************************** + +C********************************************************************** +C +C SUBROUTINE SETANT(QVALUE) +C SET ANTithetic +C +C Sets whether the current generator produces antithetic values. If +C X is the value normally returned from a uniform [0,1] random +C number generator then 1 - X is the antithetic value. If X is the +C value normally returned from a uniform [0,N] random number +C generator then N - 1 - X is the antithetic value. +C +C All generators are initialized to NOT generate antithetic values. +C +C Arguments +C +C QVALUE -> .TRUE. if generator G is to generating antithetic +C values, otherwise .FALSE. +C LOGICAL QVALUE +C +C**********************************************************************