Random Number
Generators
Jake Blanchard
Spring 2010
Uncertainty Analysis for Engineers
A Little History
Initial
random number generators
were congruential
xk 1 a xk c mod m
For
example, a=13, c=0, m=31,
x0=1xk 1 13 xk mod 31
x1 13 x0 mod 31 13 mod 31 13
x2 13 x1 mod 31 169 mod 31 14
x4 24
Uncertainty Analysis for Engineers
Congruential Operators
Result
is integers between 1 and
30
To get U(0,1), divide by m (31)
This gives .0323, .4194, .4516,
etc.
This gives just 30 possible
floating point numbers
Uncertainty Analysis for Engineers
Congruential Algorithms
Years
ago, IBM mainframes use
a=65539, c=0, m=231 because it
was very fast
But it has issues consecutive
numbers are correlated
For example, suppose we want to
generate random points in a
cube.
We would use 3 consecutive
values for the x, y, z coordinates
Uncertainty Analysis for Engineers
Matlab
Matlab
has 3 prominent
functions: rand, randn, and randi
Until 1995, rand was congruential
(a=75=16807, c=0, m=231-1)
This repeats every 2 billion
numbers (roughly)
(see mcg script)
Uncertainty Analysis for Engineers
Shuffling
This
Matlab routine still has
correlation among consecutive
numbers
For example, if x<10-6, next number
will be less than 0.0168
To avoid this, shuffle numbers
(Matlab didnt do this)
Start by storing 32 random numbers
When routine is called, randomly select
which of the 32 to use and replace with
next number in sequence
Uncertainty Analysis for Engineers
New Matlab Algorithm
Matlab
now uses a look up algorithm
Not congruential, no multiplication or
division, produces floating point directly
Uses 35 words of memory
32 represent cached floating point
numbers 0<z<1
Last three contain index i 0<i<31,
integer j, and borrowflag b
zi zi 20 zi 5 b
Subscripts
are modulo 32
Uncertainty Analysis for Engineers
New Matlab Algorithm
b
is used to make sure z is
positive
Period is 21430
Small modifications make period
21492
Uncertainty Analysis for Engineers
Repeatability
In
new Matlab session, the first
output from rand is always 0.
814723686393179
Matlab will let you repeat a
sequence at any time
defaultStream=RandStream.getDefaultStream;
savedState = defaultStream.State;
u1 = rand(1,5)
defaultStream.State = savedState;
u2 = rand(1,5)
Uncertainty Analysis for Engineers
Normal Deviates
One
approach is to use
sum(rand(m,n,12),3)-6
This adds the 12 uniform
deviates for each number,
yielding something
approximating a normal deviate
with mean of 0 and variance of 1
Uncertainty Analysis for Engineers
10
Normal Deviates
Alternative
is rejection method
Generate uniform random numbers in 2 by
2 square and reject points outside unit circle
For accepted points,
2 ln(r )
v
*u
r
u 2 * rand (2,1) 1
r u (1) 2 u (2) 2
Result is 2 normally distributed random
numbers
Uncertainty Analysis for Engineers
11
Newer Matlab Algorithm
Divide
pdf into rectangles of
equal area
Randomly sample integer to pick
rectangle and then see if u(-1,1)
falls within rectangle
If u is in jth section, then u*z is a
normal deviate
Otherwise, reject
Uncertainty Analysis for Engineers
12
Matlab Algorithm
Uncertainty Analysis for Engineers
13
Other Distributions
If
cdf can be inverted, you can
sample them directly
See later slides
Uncertainty Analysis for Engineers
14