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 2021/06/14 20:29:01 UTC
[commons-math] 02/02: MATH-1610: Functionality moved to "Commons
RNG" (cf. RNG-145).
This is an automated email from the ASF dual-hosted git repository.
erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git
commit b509678e95f313d05bfdae6e38492b3dbb306b5a
Author: Gilles Sadowski <gi...@gmail.com>
AuthorDate: Mon Jun 14 22:26:22 2021 +0200
MATH-1610: Functionality moved to "Commons RNG" (cf. RNG-145).
---
.../commons/math4/legacy/random/RandomUtils.java | 84 ---------------
.../RandomUtilsDataGeneratorAbstractTest.java | 116 ---------------------
2 files changed, 200 deletions(-)
diff --git a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
index 35b8585..48d2464 100644
--- a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
+++ b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
@@ -97,89 +97,5 @@ public class RandomUtils {
return lower + rng.nextLong(max);
}
}
-
- /**
- * Generates a uniformly distributed random value from the open interval
- * {@code (lower, upper)} (i.e., endpoints excluded).
- * <p>
- * <strong>Definition</strong>:
- * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3662.htm">
- * Uniform Distribution</a> {@code lower} and {@code upper - lower} are the
- * <a href = "http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm">
- * location and scale parameters</a>, respectively.</p>
- * <p>
- * <strong>Algorithm Description</strong>: scales the output of
- * Random.nextDouble(), but rejects 0 values (i.e., will generate another
- * random double if Random.nextDouble() returns 0). This is necessary to
- * provide a symmetric output interval (both endpoints excluded).
- * </p>
- *
- * @param lower Lower bound of the support (excluded).
- * @param upper Upper bound of the support (excluded).
- * @return a uniformly distributed random value between lower and upper
- * (both excluded).
- * @throws NumberIsTooLargeException if {@code lower >= upper}.
- * @throws NotFiniteNumberException if one of the bounds is infinite.
- * @throws NotANumberException if one of the bounds is NaN.
- */
- public double nextUniform(double lower, double upper) {
- return nextUniform(lower, upper, false);
- }
-
- /**
- * Generates a uniformly distributed random value from the interval
- * {@code (lower, upper)} or the interval {@code [lower, upper)}. The lower
- * bound is thus optionally included, while the upper bound is always
- * excluded.
- * <p>
- * <strong>Definition</strong>:
- * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3662.htm">
- * Uniform Distribution</a> {@code lower} and {@code upper - lower} are the
- * <a href = "http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm">
- * location and scale parameters</a>, respectively.</p>
- * <p>
- * <strong>Algorithm Description</strong>: if the lower bound is excluded,
- * scales the output of "nextDouble()", but rejects 0 values (i.e. it
- * will generate another random double if "nextDouble()" returns 0).
- * This is necessary to provide a symmetric output interval (both
- * endpoints excluded).
- * </p>
- *
- * @param lower Lower bound of the support.
- * @param upper Exclusive upper bound of the support.
- * @param lowerInclusive {@code true} if the lower bound is inclusive.
- * @return a uniformly distributed random value in the {@code (lower, upper)}
- * interval, if {@code lowerInclusive} is {@code false}, or in the
- * {@code [lower, upper)} interval, if {@code lowerInclusive} is
- * {@code true}.
- * @throws NumberIsTooLargeException if {@code lower >= upper}.
- * @throws NotFiniteNumberException if one of the bounds is infinite.
- * @throws NotANumberException if one of the bounds is NaN.
- */
- public double nextUniform(double lower,
- double upper,
- boolean lowerInclusive) {
- if (lower >= upper) {
- throw new NumberIsTooLargeException(LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND,
- lower, upper, false);
- }
- if (Double.isInfinite(lower)) {
- throw new NotFiniteNumberException(LocalizedFormats.INFINITE_BOUND, lower);
- }
- if (Double.isInfinite(upper)) {
- throw new NotFiniteNumberException(LocalizedFormats.INFINITE_BOUND, upper);
- }
- if (Double.isNaN(lower) || Double.isNaN(upper)) {
- throw new NotANumberException();
- }
-
- // Ensure nextDouble() isn't 0.0
- double u = rng.nextDouble();
- while (!lowerInclusive && u <= 0.0) {
- u = rng.nextDouble();
- }
-
- return u * upper + (1.0 - u) * lower;
- }
}
}
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
index 1edb371..c1f611a 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
@@ -52,17 +52,6 @@ public abstract class RandomUtilsDataGeneratorAbstractTest {
}
@Test
- public void testNextUniformExtremeValues() {
- double x = randomData.nextUniform(-Double.MAX_VALUE, Double.MAX_VALUE);
- double y = randomData.nextUniform(-Double.MAX_VALUE, Double.MAX_VALUE);
- Assert.assertFalse(x == y);
- Assert.assertFalse(Double.isNaN(x));
- Assert.assertFalse(Double.isNaN(y));
- Assert.assertFalse(Double.isInfinite(x));
- Assert.assertFalse(Double.isInfinite(y));
- }
-
- @Test
public void testNextLongIAE() {
try {
randomData.nextLong(4, 3);
@@ -136,109 +125,4 @@ public abstract class RandomUtilsDataGeneratorAbstractTest {
(((double) upper) - ((double) lower));
Assert.assertTrue(ratio > 0.99999);
}
-
- @Test
- public void testNextUniformIAE() {
- try {
- randomData.nextUniform(4, 3);
- Assert.fail("MathIllegalArgumentException expected");
- } catch (MathIllegalArgumentException ex) {
- // ignored
- }
- try {
- randomData.nextUniform(0, Double.POSITIVE_INFINITY);
- Assert.fail("MathIllegalArgumentException expected");
- } catch (MathIllegalArgumentException ex) {
- // ignored
- }
- try {
- randomData.nextUniform(Double.NEGATIVE_INFINITY, 0);
- Assert.fail("MathIllegalArgumentException expected");
- } catch (MathIllegalArgumentException ex) {
- // ignored
- }
- try {
- randomData.nextUniform(0, Double.NaN);
- Assert.fail("MathIllegalArgumentException expected");
- } catch (MathIllegalArgumentException ex) {
- // ignored
- }
- try {
- randomData.nextUniform(Double.NaN, 0);
- Assert.fail("MathIllegalArgumentException expected");
- } catch (MathIllegalArgumentException ex) {
- // ignored
- }
- }
-
- @Test
- public void testNextUniformPositiveBounds() {
- for (int i = 0; i < 5; i++) {
- checkNextUniform(0, 10);
- }
- }
-
- @Test
- public void testNextUniformNegativeToPositiveBounds() {
- for (int i = 0; i < 5; i++) {
- checkNextUniform(-3, 5);
- }
- }
-
- @Test
- public void testNextUniformNegativeBounds() {
- for (int i = 0; i < 5; i++) {
- checkNextUniform(-7, -3);
- }
- }
-
- @Test
- public void testNextUniformMaximalInterval() {
- for (int i = 0; i < 5; i++) {
- checkNextUniform(-Double.MAX_VALUE, Double.MAX_VALUE);
- }
- }
-
- private void checkNextUniform(double min, double max) {
- // Set up bin bounds - min, binBound[0], ..., binBound[binCount-2], max
- final int binCount = 5;
- final double binSize = max / binCount - min/binCount; // Prevent overflow in extreme value case
- final double[] binBounds = new double[binCount - 1];
- binBounds[0] = min + binSize;
- for (int i = 1; i < binCount - 1; i++) {
- binBounds[i] = binBounds[i - 1] + binSize; // + instead of * to avoid overflow in extreme case
- }
-
- final Frequency<Integer> freq = new Frequency<>();
- for (int i = 0; i < smallSampleSize; i++) {
- final double value = randomData.nextUniform(min, max);
- Assert.assertTrue("nextUniform range", (value > min) && (value < max));
- // Find bin
- int j = 0;
- while (j < binCount - 1 && value > binBounds[j]) {
- j++;
- }
- freq.addValue(j);
- }
-
- final long[] observed = new long[binCount];
- for (int i = 0; i < binCount; i++) {
- observed[i] = freq.getCount(i);
- }
- final double[] expected = new double[binCount];
- for (int i = 0; i < binCount; i++) {
- expected[i] = 1d / binCount;
- }
-
- TestUtils.assertChiSquareAccept(expected, observed, 0.01);
- }
-
- /** test exclusive endpoints of nextUniform **/
- @Test
- public void testNextUniformExclusiveEndpoints() {
- for (int i = 0; i < 1000; i++) {
- double u = randomData.nextUniform(0.99, 1);
- Assert.assertTrue(u > 0.99 && u < 1);
- }
- }
}