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 5element 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 >

