Random Number Generation¶ ↑
The library provides a large collection of random number generators which can be accessed through a uniform interface. Environment variables allow you to select different generators and seeds at runtime, so that you can easily switch between generators without needing to recompile your program. Each instance of a generator keeps track of its own state, allowing the generators to be used in multi-threaded programs. Additional functions are available for transforming uniform random numbers into samples from continuous or discrete probability distributions such as the Gaussian, log-normal or Poisson distributions.
General comments on random numbers
The Random Number Generator Interface: GSL::Rng class
Random number generator initialization
Sampling from a random number generator
Auxiliary random number generator functions
Random number environment variables
General comments on random numbers¶ ↑
In 1988, Park and Miller wrote a paper entitled “Random number generators: good ones are hard to find.” [Commun. ACM, 31, 1192-1201]. Fortunately, some excellent random number generators are available, though poor ones are still in common use. You may be happy with the system-supplied random number generator on your computer, but you should be aware that as computers get faster, requirements on random number generators increase. Nowadays, a simulation that calls a random number generator millions of times can often finish before you can make it down the hall to the coffee machine and back.
A very nice review of random number generators was written by Pierre L'Ecuyer, as Chapter 4 of the book: Handbook on Simulation, Jerry Banks, ed. (Wiley, 1997). The chapter is available in postscript from L'Ecuyer's ftp site (see references). Knuth's volume on Seminumerical Algorithms (originally published in 1968) devotes 170 pages to random number generators, and has recently been updated in its 3rd edition (1997). It is brilliant, a classic. If you don't own it, you should stop reading right now, run to the nearest bookstore, and buy it.
A good random number generator will satisfy both theoretical and statistical properties. Theoretical properties are often hard to obtain (they require real math!), but one prefers a random number generator with a long period, low serial correlation, and a tendency not to “fall mainly on the planes.” Statistical tests are performed with numerical simulations. Generally, a random number generator is used to estimate some quantity for which the theory of probability provides an exact answer. Comparison to this exact answer provides a measure of “randomness”.
The Random Number Generator Interface¶ ↑
It is important to remember that a random number generator is not a “real” function like sine or cosine. Unlike real functions, successive calls to a random number generator yield different return values. Of course that is just what you want for a random number generator, but to achieve this effect, the generator must keep track of some kind of “state” variable. Sometimes this state is just an integer (sometimes just the value of the previously generated random number), but often it is more complicated than that and may involve a whole array of numbers, possibly with some indices thrown in. To use the random number generators, you do not need to know the details of what comprises the state, and besides that varies from algorithm to algorithm.
The random number generator library uses
GSL::Rng class for
Random number generator initialization¶ ↑
This method returns a GSL::Rng object of a random number generator of type
rng_typewith a seed
seed. These two arguments can be omitted, and the generator 'gsl_rng_mt19937' and a seed 0 are used as defaults. The GSL library provides a number of random number generator types, and one can choose with a constant
GSL::RNG_xxxor a String, as
See the GSL reference manual for the complete list. The following demonstrates how to use this class,
require 'gsl' r = Rng.alloc(Rng::TAUS, 1) r2 = Rng.alloc("ran0", 2) p r.name <- "taus" p r.get <- get an integer p r2.uniform <- get a float of [0, 1)
A generator of the type
gsl_rng_tausis created with seed 1, and
gsl_rng_ran0with seed 2. The method
getreturns a random integer. The method
uniformreturns a floating number uniformly distributed in the range [0, 1).
If the package rngextra is installed, additional two generators are available,
They are created as
r1 = Rng.alloc(Rng::RNGEXTRA_RNG1) p r1.name <- "rng1" r2 = Rng.alloc("rngextra_rng2") p r2.name <- "rng2"
Returns the default seed
Override the default seed by
Returns an array of all the available generators' names.
Copies the random number generator
src) into the pre-existing generator
dest, making dest into an exact copy of
src. The two generators must be of the same type.
This method initializes the random number generator with a given seed
Sampling from a random number generator¶ ↑
This returns a random integer from the reciever generator.
This method returns a double precision floating point number uniformly distributed in the range [0,1).
This returns a positive double precision floating point number uniformly distributed in the range (0,1), excluding both 0.0 and 1.0.
This method returns a random integer from 0 to n-1 inclusive.
Auxiliary random number generator functions¶ ↑
This method returns a Sting object of the name of the generator.
These method return the largest/smallest value that the method
Return a newly created generator which is an exact copy of the generator
Random number environment variables¶ ↑
The library allows you to choose a default generator and seed from the
GSL_RNG_SEED and the method
Reads the environment variables
GSL_RNG_SEEDand uses their values to set the corresponding library variables.
If you don't specify a generator for
GSL_RNG_TYPEthen “mt19937” is used as the default. The initial value of the default seed is zero.
Reference index top