Got Questions? Get Answers.
Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Thread Subject:
random numbers

Subject: random numbers

From: Daniel

Date: 13 Dec, 2010 11:01:04

Message: 1 of 2

I have a question about setting the stream/state/seed of the random number generator.

I am essentially running a bunch 100+ Monte-Carlo simulations on r2010a. I want each simulation to produce different/independent (or nearly independent) sequences of random numbers. Ideally, I would be able to save the stream/state/seed so I could do it again. There is a lot of information, including some helpful posts on Loren's blog and related posts on the newsgroup, but I just want to make sure I am doing this correctly

From what I can tell I cannot use Mersenne Twister ('mt19937ar') since it does not support multiple streams. The Combined Multiple Recursive ('mrg32k3a') does support multiple independent streams. What I propose to do is generate a bunch of independent substreams (x) and save them to a .mat file:

>> N = 100; % Number of simulation runs
>> t = round(A*sum(clock));
>> s = RandStream('mrg32k3a');
>> s.Substream = t;
>> x = randi(B, N);
>> save('streams.mat', 'x');

Each of my simulations has an integer id (1 < id < N) which I will use to index into the list of "streams". Specially, in each simulation:

>> load('streams.mat');
>> s = RandStream('mrg32k3a');
>> s.Substream = x(id)

Does this work?

How big do the scale factors A and B need to be?

I figured the size of A depends on the accuracy of the clock (Matlab used to suggest A=100 with the old algorithm). This seems to limit the streams to millisecond accuracy on the clock. Is there an advantage/disadvantage of going larger (maybe 1e3 or 1e4)?

What about B? Do I use the maximum integer size (2^51) or something else?

Any advice would be appreciated

Subject: random numbers

From: Peter Perkins

Date: 13 Dec, 2010 18:27:25

Message: 2 of 2

On 12/13/2010 6:01 AM, Daniel wrote:
>>> N = 100; % Number of simulation runs
>>> t = round(A*sum(clock));
>>> s = RandStream('mrg32k3a');
>>> s.Substream = t;
>>> x = randi(B, N);
>>> save('streams.mat', 'x');
>
> Each of my simulations has an integer id (1 < id < N) which I will use
> to index into the list of "streams". Specially, in each simulation:
>
>>> load('streams.mat');
>>> s = RandStream('mrg32k3a');
>>> s.Substream = x(id)
>
> Does this work?

It does, but it may be more than what you need to do. There's no reason
that I can think of that simulations 1 through N can't just use
substreams 1 through N.

It seems like you're trying to inject some "extra randomness" into the
process by using clock and then drawing random integers. That most
likely is not necessary. If you're trying to get a "truely random"
result, then you ought to think about what that really means. The
typical MC simulation involves taking some kind of average ove many MC
iterations. I would argue that you should be using enough MC iterations
that the result of your simulation does not depend strongly on what
specific random numbers you use (assuming of course that they have
"good" distributional properties).

If you're goal is to be able to run the set of simulations and get
different results each time, without having to worry a lot about the
mechanics of making sure the random number stream is initialized
differently, then using clock can work nicely. But it seems like you've
described wanting repeatability. I would think that

    s = RandStream('mrg32k3a');
    s.Substream = id;

is all you need. Another possibility, using multiple independent
streams rather than substreams within one stream, would be

    s = RandStream.create('mrg32k3a','NumStreams',1:n,'StreamInd',id);

Six of one, half a dozen of the other. The latter code allows for
(much) more than 2^76 random values for each simulation, but that's a
lot of random values in either case.

Hope this helps.

Tags for this Thread

No tags are associated with this thread.

What are tags?

A tag is like a keyword or category label associated with each thread. Tags make it easier for you to find threads of interest.

Anyone can tag a thread. Tags are public and visible to everyone.

Contact us