Merge branch 'master' of https://gitbox.apache.org/repos/asf/commons-lang.git
This commit is contained in:
commit
37de491eb3
|
@ -48,6 +48,7 @@ The <action> type attribute can be add,update,fix,remove.
|
||||||
<release version="3.12" date="2020-MM-DD" description="New features and bug fixes.">
|
<release version="3.12" date="2020-MM-DD" description="New features and bug fixes.">
|
||||||
<action issue="LANG-1591" type="update" dev="kinow" due-to="bhawna94">Remove redundant argument from substring call.</action>
|
<action issue="LANG-1591" type="update" dev="kinow" due-to="bhawna94">Remove redundant argument from substring call.</action>
|
||||||
<action type="update" dev="ggregory" due-to="Enable Dependabot #587">Enable Dependabot #587.</action>
|
<action type="update" dev="ggregory" due-to="Enable Dependabot #587">Enable Dependabot #587.</action>
|
||||||
|
<action issue="LANG-1592" type="fix" dev="aherbert" due-to="Huang Pingcai, Alex Herbert">Correct implementation of RandomUtils.nextLong(long, long)</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="3.11" date="2020-07-12" description="New features and bug fixes.">
|
<release version="3.11" date="2020-07-12" description="New features and bug fixes.">
|
||||||
<action type="update" dev="chtompki" due-to="Jin Xu">Refine test output for FastDateParserTest</action>
|
<action type="update" dev="chtompki" due-to="Jin Xu">Refine test output for FastDateParserTest</action>
|
||||||
|
|
|
@ -145,7 +145,7 @@ public class RandomUtils {
|
||||||
return startInclusive;
|
return startInclusive;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (long) nextDouble(startInclusive, endExclusive);
|
return startInclusive + nextLong(endExclusive - startInclusive);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -156,7 +156,27 @@ public class RandomUtils {
|
||||||
* @since 3.5
|
* @since 3.5
|
||||||
*/
|
*/
|
||||||
public static long nextLong() {
|
public static long nextLong() {
|
||||||
return nextLong(0, Long.MAX_VALUE);
|
return nextLong(Long.MAX_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a {@code long} value between 0 (inclusive) and the specified
|
||||||
|
* value (exclusive).
|
||||||
|
*
|
||||||
|
* @param n Bound on the random number to be returned. Must be positive.
|
||||||
|
* @return a random {@code long} value between 0 (inclusive) and {@code n}
|
||||||
|
* (exclusive).
|
||||||
|
*/
|
||||||
|
private static long nextLong(long n) {
|
||||||
|
// Extracted from o.a.c.rng.core.BaseProvider.nextLong(long)
|
||||||
|
long bits;
|
||||||
|
long val;
|
||||||
|
do {
|
||||||
|
bits = RANDOM.nextLong() >>> 1;
|
||||||
|
val = bits % n;
|
||||||
|
} while (bits - val + (n - 1) < 0);
|
||||||
|
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.commons.lang3;
|
||||||
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
@ -262,4 +263,28 @@ public class RandomUtilsTest {
|
||||||
final double result = RandomUtils.nextDouble(0, Double.MAX_VALUE);
|
final double result = RandomUtils.nextDouble(0, Double.MAX_VALUE);
|
||||||
assertTrue(result >= 0 && result <= Double.MAX_VALUE);
|
assertTrue(result >= 0 && result <= Double.MAX_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test a large value for long. A previous implementation using
|
||||||
|
* {@link RandomUtils#nextDouble(double, double)} could generate a value equal
|
||||||
|
* to the upper limit.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* return (long) nextDouble(startInclusive, endExclusive);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* <p>See LANG-1592.</p>
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testLargeValueRangeLong() {
|
||||||
|
final long startInclusive = 12900000000001L;
|
||||||
|
final long endExclusive = 12900000000016L;
|
||||||
|
// Note: The method using 'return (long) nextDouble(startInclusive, endExclusive)'
|
||||||
|
// takes thousands of calls to generate an error. This size loop fails most
|
||||||
|
// of the time with the previous method.
|
||||||
|
final int n = (int) (endExclusive - startInclusive) * 1000;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
assertNotEquals(endExclusive, RandomUtils.nextLong(startInclusive, endExclusive));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue