Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

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


Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

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

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
waku

Posts: 14
Registered: 1/27/11
Re: Multiple independent random number streams cannot
Posted: Mar 16, 2013 3:13 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

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
>






Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.