L'open-source Uncommons Mathématiques de la bibliothèque par Dan Dyer fournit des générateurs de nombres aléatoires, distributions de probabilités, combinatoire et statistiques pour Java.
Parmi d'autres classes, ExponentialGenerator
a essentiellement mis en œuvre l'idée expliqué par @Alok Singhal. Dans son tutoriel blog, un extrait de code est donné à simuler un événement aléatoire qui s'est passé en moyenne 10 fois par minute:
final long oneMinute = 60000;
Random rng = new MersenneTwisterRNG();
// Generate events at an average rate of 10 per minute.
ExponentialGenerator gen = new ExponentialGenerator(10, rng);
boolean running = true;
while (true)
{
long interval = Math.round(gen.nextValue() * oneMinute);
Thread.sleep(interval);
// Fire event here.
}
Bien sûr, si vous préférez l'unité de temps per second
(au lieu de a minute
ici), il vous suffit de définir final long oneMinute = 1000
.
Pour aller plus loin dans le code source de la méthode de nextValue()
de ExponentialGenerator
,, vous trouverez la soi-disant transformation inverse d'échantillonnage décrites dans Generating_exponential_variates [wiki]:
public Double nextValue()
{
double u;
do
{
// Get a uniformly-distributed random double between
// zero (inclusive) and 1 (exclusive)
u = rng.nextDouble();
} while (u == 0d); // Reject zero, u must be positive for this to work.
return (-Math.log(u)) / rate.nextValue();
}
P. S.: Récemment, je suis en utilisant le Uncommons Mathématiques de la bibliothèque. Merci Dan Dyer.