Node:SVID Random, Previous:BSD Random, Up:Pseudo-Random Numbers
The C library on SVID systems contains yet another kind of random number generator functions. They use a state of 48 bits of data. The user can choose among a collection of functions which return the random bits in different forms.
Generally there are two kinds of function. The first uses a state of the random number generator which is shared among several functions and by all threads of the process. The second requires the user to handle the state.
All functions have in common that they use the same congruential
formula with the same constants.  The formula is
Y = (a * X + c) mod m
where X is the state of the generator at the beginning and
Y the state at the end.  a and c are constants
determining the way the generator works.  By default they are
a = 0x5DEECE66D = 25214903917 c = 0xb = 11
but they can also be changed by the user.  m is of course 2^48
since the state consists of a 48-bit array.
The prototypes for these functions are in stdlib.h.
| double drand48 (void) | Function | 
| This function returns a doublevalue in the range of0.0to1.0(exclusive).  The random bits are determined by the global
state of the random number generator in the C library.Since the  | 
| double erand48 (unsigned short int xsubi[3]) | Function | 
| This function returns a doublevalue in the range of0.0to1.0(exclusive), similarly todrand48.  The argument is
an array describing the state of the random number generator.This function can be called subsequently since it updates the array to guarantee random numbers. The array should have been initialized before initial use to obtain reproducible results. | 
| long int lrand48 (void) | Function | 
| The lrand48function returns an integer value in the range of0to2^31(exclusive).  Even if the size of thelong
inttype can take more than 32 bits, no higher numbers are returned. 
The random bits are determined by the global state of the random number
generator in the C library. | 
| long int nrand48 (unsigned short int xsubi[3]) | Function | 
| This function is similar to the lrand48function in that it
returns a number in the range of0to2^31(exclusive) but
the state of the random number generator used to produce the random bits
is determined by the array provided as the parameter to the function.The numbers in the array are updated afterwards so that subsequent calls to this function yield different results (as is expected of a random number generator). The array should have been initialized before the first call to obtain reproducible results. | 
| long int mrand48 (void) | Function | 
| The mrand48function is similar tolrand48.  The only
difference is that the numbers returned are in the range-2^31to2^31(exclusive). | 
| long int jrand48 (unsigned short int xsubi[3]) | Function | 
| The jrand48function is similar tonrand48.  The only
difference is that the numbers returned are in the range-2^31to2^31(exclusive).  For thexsubiparameter the same
requirements are necessary. | 
The internal state of the random number generator can be initialized in several ways. The methods differ in the completeness of the information provided.
| void srand48 (long int seedval) | Function | 
| The srand48function sets the most significant 32 bits of the
internal state of the random number generator to the least
significant 32 bits of the seedval parameter.  The lower 16 bits
are initialized to the value0x330E.  Even if thelong
inttype contains more than 32 bits only the lower 32 bits are used.Owing to this limitation, initialization of the state of this
function is not very useful.  But it makes it easy to use a construct
like  A side-effect of this function is that the values  | 
| unsigned short int * seed48 (unsigned short int seed16v[3]) | Function | 
| The seed48function initializes all 48 bits of the state of the
internal random number generator from the contents of the parameter
seed16v.  Here the lower 16 bits of the first element of
see16v initialize the least significant 16 bits of the internal
state, the lower 16 bits ofseed16v[1]initialize the mid-order
16 bits of the state and the 16 lower bits ofseed16v[2]initialize the most significant 16 bits of the state.Unlike  The value returned by  As for  | 
There is one more function to initialize the random number generator which enables you to specify even more information by allowing you to change the parameters in the congruential formula.
| void lcong48 (unsigned short int param[7]) | Function | 
| The lcong48function allows the user to change the complete state
of the random number generator.  Unlikesrand48andseed48, this function also changes the constants in the
congruential formula.From the seven elements in the array param the least significant
16 bits of the entries  | 
All the above functions have in common that they use the global parameters for the congruential formula. In multi-threaded programs it might sometimes be useful to have different parameters in different threads. For this reason all the above functions have a counterpart which works on a description of the random number generator in the user-supplied buffer instead of the global state.
Please note that it is no problem if several threads use the global state if all threads use the functions which take a pointer to an array containing the state. The random numbers are computed following the same loop but if the state in the array is different all threads will obtain an individual random number generator.
The user-supplied buffer must be of type struct drand48_data. 
This type should be regarded as opaque and not manipulated directly.
| int drand48_r (struct drand48_data *buffer, double *result) | Function | 
| This function is equivalent to the drand48function with the
difference that it does not modify the global random number generator
parameters but instead the parameters in the buffer supplied through the
pointer buffer.  The random number is returned in the variable
pointed to by result.The return value of the function indicates whether the call succeeded. 
If the value is less than  This function is a GNU extension and should not be used in portable programs. | 
| int erand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, double *result) | Function | 
| The erand48_rfunction works likeerand48, but in addition
it takes an argument buffer which describes the random number
generator.  The state of the random number generator is taken from thexsubiarray, the parameters for the congruential formula from the
global random number generator data.  The random number is returned in
the variable pointed to by result.The return value is non-negative if the call succeeded. This function is a GNU extension and should not be used in portable programs. | 
| int lrand48_r (struct drand48_data *buffer, double *result) | Function | 
| This function is similar to lrand48, but in addition it takes a
pointer to a buffer describing the state of the random number generator
just likedrand48.If the return value of the function is non-negative the variable pointed to by result contains the result. Otherwise an error occurred. This function is a GNU extension and should not be used in portable programs. | 
| int nrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result) | Function | 
| The nrand48_rfunction works likenrand48in that it
produces a random number in the range0to2^31.  But instead
of using the global parameters for the congruential formula it uses the
information from the buffer pointed to by buffer.  The state is
described by the values in xsubi.If the return value is non-negative the variable pointed to by result contains the result. This function is a GNU extension and should not be used in portable programs. | 
| int mrand48_r (struct drand48_data *buffer, double *result) | Function | 
| This function is similar to mrand48but like the other reentrant
functions it uses the random number generator described by the value in
the buffer pointed to by buffer.If the return value is non-negative the variable pointed to by result contains the result. This function is a GNU extension and should not be used in portable programs. | 
| int jrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result) | Function | 
| The jrand48_rfunction is similar tojrand48.  Like the
other reentrant functions of this function family it uses the
congruential formula parameters from the buffer pointed to by
buffer.If the return value is non-negative the variable pointed to by result contains the result. This function is a GNU extension and should not be used in portable programs. | 
Before any of the above functions are used the buffer of type
struct drand48_data should be initialized.  The easiest way to do
this is to fill the whole buffer with null bytes, e.g. by
memset (buffer, '\0', sizeof (struct drand48_data));
Using any of the reentrant functions of this family now will automatically initialize the random number generator to the default values for the state and the parameters of the congruential formula.
The other possibility is to use any of the functions which explicitly initialize the buffer. Though it might be obvious how to initialize the buffer from looking at the parameter to the function, it is highly recommended to use these functions since the result might not always be what you expect.
| int srand48_r (long int seedval, struct drand48_data *buffer) | Function | 
| The description of the random number generator represented by the
information in buffer is initialized similarly to what the function srand48does.  The state is initialized from the parameter
seedval and the parameters for the congruential formula are
initialized to their default values.If the return value is non-negative the function call succeeded. This function is a GNU extension and should not be used in portable programs. | 
| int seed48_r (unsigned short int seed16v[3], struct drand48_data *buffer) | Function | 
| This function is similar to srand48_rbut likeseed48it
initializes all 48 bits of the state from the parameter seed16v.If the return value is non-negative the function call succeeded.  It
does not return a pointer to the previous state of the random number
generator like the  This function is a GNU extension and should not be used in portable programs. | 
| int lcong48_r (unsigned short int param[7], struct drand48_data *buffer) | Function | 
| This function initializes all aspects of the random number generator
described in buffer with the data in param.  Here it is
especially true that the function does more than just copying the
contents of param and buffer.  More work is required and
therefore it is important to use this function rather than initializing
the random number generator directly. If the return value is non-negative the function call succeeded. This function is a GNU extension and should not be used in portable programs. |