Added bound to simulation loop in nextPoisson().

git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/math/trunk@141088 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Phil Steitz 2004-01-31 06:58:46 +00:00
parent 450ff9aa92
commit f1e2670f72
1 changed files with 10 additions and 4 deletions

View File

@ -105,7 +105,7 @@ import java.util.Collection;
* (so secure sequences started with calls to reseedSecure(long) won't be * (so secure sequences started with calls to reseedSecure(long) won't be
* identical).</li></ul> * identical).</li></ul>
* *
* @version $Revision: 1.10 $ $Date: 2004/01/29 00:49:01 $ * @version $Revision: 1.11 $ $Date: 2004/01/31 06:58:46 $
*/ */
public class RandomDataImpl implements RandomData, Serializable { public class RandomDataImpl implements RandomData, Serializable {
@ -297,11 +297,15 @@ public class RandomDataImpl implements RandomData, Serializable {
} }
/** /**
* Generates a random long value from the Poisson distribution with the given mean.
* <p>
* <strong>Algorithm Description</strong>: * <strong>Algorithm Description</strong>:
* Uses simulation of a Poisson process using Uniform deviates, as * Uses simulation of a Poisson process using Uniform deviates, as
* described * described
* <a href ="http://dmawww.epfl.ch/benarous/Pmmi/interactive/rng7.htm"> * <a href ="http://dmawww.epfl.ch/benarous/Pmmi/interactive/rng7.htm">
* here</a> * here.</a>
* <p>
* The Poisson process (and hence value returned) is bounded by 1000 * mean.
* @param mean mean of the Poisson distribution. * @param mean mean of the Poisson distribution.
* @return the random Poisson value. * @return the random Poisson value.
*/ */
@ -312,9 +316,10 @@ public class RandomDataImpl implements RandomData, Serializable {
double p = Math.exp(-mean); double p = Math.exp(-mean);
long n = 0; long n = 0;
double r = 1.0d; double r = 1.0d;
double rnd = 1.0d;
Random rand = getRan(); Random rand = getRan();
while (true) { while (n < 1000 * mean) {
double rnd = rand.nextDouble(); rnd = rand.nextDouble();
r = r * rnd; r = r * rnd;
if (r >= p) { if (r >= p) {
n++; n++;
@ -322,6 +327,7 @@ public class RandomDataImpl implements RandomData, Serializable {
return n; return n;
} }
} }
return n;
} }
/** /**