ngmf.ui.calc.RandomExponential Maven / Gradle / Ivy
/*
* RandomExponential.java
*
* Created on April 27, 2007, 3:53 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package ngmf.ui.calc;
import java.util.Random;
/**
*
* @author olafdavid
*/
/**
* Utility class that generates exponentially-distributed
* random values using several algorithms.
*/
public class RandomExponential {
private float mean;
/** generator of uniformly-distributed random values */
private static Random gen = new Random();
/**
* Set the mean.
* @param mean the mean
*/
public void setParameters(float mean) {
this.mean = mean;
}
/**
* Compute the next randomn value using the logarithm algorithm.
* Requires a uniformly-distributed random value in [0, 1).
*/
public float nextLog() {
// Generate a non-zero uniformly-distributed random value.
float u;
while ((u = gen.nextFloat()) == 0); // try again if 0
return (float) (-mean*Math.log(u));
}
/**
* Compute the next randomn value using the von Neumann algorithm.
* Requires sequences of uniformly-distributed random values
* in [0, 1).
*/
public float nextVonNeumann() {
int n;
int k = 0;
float u1;
// Loop to try sequences of uniformly-distributed
// random values.
for (;;) {
n = 1;
u1 = gen.nextFloat();
float u = u1;
float uPrev = Float.NaN;
// Loop to generate a sequence of ramdom values
// as long as they are decreasing.
for (;;) {
uPrev = u;
u = gen.nextFloat();
// No longer decreasing?
if (u > uPrev) {
// n is even.
if ((n & 1) == 0) {
return u1 + k; // return a random value
}
// n is odd.
else {
++k;
break; // try another sequence
}
}
++n;
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy