MASON-INTEREST-L Archives

July 2012

MASON-INTEREST-L@LISTSERV.GMU.EDU

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
Sean Luke <[log in to unmask]>
Reply To:
MASON Multiagent Simulation Toolkit <[log in to unmask]>
Date:
Sat, 21 Jul 2012 03:34:17 -0400
Content-Type:
text/plain
Parts/Attachments:
text/plain (52 lines)
On Jul 20, 2012, at 8:27 PM, Chris Hollander wrote:

> It looks like it should be okay for the moment, but doesn't
> 
> protected abstract double getNextTime(SimState state, double currentTime);
> 
> force the user to make use of Mason's random number generator, which
> if I recall only supports uniform and Gaussian distributions? Granted,
> you can use those to generate random variates of other types, but I'm
> not sure what the performance impact might be.

That's not how random number generators work.  When you pick a random number from a distribution, you're not using a different generator.  You're just using the core generator (in our case, Mersenne Twister) to pick a uniform number, and then the distribution is transforming it into a number selected from under the distribution.  Thus you never need anything more than the core generator passed in, and in fact if you're using a different generator on top of that then there's probably something seriously wrong with your model.

For example, to use my code with a basic stateless distribution (found in the Distributions class) like Power Law, you could do:

Steppable step = ...
double initialTime = 5.0;
int initialOrdering = 0;

RandomRepeat repeat = new RandomRepeat(step, initialOrdering, false)
       {
       protected double getNextTime(SimState state, double currentTime)
               {
		// return PowerLaw() + 1.0, with exponent=2.0 and lower cutoff=1.0
               return Distributions.nextPowLaw(2.0, 1.0, state.random) + 1.0;
               }
       };

state.schedule.scheduleOnce(initialTIme, initialOrdering, repeat);




For a stateful distribution which requires its own instance, you attach the Mersenne Twister RNG during the constructor like this::

Steppable step = ...
double initialTime = 5.0;
int initialOrdering = 0;

final Logarithmic lg = new Logarithmic(p, state.random);

RandomRepeat repeat = new RandomRepeat(step, initialOrdering, false)
       {
       protected double getNextTime(SimState state, double currentTime)
               {
		// return Logarithmic() + 1.0, say...
               return lg.nextDouble() + 1.0;
               }
       };

state.schedule.scheduleOnce(initialTIme, initialOrdering, repeat);

ATOM RSS1 RSS2