
RANDLIB.C Library of C Routines for Random Number Generation Version 1.3 -- August, 1997 README Compiled and Written by: Barry W. Brown James Lovato Kathy Russell John Venier 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. THANKS TO OUR SUPPORTERS This work was supported in part by grant CA-16672 from the National Cancer Institute. We are grateful to Larry and Pat McNeil of Corpus Cristi for their generous support. Some equipment used in this effort was provided by IBM as part of a cooperative study agreement; we thank them. SUMMARY OF RANDLIB The bottom level routines provide 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. Packaging is provided so that if these capabilities are not needed, a single generator with period 2.3 X 10^18 is seen. Using this base, routines are provided that return: (1) Beta random deviates (2) Chi-square random deviates (3) Exponential random deviates (4) F random deviates (5) Gamma random deviates (6) Multivariate normal random deviates (mean and covariance matrix specified) (7) Noncentral chi-square random deviates (8) Noncentral F random deviates (9) Univariate normal random deviates (10) Random permutations of an integer array (11) Real uniform random deviates between specified limits (12) Binomial random deviates (13) Negative Binomial random deviates (14) Multinomial random deviates (15) Poisson random deviates (16) Integer uniform deviates between specified limits (17) Seeds for the random number generator calculated from a character string COMMENTS ON THE C VERSION OF RANDLIB The C version was obtained by converting the original Fortran RANDLIB to C using PROMULA.FORTRAN and performing some hand crafting of the result. Information on PROMULA.FORTRAN can be obtained from PROMULA Development Corporation 3620 N. High Street, Suite 301 Columbus, Ohio 43214 (614) 263-5454 RANDLIB.C was tested using the xlc compiler under AIX 3.1 on an IBM RS/6000. The code was also examined with lint on the same system. The RANDLIB test programs were also successfully run using the gcc compiler (see below) on a Solbourne. RANDLIB.C can be obtained from statlib. Send mail whose message is 'send randlib.c.shar from general' to statlib@lib.stat.cmu.edu. RANDLIB.C can also be obtained by anonymous ftp to odin.mdacc.tmc.edu (143.111.62.32) where is is available as /pub/source/randlib.c-1.2.tar.Z For obvious reasons, the original RANDLIB (in Fortran) has been renamed to /pub/source/randlib.f-1.2.tar.Z on the same machine. CAVEAT RANDLIB.C is written in ANSI C and makes heavy use of prototypes. It will not compile under old style (KR) C compilers (such as the default Sun cc compiler). The decision to distribute in ANSI C was mine; the version of Promula that was used -- 2.0 -- writes old style headers. Converting RANDLIB to old style C is not a totally trivial task; the type of many arguments to functions will have to be changed from float to double. Also note that all ints have been changed to longs. This is a result of my being a Fortraner, a novice at C, and knowing that the underlying generators require at least a 32 bit integer. I don't recommend conversion to an obsolete C dialect. Instead, get the Free Software Foundation's excellent ANSI C compiler, gcc. It compiles KR C as well as ANSI C. A version of gcc that runs on many varieties of Unix is available by anonymous ftp as /pub/gnu/gcc-1.40.tar.Z at prep.ai.mit.edu (18.71.0.38). A Vax version is also present on /pub/gnu. The compilers are also available on tape. Write the Free Software Foundation at: Free Software Foundation, Inc. 675 Massachusetts Avenue Cambridge, MA 02139 Phone: (617) 876-3296 A MSDOS port of gcc, performed by DJ Delorie is also available by ftp. File location: host: grape.ecs.clarkson.edu login: ftp password: send your e-mail address directory: ~ftp/pub/msdos/djgcc File in .ZIP format - djgpp.zip - one 2.2M file, contains everything. INSTALLATION Directory src contains the C source for most of the routines. The files com.c and randlib.c constitute RANDLIB. The file randlib.h contains prototypes for the RANDLIB routines that should be used (and not for a few internal routines). The C code from these directories should be compiled and placed in a library. Directory test contains three test programs for this code. The file randlib.h in directory test is a copy of that in src. DOCUMENTATION Documentation is in directory doc on the distribution. All of the documentation is in the form of character (ASCII) files. An explanation of the concepts involved in the base generator and details of its implementation are contained in Basegen.doc. A summary of all of the available routines is contained in randlib.chs (chs is an abbreviation of 'cheat sheet'). The 'chs' file will probably be the reference to randlib that is primarily used. The file, randlib.fdoc, contains all comments heading each routine. There is somewhat more information in 'fdoc' than 'chs', but the additional information consists primarily of references to the literature. SOURCES The following routines, which were written by others and lightly modified for consistency in packaging, are included in RANDLIB. Bottom Level Routines These routines are a transliteration of the Pascal in the reference to Fortran. L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package with Splitting Facilities." ACM Transactions on Mathematical Software, 17:98-111 (1991) Exponential This code was obtained from Netlib. Ahrens, J.H. and Dieter, U. Computer Methods for Sampling From the Exponential and Normal Distributions. Comm. ACM, 15,10 (Oct. 1972), 873 - 882. Gamma (Case R >= 1.0) Ahrens, J.H. and Dieter, U. Generating Gamma Variates by a Modified Rejection Technique. Comm. ACM, 25,1 (Jan. 1982), 47 - 54. Algorithm GD (Case 0.0 <= R <= 1.0) Ahrens, J.H. and Dieter, U. Computer Methods for Sampling from Gamma, Beta, Poisson and Binomial Distributions. Computing, 12 (1974), 223-246. Adaptation of algorithm GS. Normal This code was obtained from netlib. Ahrens, J.H. and Dieter, U. Extensions of Forsythe's Method for Random Sampling from the Normal Distribution. Math. Comput., 27,124 (Oct. 1973), 927 - 937. Binomial This code was kindly sent me by Dr. Kachitvichyanukul. Kachitvichyanukul, V. and Schmeiser, B. W. Binomial Random Variate Generation. Communications of the ACM, 31, 2 (February, 1988) 216. Poisson This code was obtained from netlib. Ahrens, J.H. and Dieter, U. Computer Generation of Poisson Deviates From Modified Normal Distributions. ACM Trans. Math. Software, 8, 2 (June 1982),163-179 Beta This code was written by us following the recipe in the following. R. C. H. Cheng Generating Beta Variables with Nonintegral Shape Parameters. Communications of the ACM, 21:317-322 (1978) (Algorithms BB and BC) Linpack Routines SPOFA and SDOT are used to perform the Cholesky decomposition of the covariance matrix in SETGMN (used for the generation of multivariate normal deviates). Dongarra, J. J., Moler, C. B., Bunch, J. R. and Stewart, G. W. Linpack User's Guide. SIAM Press, Philadelphia. (1979) LEGALITIES Code that appeared in an ACM publication is subject to their algorithms policy: Submittal of an algorithm for publication in one of the ACM Transactions implies that unrestricted use of the algorithm within a computer is permissible. General permission to copy and distribute the algorithm without fee is granted provided that the copies are not made or distributed for direct commercial advantage. The ACM copyright notice and the title of the publication and its date appear, and notice is given that copying is by permission of the Association for Computing Machinery. To copy otherwise, or to republish, requires a fee and/or specific permission. Krogh, F. Algorithms Policy. ACM Tran. Math. Softw. 13(1987), 183-186. We place the Randlib code that we have written in the public domain. NO WARRANTY WE PROVIDE ABSOLUTELY NO WARRANTY OF ANY KIND EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THIS PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS OR ANY OF ITS COMPONENT INSTITUTIONS INCLUDING M. D. ANDERSON HOSPITAL BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA OR ITS ANALYSIS BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES) THE PROGRAM. (Above NO WARRANTY modified from the GNU NO WARRANTY statement.) WHAT'S NEW IN VERSION 1.1? Random number generation for the Negative Binomial and Multinomial distributions has been included. Two errors in the code which generates random numbers from the Gamma distribution were fixed. WHAT'S NEW IN VERSION 1.2? We changed the name of the package from 'ranlib' to 'randlib'. This was done so that we can determine who archives it. 'ranlib' is the name of a Unix utility which produces many spurious hits on a web search engine. The linpack file is now housed in the /src directory. In several routines, argument checking was implemented; the code now breaks if inappropriate values are passed to it. In 'randlib.c': genbet: A and B must be >= 1.0E-37 instead of 0.0 genexp: AV must be >= 0.0 gengam: A and R both must be > 0.0 gennor: SD must be >= 0.0 ignbin: N must be >= 0, and 0.0 <= PP <= 1.0. ignnbn: N must be > 0, 0.0 < P < 1.0 (previously allowed N = 0) ignpoi: MU must be >= 0.0 For the Non-Central Chi-Squared and Non-Central F distributions, the case DF = 1.0 (DFN = 1.0 for the F) is now allowed. Functions gennch and gennf in 'randlib.c' The phrase-to-seed function (phrtsd in 'randlib.c') was changed to produce seeds which are the same as those generated by the Fortran version, for consistency between implementations. As a result, it produces seeds which are in general different from those produced before the change. Wherever possible, the user-accessible code now calls the base generators directly. This means improved performance and fewer dependencies, but the routines should work exactly as before from the user's point of view. Functions genchi, genf, gennch, gennf, and ignnbn in 'randlib.c' Many minor modifications have been made which should make the code more robust, without changing how the code is used. Functions genbet, ignbin, ignpoi, phrtsd and ignuin in 'randlib.c' 'com.c' 'tstmid.c' 'tstgmn.c' Finally, five distributions have been added to the mid-level tester, which test the Exponential, Gamma, Multinomial, Negative Binomial, and Normal distributions. 'tstmid.c' WHAT'S NOT NEW IN VERSION 1.2 ? No calling sequences have changed. WHAT'S NEW IN VERSION 1.3? Minor changes were made in two routines (sgamma and sexpo in 'randlib.c') to fix unusual bugs. The protection from overflow in deviate generation in two routines (genf and gennf in 'randlib.c') was changed to prevent a constant from underflowing at compile time. WHAT'S NOT NEW IN VERSION 1.3 ? No calling sequences have changed. MANY THANKS The authors would like to thank the many users who have reported bugs and suggested improvements; Randlib would not be the same today without them. We heartily encourage others to join them.