Random number stream
Pseudorandom numbers in MATLAB® come from one or more random
number streams. The simplest way to generate arrays of random numbers
is to use rand
, randn
, or randi
.
These functions all rely on the same stream of uniform random numbers,
known as the global stream. You can create
other streams that act separately from the global stream, and you
can use their rand
, randi
, or randn
methods
to generate arrays of random numbers. You can also create a random
number stream and make it the global stream.
To create a single random number stream, use the RandStream
constructor.
To create multiple independent random number streams, use RandStream.create
.
The rng
function provides a
simple interface to create a new global stream.
stream = RandStream.getGlobalStream
returns
the global random number stream, that is, the one currently used by
the rand
, randi
, and randn
functions.
prevstream = RandStream.setGlobalStream(stream)
designates
the random number stream stream
as the new global
stream to be used by the rand
, randi
, and randn
functions,
and returns the previous global stream.
A random number stream s
has properties
that control its behavior. Access or assign to a property using p
= s.Property
or s.Property = p
. The following
table lists defined properties:
Property | Description |
---|---|
Type | (Read-only) Generator algorithm used by the stream. The list
of possible generators is given by RandStream.list . |
Seed | (Read-only) Seed value used to create the stream. |
NumStreams | (Read-only) Number of streams in the group in which the current stream was created. |
StreamIndex | (Read-only) Index of the current stream from among the group of streams with which it was created. |
State | Internal state of the generator. You should not depend
on the format of this property. The value you assign to The sequence of
random numbers produced by a random number stream |
Substream | Index of the substream to which the stream is currently set.
The default is 1. Multiple substreams are not supported by all generator
types; the multiplicative lagged Fibonacci generator (mlfg6331_64 )
and combined multiple recursive generator (mrg32k3a )
support substreams. |
NormalTransform | Transformation algorithm used by randn(s, ...) to
generate normal pseudorandom values. Possible values are 'Ziggurat' , 'Polar' ,
or 'Inversion' . |
Antithetic | Logical value indicating whether S generates
antithetic pseudorandom values, that is, the usual values subtracted
from 1. The default is false. |
FullPrecision | Logical value indicating whether S generates
values using its full precision. Some generators can create pseudorandom
values faster, but with fewer random bits, if FullPrecision is
false. The default is true. |
Method | Description |
---|---|
RandStream | Create a random number stream. |
RandStream.create | Create multiple independent random number streams. |
get | Get the properties of a random stream object. |
list | List available random number generator algorithms. |
set | Set random stream property. |
RandStream.getGlobalStream | Get the global random number stream. |
RandStream.setGlobalStream | Set global random number stream. |
reset | Reset a stream to its initial internal state |
rand | Pseudorandom numbers from a uniform distribution |
randn | Pseudorandom numbers from a standard normal distribution |
randi | Pseudorandom integers from a uniform discrete distribution |
randperm | Random permutation of a set of values |
Create a single stream and designate it as the current global stream:
s = RandStream('mt19937ar','Seed',1); RandStream.setGlobalStream(s);
Create three independent streams:
[s1,s2,s3] = RandStream.create('mrg32k3a','NumStreams',3); r1 = rand(s1,100000,1); r2 = rand(s2,100000,1); r3 = rand(s3,100000,1); corrcoef([r1,r2,r3])
Create only one stream from a set of three independent streams, and designate it as the current global stream:
s2 = RandStream.create('mrg32k3a','NumStreams',3,... 'StreamIndices',2); RandStream.setGlobalStream(s2);
Reset the global random number stream that underlies rand
, randi
,
and randn
back to its beginning, to reproduce
previous results:
stream = RandStream.getGlobalStream; reset(stream);
Save and restore the current global stream's state to reproduce
the output of rand
:
stream = RandStream.getGlobalStream; savedState = stream.State; u1 = rand(1,5) u1 = 0.8147 0.9058 0.1270 0.9134 0.6324 stream.State = savedState; u2 = rand(1,5) u2 = 0.8147 0.9058 0.1270 0.9134 0.6324
u2
contains
exactly the same values as u1
.Reset the global random number stream to its initial settings.
This causes rand
, randi
,
and randn
to start over, as if in a new MATLAB session:
s = RandStream('mt19937ar','Seed',0); RandStream.setGlobalStream(s);
Reinitialize the global random number stream using a seed based
on the current time. This causes rand
, randi
,
and randn
to return different values in different MATLAB sessions.
It is usually not desirable to do this more than once per MATLAB session
as it may affect the statistical properties of the random numbers MATLAB produces:
s = RandStream('mt19937ar','Seed','shuffle'); RandStream.setGlobalStream(s);
Change the transformation algorithm that randn
uses
to create normal pseudorandom values from uniform values. This does
not replace or reset the global stream.
stream = RandStream.getGlobalStream; stream.NormalTransform = 'inversion'