Generates pseudorandom numbers from a normal, N (μ, σ2), distribution.
#include <imsls.h>
float *imsls_f_random_normal (int n_random, ..., 0)
The type double function is imsls_d_random_normal.
int n_random
(Input)
Number of random numbers to generate.
An array of length n_random containing the random normal deviates.
#include <imsls.h>
float
*imsls_f_random_normal (int
n_random,
IMSLS_MEAN,
float
mean,
IMSLS_VARIANCE,
float
variance,
IMSLS_ZIGGURAT_METHOD,
IMSLS_RETURN_USER,
float
r[],
0)
IMSLS_MEAN, float mean
(Input)
Parameter mean contains the
mean, μ, of
the N(μ, σ2) from which
random normal deviates are to be generated.
Default: mean = 0.0
IMSLS_VARIANCE, float variance
(Input)
Parameter variance contains the variance of the
N (μ, σ2) from which
random normal deviates are to be generated.
Default: variance = 1.0
IMSLS_ZIGGURAT_METHOD
By
default, random numbers are generated using an inverse CDF technique. When
optional argument IMSLS_ZIGGURAT_METHOD
is specified, the Ziggurat method is used instead. See the Description” section for details
about each method.
IMSLS_RETURN_USER, float r[]
(Output)
User-supplied array of length n_random containing
the generated random standard normal deviates.
By default, function imsls_f_random_normal generates pseudorandom numbers from a normal (Gaussian) distribution using an inverse CDF technique. In this method, a uniform (0, 1) random deviate is generated. The inverse of the normal distribution function is then evaluated at that point, using the function imsls_f_normal_inverse_cdf (Chapter 11, Probablility Distribution Functions and Inverses).
If optional argument IMSLS_ZIGGURAT_METHOD is specified, function imsls_f_random_normal generates pseudorandom numbers using the Ziggurat method. This method cuts the density into many small pieces. For each random number generated, an interval is chosen at random and a random normal is generated from the choosen interval. In this implementation, the density is cut into 256 pieces, but symmetry is used so that only 128 pieces are needed by the computation. Following Doornik (2005), different uniform random deviates are used to determine which slice to use and to determine the normal deviate from the slice. This method is faster than the default inverse CDF technique.
Function imsls_random_seed_set can be used to initialize the seed of the random number generator; function imsls_random_option can be used to select the form of the generator.
In this example, imsls_f_random_normal generates five pseudorandom deviates from a standard normal distribution.
#include <imsls.h>
#include <stdio.h>
#define N_RANDOM 5
int main()
{
int seed = 123457;
int n_random = N_RANDOM;
float *r;
imsls_random_seed_set (seed);
r = imsls_f_random_normal(n_random, 0);
printf("%s:\n%8.4f%8.4f%8.4f%8.4f%8.4f\n",
"Standard normal random deviates",
r[0], r[1], r[2], r[3], r[4]);
}
Standard normal random deviates:
1.8279 -0.6412 0.7266 0.1747 1.0145