Print

Print


On Aug 25, 2006, at 9:34 AM, Bruno Van Den Bossche wrote:

> We've been using Mason for some simulations now and discovered a
> "feature" which can be very annoying.
>
> It seems that the scheduler is using the random generator provided by
> the SimState.  Which means that if you have a different amount of
> schedulable objects or schedule an object at different intervals this
> will influence the randomness of the simulation.

Bruno, it's very common, and generally accepted as proper scientific  
modeling form, to use a single random number generator throughout  
your simulation.  Use of multiple generators can produce  
irreproducible results if you aren't careful.

It sounds as if you have a randomly-generated sequence of events that  
you would like to keep consistent despite changing the Schedule's  
scheduling frequency.  There's a way to hack this, but before I get  
to it, let me state that what you are hoping for causes fairly big  
warning bells to go off in my mind.  Random number generators are  
intended, on purpose, to provide pseudorandom number streams, and a  
simulation which expects a specific sequence is just inviting big- 
time statistical problems.  You may want to rethink this carefully.

That being said, here's how to hack it.  I believe the random number  
generator is used by only two things: you and the scheduler.  There  
is no reason you can't make a second random number generator in your  
SimState and use it instead.  Alternatively you can change the  
Schedule's random number generator to a different one (that's  
probably easier).  To do that, let's say the second generator has  
been set to the variable state.random2.  Then you just change the line:

	                if (substeps.numObjs > 1) substeps.shuffle 
(state.random);
to
	                if (substeps.numObjs > 1) substeps.shuffle 
(state.random2);

That should do the trick.  Also, RandomSequence, if you use it, may  
need to also be modified.  You probably don't use it.

If you're doing things under visualization, note that the Console  
sets the random number generator seed at start() time.  So in your  
GUIState.start() method, after calling super.start(), you may wish to  
set the random2 seed as well to what you feel to be appropriate.

Once again, be very careful using multiple generators in the same  
simulation.  I have _never_ seen a simulation using multiple  
generators -- other than a multithreaded one that had no option --  
which wasn't doing so in error.

Sean