## Section 7: Random Number Generators (Matlab Examples).

·    Monte Carlo Methods
·    Random Numbers
·    Random Number Cycle
·    Linear Congruential Generators
·    Multiplicative LCG
·    Mixed LCG

lcg.m this  Matlab code implements a comprehensive function  LCG(a, c, m, X0) with the following inputs and outputs:

• inputs:
• m is the modulus
•  a the multiplier
• c the increment
• X0 the initial “seed”
• outputs:
• P period of the sequence
• mean average of one period of the real random numbers
• var variance of the sequence of one period of the random numbers
• one period and three (P+3) integer numbers.
Below is given the Matlab code for the function. Stedents can generate random numbers using different input parameters.

function [p, mean, var, oneperiod]=lcg(a, c, m, x)
% Linear Congruential Generators
% x the initial seed, 0 <= c < m
% a the multiplier, 0 <= a < m, normally greater than 1
% c the increment 0 <= c < m
% m the modulus, prime numbers are best
xseq=x;
for j=1:m+5  % generate m+5 integers
x= rem((a*x+c),m);   % (a*x + c) mod m;
xseq=[xseq;x];  % concatenate numbers, in a cloumn
row=xseq';  % transpose to a row
end

% find out the period
i=1;
j=2;
while row(i) ~= row(j)
if j > m  % integer row(i) doesn’t repeat in the sequence
i=i+1;  % see if the next integer repeats or not
j=i;
end;
j=j+1;
end;
p=j-i;
% one period of random integer number
oneperiod=row(i:i+p+2);   % one period and three integers

% calculate the real number of a period p
r=row(i:i+p-1)/m;  % divide by m, so distributed in [0,1)
mean = sum(r)/p; % average
diff=mean-r;
square=diff.*diff;
var=sum(square)/p; % variance

However, Matlab environment has already predefined functions to generate random numbers:

RAND   Uniformly distributed random numbers.

•     RAND(N) is an N-by-N matrix with random entries, chosen from a uniform distribution on the interval (0.0,1.0)
•     RAND(M,N) and RAND([M,N]) are M-by-N matrices with random entries
•     RAND(M,N,P,...) or RAND([M,N,P,...]) generate random arrays
•     RAND with no arguments is a scalar whose value changes each time it is referenced
•     RAND(SIZE(A)) is the same size as A
RANDN  Normally distributed random numbers.
•  RANDN(N) is an N-by-N matrix with random entries, chosen from a normal distribution with mean zero and variance one.
•  RANDN(M,N) and RANDN([M,N]) are M-by-N matrices with random entries.
•  RANDN(M,N,P,...) or RANDN([M,N,P...]) generate random arrays.
•  RANDN with no arguments is a scalar whose value changes each time it is referenced.
•  RANDN(SIZE(A)) is the same size as A.

SPRAND Sparse uniformly distributed random matrix.

• R = SPRAND(S) has the same sparsity structure as S, but uniformly  distributed random entries.
• R = SPRAND(m,n,density) is a random, m-by-n, sparse matrix with approximately density*m*n uniformly distributed nonzero entries. SPRAND is designed to produce large matrices with small density and will generate significantly fewer nonzeros than requested if m*n is small or density is large.
• R = SPRAND(m,n,density,rc) also has reciprocal condition number approximately equal to rc.  R is constructed from a sum of matrices of rank one.

SPRANDN Sparse normally distributed random matrix.

• R = SPRANDN(S) has the same sparsity structure as S, but normally distributed random entries.
• R = SPRANDN(m,n,density) is a random, m-by-n, sparse matrix with approximately density*m*n normally distributed nonzero entries. SPRANDN is designed to produce large matrices with small density and will generate significantly fewer nonzeros than requested if m*n is small or density is large.
• R = SPRANDN(m,n,density,rc) also has reciprocal condition number approximately equal to rc.  R is constructed from a sum of  matrices of rank one.
RANDPERM Random permutation.
• RANDPERM(n) is a random permutation of the integers from 1 to n. For example, RANDPERM(6) might be [2 4 5 6 1 3].

Valentin Muresan, Dublin City University, muresanv@eeng.dcu.ie