MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Multiple independent random number streams cannot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg130160] Re: Multiple independent random number streams cannot
  • From: Waclaw Kusnierczyk <waku at idi.ntnu.no>
  • Date: Sat, 16 Mar 2013 03:13:19 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net
  • References: <20130314111450.25C5269D8@smc.vnet.net>

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
>




  • Prev by Date: Re: Issues with Rendering of Graphics[]
  • Next by Date: Quit is grayed out in Mathematica 8.0.4
  • Previous by thread: Re: Multiple independent random number streams cannot be implemented.
  • Next by thread: Re: Multiple independent random number streams cannot be implemented.