## MASON-INTEREST-L@LISTSERV.GMU.EDU

#### View:

 Message: [ First | Previous | Next | Last ] By Topic: [ First | Previous | Next | Last ] By Author: [ First | Previous | Next | Last ] Font: Proportional Font

Subject:

Re: Scheduling agents based on a probability distribution

From:

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); ```