SAS Random Number Generators and Their Uses n54703.019
SAS includes a large number of functions. Among them are
several "random" number generators. Those that you are most likely
to use are the following:
RANUNI: generates random numbers between 0 and 1 which have
a uniform distribution.
RANNOR: generates random numbers with a standard normal [N(0, 1)]
distribution
RANBIN: generates random numbers with a binomial distribution
Random number generators are useful for carrying out simulation
studies and for generating randomization schedules for clinical trials.
They can also be used in studies which depend on surveys carried out
using random digit dialing.
We will focus first on the simplest random number generator,
RANUNI. The following program shows how RANUNI is used:
------------------------------------------------------------------------
options linesize = 80 ;
footnote "~john-c/5421/random.sas &sysdate &systime" ;
data random ;
seed = 20040427 ;
n = 10 ;
do i = 1 to n ;
x = ranuni(seed) ;
output ;
end ;
run ;
proc print data = random ;
title1 'Printout of random numbers generated by RANUNI' ;
------------------------------------------------------------------------
Printout of random numbers generated by RANUNI 1
21:18 Tuesday, April 27, 2004
OBS SEED N I X
1 20040427 10 1 0.87825
2 20040427 10 2 0.08953
3 20040427 10 3 0.81901
4 20040427 10 4 0.61657
5 20040427 10 5 0.18473
6 20040427 10 6 0.97046
7 20040427 10 7 0.48202
8 20040427 10 8 0.15767
9 20040427 10 9 0.54726
10 20040427 10 10 0.11800
~john-c/5421/random.sas 27APR04 21:18
------------------------------------------------------------------------
The SEED for the random number generator determines the starting
value. If you use the same positive SEED in the same program, you
will always get the same results. In this sense, the results of the
random number generator are not random at all; they are completely
predictable.
If you start with a different SEED you will get a different sequence of
random numbers. However, the same seed used on different occasions will always
give the same sequence.
However, if SEED is a NEGATIVE number, you will get a different
sequence of numbers every time. When you use a negative number as
the seed, SAS chooses its own seed which depends on clock time within
the computer. This has the advantage that the sequence you get is
almost completely impossible to predict. It has the disadvantage that
if you want the same sequence over again, you may have to wait
several lifetimes to get it.
Here is one way in which random number generators are used. Say
you want to generate a randomization schedule for a clinical trial
in which the subjects are supposed to get either a drug or a placebo
with equal probability. Assume the variable X represents assignment
to either drug or placebo: X = 'D' or X = 'P'. You generate a random
number R between 0 and 1 using RANUNI. If R is less than .5, then
you assign X = 'P'. If R is greater than or equal to .5, you assign
X = 'D'. A program which does this is the following:
=======================================================================
options linesize = 80 ;
footnote "~john-c/5421/ransched.sas &sysdate &systime" ;
data ransched ;
length X $1 ;
seed = 98694451 ;
n = 10 ;
do i = 1 to n ;
r = ranuni(seed) ;
if r lt .5 then X = 'P' ;
if r ge .5 then X = 'D' ;
output ;
end ;
run ;
proc print data = ransched ;
var seed n i r x ;
title1 'Randomization schedule generated using RANUNI' ;
run ;
------------------------------------------------------------------------
Randomization schedule generated using RANUNI 1
21:33 Tuesday, April 27, 2004
OBS SEED N I R X
1 98694451 10 1 0.28414 P
2 98694451 10 2 0.21248 P
3 98694451 10 3 0.38594 P
4 98694451 10 4 0.89558 D
5 98694451 10 5 0.46266 P
6 98694451 10 6 0.90051 D
7 98694451 10 7 0.39842 P
8 98694451 10 8 0.68491 D
9 98694451 10 9 0.07968 P
10 98694451 10 10 0.26521 P
~john-c/5421/ransched.sas 27APR04 21:33
=======================================================================
Note that in this example, the treatment assignments are
unbalanced: there are 6 assignments to placebo P and 4 assignments
to drug D. This is not an unusual imbalance, but you might want
equal assignments to both groups.
Here is a way you can guarantee exactly the same number of
assignments to each group, using the random number generator:
1. Number 10 cards from 1 to 10: put the number in a circle
on each card.
2. Write a random number on each card.
3. Sort the cards in order by the random numbers.
4. Assign the first 5 cards to placebo and the second 5
cards to drug. Write the treatment assignment on the
cards.
5. Sort the cards again into the original order. You now
have a random sequence of assignments to drug and placebo
of length 10, with exactly 5 assignments in each group.
Here is a SAS program, using RANUNI, which accomplishes the same
thing:
=======================================================================
options linesize = 80 ;
footnote "~john-c/5421/rancards.sas &sysdate &systime" ;
data rancards ;
n = 10 ;
seed = 20010101 ;
do i = 1 to 10 ;
r = ranuni(seed) ;
output ;
end ;
run ;
proc print data = rancards ;
var n seed i r ;
title1 'Sequence of 10 random numbers generated by RANUNI.' ;
proc sort data = rancards ;
by r ;
proc print data = rancards ;
var n seed i r ;
title1 'Sequence of 10 random numbers sorted in ascending order' ;
data rancards ;
retain ncard 0 ;
set rancards ;
ncard = ncard + 1 ;
X = 'P' ;
if ncard ge 6 then X = 'D' ;
run ;
proc print data = rancards ;
var n seed i r x ;
title1 'Treatment assignments ... by ncard.' ;
proc sort data = rancards ;
by i ;
proc print data = rancards ;
var n seed i r x ;
title1 'Balanced randomization schedule ...' ;
------------------------------------------------------------------------
Sequence of 10 random numbers generated by RANUNI. 1
21:57 Tuesday, April 27, 2004
OBS N SEED I R
1 10 20010101 1 0.70336
2 10 20010101 2 0.17914
3 10 20010101 3 0.74710
4 10 20010101 4 0.09325
5 10 20010101 5 0.66496
6 10 20010101 6 0.66555
7 10 20010101 7 0.09562
8 10 20010101 8 0.07448
9 10 20010101 9 0.49362
10 10 20010101 10 0.42075
~john-c/5421/rancards.sas 27APR04 21:57
------------------------------------------------------------------------
Sequence of 10 random numbers sorted in ascending order 2
21:57 Tuesday, April 27, 2004
OBS N SEED I R
1 10 20010101 8 0.07448
2 10 20010101 4 0.09325
3 10 20010101 7 0.09562
4 10 20010101 2 0.17914
5 10 20010101 10 0.42075
6 10 20010101 9 0.49362
7 10 20010101 5 0.66496
8 10 20010101 6 0.66555
9 10 20010101 1 0.70336
10 10 20010101 3 0.74710
~john-c/5421/rancards.sas 27APR04 21:57
------------------------------------------------------------------------
Treatment assignments ... by ncard. 3
21:57 Tuesday, April 27, 2004
OBS N SEED I R X
1 10 20010101 8 0.07448 P
2 10 20010101 4 0.09325 P
3 10 20010101 7 0.09562 P
4 10 20010101 2 0.17914 P
5 10 20010101 10 0.42075 P
6 10 20010101 9 0.49362 D
7 10 20010101 5 0.66496 D
8 10 20010101 6 0.66555 D
9 10 20010101 1 0.70336 D
10 10 20010101 3 0.74710 D
~john-c/5421/rancards.sas 27APR04 21:57
------------------------------------------------------------------------
Balanced randomization schedule ... 4
21:57 Tuesday, April 27, 2004
OBS N SEED I R X
1 10 20010101 1 0.70336 D
2 10 20010101 2 0.17914 P
3 10 20010101 3 0.74710 D
4 10 20010101 4 0.09325 P
5 10 20010101 5 0.66496 D
6 10 20010101 6 0.66555 D
7 10 20010101 7 0.09562 P
8 10 20010101 8 0.07448 P
9 10 20010101 9 0.49362 D
10 10 20010101 10 0.42075 P
~john-c/5421/rancards.sas 27APR04 21:57
=======================================================================
RANNOR:
RANNOR is another SAS pseudo-random number generator which produces
observations which have a normal distribution with mean 0 and standard
deviation 1. RANNOR is used in much the same way as RANUNI:
1. Specify a seed, usually a large positive number
2. r = rannor(seed) ;
If you specify a negative seed, RANNOR will generate a sequence of
based on the computer's internal clock - that is, every time you run the
program you will get a different sequence.
If you want observations from a normal distribution with mean -2 and
standard deviation 10, do the following:
r = -2 + 10*rannor(seed) ;
A random number generator sequence will be re-started if it is run in a new
data step.
It is possible to re-start a random number sequence with a new seed within
a given data step by the use of a 'CALL' statement, as in the following program:
========================================================================
options linesize = 80 ;
footnote "~john-c/5421/ranseq.sas &sysdate &systime" ;
data ranseq1 ;
seed = 987654321 ;
do i = 1 to 10 ;
r = rannor(seed) ;
output ;
end ;
run ;
data ranseq2 ;
seed = 20040501 ;
do i = 1 to 10 ;
r = rannor(seed) ;
output ;
end ;
run ;
data ranseq3 ;
seed = 987654321 ;
i = 1 ;
call rannor(seed, r) ;
output ;
do i = 2 to 20 ;
r = rannor(seed) ;
output ;
end ;
run ;
data ranseq4 ;
seed = 20040501 ;
i = 1 ;
call rannor(seed, r) ;
output ;
do i = 2 to 10 ;
r = rannor(seed) ;
output ;
end ;
seed = 987654321 ;
i = 1 ;
call rannor(seed, r) ;
output ;
do i = 2 to 10 ;
r = rannor(seed) ;
output ;
end ;
seed = 20040501 ;
i = 1 ;
call rannor(seed, r) ;
output ;
do i = 2 to 10 ;
r = rannor(seed) ;
output ;
end ;
run ;
proc print data = ranseq1 ;
title1 'Printout of dataset ranseq1' ;
run ;
proc print data = ranseq2 ;
title1 'Printout of dataset ranseq2' ;
run ;
proc print data = ranseq3 ;
title1 'Printout of dataset ranseq3' ;
run ;
proc print data = ranseq4 ;
title1 'Printout of dataset ranseq4' ;
run ;
endsas ;
------------------------------------------------------------------------
Printout of dataset ranseq1 1
14:25 Saturday, May 1, 2004
OBS SEED I R
1 987654321 1 0.15558
2 987654321 2 1.07101
3 987654321 3 -0.20140
4 987654321 4 -1.04728
5 987654321 5 -0.86722
6 987654321 6 0.53976
7 987654321 7 -0.84926
8 987654321 8 1.10120
9 987654321 9 0.60952
10 987654321 10 -0.24234
~john-c/5421/ranseq.sas 01MAY04 14:25
------------------------------------------------------------------------
Printout of dataset ranseq2 2
14:25 Saturday, May 1, 2004
OBS SEED I R
1 20040501 1 0.76021
2 20040501 2 0.51044
3 20040501 3 -0.45282
4 20040501 4 -0.90734
5 20040501 5 1.64467
6 20040501 6 -0.24150
7 20040501 7 -0.97785
8 20040501 8 0.96686
9 20040501 9 -0.58720
10 20040501 10 1.03371
~john-c/5421/ranseq.sas 01MAY04 14:25
------------------------------------------------------------------------
Printout of dataset ranseq3 3
14:25 Saturday, May 1, 2004
OBS SEED I R
1 1645322396 1 0.15558
2 1645322396 2 1.07101
3 1645322396 3 -0.20140
4 1645322396 4 -1.04728
5 1645322396 5 -0.86722
6 1645322396 6 0.53976
7 1645322396 7 -0.84926
8 1645322396 8 1.10120
9 1645322396 9 0.60952
10 1645322396 10 -0.24234
11 1645322396 11 0.52420
12 1645322396 12 -0.38888
13 1645322396 13 2.95714
14 1645322396 14 -1.31965
15 1645322396 15 0.31193
16 1645322396 16 0.37487
17 1645322396 17 0.36149
18 1645322396 18 -0.86003
19 1645322396 19 -1.33057
20 1645322396 20 0.64818
~john-c/5421/ranseq.sas 01MAY04 14:25
------------------------------------------------------------------------
Printout of dataset ranseq4 4
14:25 Saturday, May 1, 2004
OBS SEED I R
1 1881399392 1 0.76021
2 1881399392 2 0.51044
3 1881399392 3 -0.45282
4 1881399392 4 -0.90734
5 1881399392 5 1.64467
6 1881399392 6 -0.24150
7 1881399392 7 -0.97785
8 1881399392 8 0.96686
9 1881399392 9 -0.58720
10 1881399392 10 1.03371
11 1645322396 1 0.15558
12 1645322396 2 -0.72313
13 1645322396 3 1.06559
14 1645322396 4 -1.56206
15 1645322396 5 -0.05762
16 1645322396 6 0.29086
17 1645322396 7 -1.03002
18 1645322396 8 -0.06367
19 1645322396 9 -0.00630
20 1645322396 10 -1.06905
21 1881399392 1 0.76021
22 1881399392 2 0.12988
23 1881399392 3 -0.67515
24 1881399392 4 0.11125
25 1881399392 5 -0.56765
26 1881399392 6 -0.25198
27 1881399392 7 -1.10058
28 1881399392 8 -2.29427
29 1881399392 9 -0.18066
30 1881399392 10 0.67819
~john-c/5421/ranseq.sas 01MAY04 14:25
========================================================================
Note that when the 'CALL' form of the random number generator is used,
the seed is changed and the seed that is printed out is not the same as the
seed which was given to the function in the first place.
========================================================================
n54703.019 Last update: May 1, 2004.