Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Multiple independent random number streams cannot be implemented.
Replies: 6   Last Post: Mar 19, 2013 1:51 AM

 Messages: [ Previous | Next ]
 waku Posts: 14 Registered: 1/27/11
Re: Multiple independent random number streams cannot
Posted: Mar 16, 2013 3:13 AM

You can simulate some sort of behavior that you seem to want using
random blocks nested within modules where the internal state of the
random generator is explicitly preserved. For example, the following
does the trick (make efforts to improve if you like the idea):

Generator[init_: 1, generate_: RandomReal] :=
Module[{r, out},
BlockRandom[
SeedRandom[init];
r = \$RandomState;
BlockRandom[
SeedRandom[r];
out = generate[];
r = \$RandomState;
out] &]]

The idea here is to a) locally initalize the generator with the
specified (or default) value; b) preserve the current internal state of
the rng in a closure; c) get hold of a function that will iteratively
use the value to set the state of the generator, generate a random
number, and then capture the new state in the local variable.

For example,

(* two independent generators that should produce the same sequences of
numbers *)
{f, g} = Table[Generator[], {2}]

(* compare two separately generated 5-element sequences *)
Table[f[], {5}] == Table[g[], {5}]

(* compare five pairs of values generated in parallel *)
And @@ (Equal /@ Table[Through[{f, g}[]], {5}])

vQ

On 03/14/2013 12:14 PM, Roger Wilson wrote:
> Hopefully the title is enough of a red flag for someone to try to prove me wrong.
>
> I want to implement two functions; lets call them f and g so that they both return random numbers. For example...
>
> f[]:=RandomReal[];
> g[]:=RandomReal[];
>
> However I want f and g to return the same number when they're called for the nth time. So the first call to f is always the same number and the first call to g is always the same number.
>
> In the above case (on my machine)...
> SeedRandom[1]; {f[], g[]} gives {0.168697, 0.113119}
>
> and of course..
> SeedRandom[1]; {g[], f[]} gives the same {0.817389, 0.11142}
>
> Essentially I want f and g to to be independent random sources.
>
> It is possible to localize the random number generators using BlockRandom but I do not see how that helps me in this case. BlockRandom localizes the state of the random number generators within the block where as I want to localize them into the symbol names.
>
> Roger
>

Date Subject Author
3/15/13 Sseziwa Mukasa
3/17/13 David Bailey
3/18/13 Vince Virgilio
3/19/13 David Bailey
3/19/13 Vince Virgilio
3/16/13 waku