package com.linkedin.parseq;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class PoissonEventsArrival implements EventsArrival {
private final Random _rand = new Random(System.nanoTime());
private final double _nanosToNextEventMean;
public PoissonEventsArrival(double events, TimeUnit perUnit) {
if (events <= 0) {
throw new IllegalArgumentException("events must be a positive number");
}
_nanosToNextEventMean = perUnit.toNanos(1) / events;
}
@Override
public long nanosToNextEvent() {
//rand is uniformly distributed form 0.0d inclusive up to 1.0d exclusive
double rand = _rand.nextDouble();
return (long)(-_nanosToNextEventMean * Math.log(1 - rand));
}
@Override
public String toString() {
return "PoissonEventsArrival [nanosToNextEventMean=" + _nanosToNextEventMean + "]";
}
}