Scilab Function grand - Random number generator(s)
Calling Sequence
- Y=grand(m, n, dist_type [,p1,...,pk])
- Y=grand(X, dist_type [,p1,...,pk])
- Y=grand(n, dist_type [,p1,...,pk])
- S=grand(action [,q1,....,ql])
Parameters
- m, n
: integers, size of the wanted matrix Y
- X
: a matrix whom only the dimensions (say m x n) are used
- dist_type
: a string given the distribution which (independants) variates are to be
generated ('bin', 'nor', 'poi', etc ...)
- p1, ..., pk
: the parameters (reals or integers) required to define completly the distribution
dist_type
- Y
: the resulting m x n random matrix
- action
: a string given the action onto the base generator(s) ('setgen' to change the current base
generator, 'getgen' to retrieve the current base generator name, 'getsd' to retrieve the
state (seeds) of the current base generator, etc ...)
- q1, ..., ql
: the parameters (generally one string) needed to define the action
- S
: output of the action (generaly a string or a real column vector)
Description
This function may be used to generate random numbers from various distributions. In this
case you must apply one of the
three first forms of the possible calling sequences to get an m x n matrix.
The two firsts are equivalent if X is a m x n matrix,
and the third form corresponds to 'multivalued' distributions (e.g. multinomial, multivariate
gaussian, etc...) where a sample is a column vector (says of dim m)
and you get then n such random vectors (as an m x n matrix).
The last form is used to undertake various manipulations onto the base generators
like changing the base generator (since v 2.7 you may choose between several base generators),
changing or retrieving its internal state (seeds), etc ... These base generators give random
integers following a uniform distribution on a large integer interval (lgi), all the others
distributions being gotten from it (in general via a scheme lgi -> U([0,1)) -> wanted distribution).
getting random numbers from a given distribution
- beta
: Y=grand(m,n,'bet',A,B) generates random variates from
the beta distribution with parameters A and B.
The density of the beta is (0 < x < 1) :
A-1 B-1
x (1-x) / beta(A,B) ( beta(A,B) = gamma(A+B) / (gamma(A) gamma(B)) )
A and B must be reals > 10^(-37).
Related function(s) : cdfbet.
- binomial
: Y=grand(m,n,'bin',N,p) generates random variates from the binomial
distribution with parameters N (positive integer) and p
(real in [0,1]) : number of successes in N independant
Bernouilli trials with probability p of success.
Related function(s) : binomial, cdfbin.
- negative binomial
: Y=grand(m,n,'nbn',N,p) generates random variates from the negative binomial
distribution with parameters N (positive integer) and p (real
in (0,1)) : number of failures occurring before N successes
in independant Bernouilli trials with probability p of success.
Related function(s) : cdfnbn.
- chisquare
: Y=grand(m,n,'chi', Df) generates random variates from the chisquare distribution
with Df (real > 0.0) degrees of freedom.
Related function(s) : cdfchi.
- non central chisquare
: Y=grand(m,n,'nch',Df,Xnon) generates random variates from the non central chisquare
distribution with Df degrees of freedom (real >= 1.0)
and noncentrality parameter Xnonc (real >= 0.0).
Related function(s) : cdfchn.
- exponential
: Y=grand(m,n,'exp',Av) generates random variates from the exponential
distribution with mean Av (real >= 0.0).
- F variance ratio
: Y=grand(m,n,'f',Dfn,Dfd) generates random variates from the F
(variance ratio) distribution with Dfn (real > 0.0)
degrees of freedom in the numerator and Dfd (real > 0.0)
degrees of freedom in the denominator. Related function(s) : cdff.
- non central F variance ratio
: Y=grand(m,n,'nf',Dfn,Dfd,Xnon) generates random variates from the noncentral
F (variance ratio) distribution with Dfn (real >= 1) degrees of freedom
in the numerator, and Dfd (real > 0) degrees of freedom in the denominator,
and noncentrality parameter Xnonc (real >= 0).
Related function(s) : cdffnc.
- gamma
: Y=grand(m,n,'gam',shape,scale) generates random variates from the gamma
distribution with parameters shape (real > 0) and scale
(real > 0). The density of the gamma is :
shape (shape-1) -scale x
scale x e / gamma(shape)
Related function(s) : gamma, cdfgam.
- Gauss Laplace (normal)
: Y=grand(m,n,'nor',Av,Sd) generates random variates from the normal
distribution with mean Av (real) and standard deviation Sd
(real >= 0). Related function(s) : cdfnor.
- multivariate gaussian (multivariate normal)
: Y=grand(n,'mn',Mean,Cov) generates n multivariate normal random variates ;
Mean must be a m x 1 matrix and Cov a m x m
symetric positive definite matrix (Y is then a m x n matrix).
- geometric
: Y=grand(m,n,'geom', p) generates random variates from the geometric
distribution with parameter p : number of Bernouilli trials (with
probability succes of p) until a succes is met. p must
be in [pmin,1] (with pmin = 1.3 10^(-307)).
- markov
: Y=grand(n,'markov',P,x0) generate n successive states of a Markov chain
described by the transition matrix P. Initial state is given by
x0. If x0 is a matrix of size m=size(x0,'*')
then Y is a matrix of size m x n. Y(i,:) is the sample
path obtained from initial state x0(i).
- multinomial
: Y=grand(n,'mul',nb,P) generates n observations from the Multinomial
distribution : class nb events in m categories (put nb
"balls" in m "boxes"). P(i) is the probability
that an event will be classified into category i. P the vector of probabilities
is of size m-1 (the probability of category m being 1-sum(P)).
Y is of size m x n, each column Y(:,j) being an observation
from multinomial distribution and Y(i,j) the number of events falling in category
i (for the j th observation) (sum(Y(:,j)) = nb).
- Poisson
: Y=grand(m,n,'poi',mu) generates random variates from the Poisson
distribution with mean mu (real >= 0.0).
- random permutations
: Y=grand(n,'prm',vect) generate n random permutations of the
column vector (m x 1) vect.
- uniform (def)
: Y=grand(m,n,'def') generates random variates from the uniform
distribution over [0,1) (1 is never return).
- uniform (unf)
: Y=grand(m,n,'unf',Low,High) generates random reals uniformly distributed
in [Low, High).
- uniform (uin)
: Y=grand(m,n,'uin',Low,High) generates random integers uniformly
distributed between Low and High (included). High
and Low must be integers such that (High-Low+1) > 2,147,483,561.
- uniform (lgi)
: Y=grand(m,n,'lgi') returns the basic output of the current generator : random integers
following a uniform distribution over :
- [0, 2^32 - 1] for mt, kiss and fsultra
- [0, 2147483561] for clcg2
- [0, 2^31 - 2] for clcg4
- [0, 2^31 - 1] for urand.
set/get the current generator and its state
Since Scilab-2.7 you have the possibility to choose between different base
generators (which give random integers following the 'lgi' distribution, the others
being gotten from it) :
- mt
: the Mersenne-Twister of M. Matsumoto and T. Nishimura, period about 2^19937,
state given by an array of 624 integers (plus an index onto this array); this
is the default generator.
- kiss
: The Keep It Simple Stupid of G. Marsaglia, period about 2^123,
state given by 4 integers.
- clcg2
: a Combined 2 Linear Congruential Generator of P. L'Ecuyer,
period about 2^61, state given by 2 integers ; this was
the only generator previously used by grand (but slightly modified)
- clcg4
: a Combined 4 Linear Congruential Generator of P. L'Ecuyer,
period about 2^121, state given by 4 integers ; this one is
splitted in 101 different virtual (non over-lapping) generators
which may be useful for different tasks (see 'Actions specific to clcg4' and
'Test example for clcg4').
- urand
: the generator used by the scilab function rand, state
given by 1 integer, period of 2^31 (based on theory
and suggestions given in d.e. knuth (1969), vol 2. State). This
is the faster of this list but a little outdated (don't use it for
serious simulations).
- fsultra
: Arif Zaman (arif@stat.fsu.edu) and George Marsaglia
(geo@stat.fsu.edu). State given by 2 integers.
- action= 'getgen'
: S=grand('getgen') returns the current base generator ( S is
a string among 'mt', 'kiss', 'clcg2', 'clcg4', 'urand', 'fsultra'.
- action= 'setgen'
: grand('setgen',gen) sets the current base generator to be gen
a string among 'mt', 'kiss', 'clcg2', 'clcg4', 'urand', 'fsultra' (notes that this call
returns the new current generator, ie gen).
- action= 'getsd'
: S=grand('getsd') gets the current state (the current seeds) of the current base
generator ; S is given as a column vector (of integers) of dimension 625
for mt (the first being an index in [1,624]), 4 for kiss, 2
for clcg2 and fsultra, 4 for clcg4
(for this last one you get the current state of the current virtual generator) and 1
for urand.
- action= 'setsd'
: grand('setsd',S), grand('setsd',s1[,s2,s3,s4]) sets the state of the current
base generator (the new seeds) :
- for mt
S is a vector of integers of dim 625 (the first component is an index
and must be in [1,624], the 624 last ones must be in
[0,2^32[) (but must not be all zeros) ; a simpler initialisation may be done
with only one integer s1 (s1 must be in [0,2^32[) ;
- for kiss
4 integers s1,s2, s3,s4 in [0,2^32[ must be provided ;
- for clcg2
2 integers s1 in [1,2147483562] and s2
in [1,2147483398] must be given ;
- for clcg4
4 integers s1 in [1,2147483646], s2
in [1,2147483542], s3 in [1,2147483422],
s4 in [1,2147483322] are required ;
CAUTION : with clcg4 you set the seeds of the current virtual
generator but you may lost the synchronisation between this one
and the others virtuals generators (ie the sequence generated
is not warranty to be non over-lapping with a sequence generated
by another virtual generator)=> use instead the 'setall' option.
- for urand
1 integer s1 in [0,2^31[ must be given.
- for fsultra
2 integers s1, s2 in [0,2^32[ must be provided.
- action= 'phr2sd'
: Sd=grand('phr2sd', phrase) given a phrase (character string) generates
a 1 x 2 vector Sd which may be used as seeds to change the state of a
base generator (initialy suited for clcg2).
Options specific to clcg4
The clcg4 generator may be used as the others generators but it offers the advantage
to be splitted in several (101) virtual generators with non over-lapping
sequences (when you use a classic generator you may change the initial state (seeds)
in order to get another sequence but you are not warranty to get a complete different one).
Each virtual generator corresponds to a sequence of 2^72 values which is
further split into V=2^31 segments (or blocks) of length W=2^41.
For a given virtual generator you have the possibility to return at the beginning of the
sequence or at the beginning of the current segment or to go directly at the next segment.
You may also change the initial state (seed) of the generator 0 with the
'setall' option which then change also the initial state of the other virtual generators
so as to get synchronisation (ie in function of the new initial state of gen 0
the initial state of gen 1..100 are recomputed so as to get 101
non over-lapping sequences.
- action= 'setcgn'
: grand('setcgn',G) sets the current virtual generator for clcg4 (when clcg4
is set, this is the virtual (clcg4) generator number G which is used); the virtual clcg4
generators are numbered from 0,1,..,100 (and so G must be an integer
in [0,100]) ; by default the current virtual generator is 0.
- action= 'getcgn'
: S=grand('getcgn') returns the number of the current virtual clcg4 generator.
- action= 'initgn'
: grand('initgn',I) reinitializes the state of the current virtual generator
- I = -1
: sets the state to its initial seed
- I = 0
: sets the state to its last (previous) seed (i.e. to the beginning of the current segment)
- I = 1
: sets the state to a new seed W values from its last seed (i.e. to the beginning
of the next segment) and resets the current segment parameters.
- action= 'setall'
: grand('setall',s1,s2,s3,s4) sets the initial state of generator 0
to s1,s2,s3,s4. The initial seeds of the other generators are set accordingly
to have synchronisation. For constraints on s1, s2, s3, s4 see the 'setsd' action.
- action= 'advnst'
: grand('advnst',K) advances the state of the current generator by 2^K values
and resets the initial seed to that value.
Test example for clcg4
An example of the need of the splitting capabilities of clcg4 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 analyzed. The second method will choose a
data set size between 100 and 200, generate the data and analyze 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 clcg4, it is a snap. Use generator 0 to obtain the sample size for method one and
generator 1 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.
Authors, References
- randlib
The codes to generate sequences following other distributions than def, unf, lgi, uin and geom are
from "Library of Fortran Routines for Random Number Generation", by Barry W. Brown
and James Lovato, Department of Biomathematics, The University of Texas, Houston.
- mt
The code is the mt19937int.c by M. Matsumoto and T. Nishimura, "Mersenne Twister:
A 623-dimensionally equidistributed uniform pseudorandom number generator",
ACM Trans. on Modeling and Computer Simulation Vol. 8, No. 1, January, pp.3-30 1998.
- kiss
The code was given by G. Marsaglia at the end of a thread concerning RNG in C in several
newsgroups (whom sci.math.num-analysis) "My offer of RNG's for C was an invitation
to dance..." only kiss have been included in Scilab (kiss is made of a combinaison of
severals others which are not visible at the scilab level).
- clcg2
The method is from P. L'Ecuyer but the C code is provided at the Luc Devroye home page
(http://cgm.cs.mcgill.ca/~luc/rng.html).
- clcg4
The code is from P. L'Ecuyer and Terry H.Andres and provided at the P. L'Ecuyer
home page ( http://www.iro.umontreal.ca/~lecuyer/papers.html) A paper is also provided
and this new package is the logical successor of an old 's one from : P. L'Ecuyer
and S. Cote. Implementing a Random Number Package with Splitting Facilities. ACM Transactions
on Mathematical Software 17:1,pp 98-111.
- fsultra
code from Arif Zaman (arif@stat.fsu.edu) and George Marsaglia (geo@stat.fsu.edu)
- scilab packaging
By Jean-Philippe Chancelier and Bruno Pincon
See Also