You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2013/07/31 14:17:20 UTC

svn commit: r1508829 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java

Author: erans
Date: Wed Jul 31 12:17:20 2013
New Revision: 1508829

URL: http://svn.apache.org/r1508829
Log:
MATH-1011
Replaced implementation (with a more robust one, copied from
"o.a.c.m.random.RandomDataGenerator").

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java?rev=1508829&r1=1508828&r2=1508829&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/distribution/UniformIntegerDistribution.java Wed Jul 31 12:17:20 2013
@@ -156,8 +156,21 @@ public class UniformIntegerDistribution 
     /** {@inheritDoc} */
     @Override
     public int sample() {
-        final double r = random.nextDouble();
-        final double scaled = r * upper + (1 - r) * lower + r;
-        return (int) FastMath.floor(scaled);
+        final int max = (upper - lower) + 1;
+        if (max <= 0) {
+            // The range is too wide to fit in a positive int (larger
+            // than 2^31); as it covers more than half the integer range,
+            // we use a simple rejection method.
+            while (true) {
+                final int r = random.nextInt();
+                if (r >= lower &&
+                    r <= upper) {
+                    return r;
+                }
+            }
+        } else {
+            // We can shift the range and directly generate a positive int.
+            return lower + random.nextInt(max);
+        }
     }
 }