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/08/01 15:57:57 UTC
svn commit: r1509237 -
/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java
Author: erans
Date: Thu Aug 1 13:57:57 2013
New Revision: 1509237
URL: http://svn.apache.org/r1509237
Log:
MATH-1012
Removed duplicate code.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java?rev=1509237&r1=1509236&r2=1509237&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/random/RandomDataGenerator.java Thu Aug 1 13:57:57 2013
@@ -118,7 +118,7 @@ public class RandomDataGenerator impleme
private RandomGenerator rand = null;
/** underlying secure random number generator */
- private SecureRandom secRand = null;
+ private RandomGenerator secRand = null;
/**
* Construct a RandomDataGenerator, using a default random generator as the source
@@ -278,7 +278,7 @@ public class RandomDataGenerator impleme
}
// Get SecureRandom and setup Digest provider
- SecureRandom secRan = getSecRan();
+ final RandomGenerator secRan = getSecRan();
MessageDigest alg = null;
try {
alg = MessageDigest.getInstance("SHA-1");
@@ -323,25 +323,7 @@ public class RandomDataGenerator impleme
/** {@inheritDoc} */
public int nextSecureInt(final int lower, final int upper) throws NumberIsTooLargeException {
- if (lower >= upper) {
- throw new NumberIsTooLargeException(LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND,
- lower, upper, false);
- }
- 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 directly a simple rejection method
- final SecureRandom rng = getSecRan();
- while (true) {
- final int r = rng.nextInt();
- if (r >= lower && r <= upper) {
- return r;
- }
- }
- } else {
- // we can shift the range and generate directly a positive int
- return lower + getSecRan().nextInt(max);
- }
+ return new UniformIntegerDistribution(getSecRan(), lower, upper).sample();
}
/** {@inheritDoc} */
@@ -350,11 +332,11 @@ public class RandomDataGenerator impleme
throw new NumberIsTooLargeException(LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND,
lower, upper, false);
}
+ final RandomGenerator rng = getSecRan();
final long max = (upper - lower) + 1;
if (max <= 0) {
// the range is too wide to fit in a positive long (larger than 2^63); as it covers
// more than half the long range, we use directly a simple rejection method
- final SecureRandom rng = getSecRan();
while (true) {
final long r = rng.nextLong();
if (r >= lower && r <= upper) {
@@ -363,45 +345,14 @@ public class RandomDataGenerator impleme
}
} else if (max < Integer.MAX_VALUE){
// we can shift the range and generate directly a positive int
- return lower + getSecRan().nextInt((int) max);
+ return lower + rng.nextInt((int) max);
} else {
// we can shift the range and generate directly a positive long
- return lower + nextLong(getSecRan(), max);
+ return lower + nextLong(rng, max);
}
}
/**
- * Returns a pseudorandom, uniformly distributed <tt>long</tt> value
- * between 0 (inclusive) and the specified value (exclusive), drawn from
- * this random number generator's sequence.
- *
- * @param rng random generator to use
- * @param n the bound on the random number to be returned. Must be
- * positive.
- * @return a pseudorandom, uniformly distributed <tt>long</tt>
- * value between 0 (inclusive) and n (exclusive).
- * @throws IllegalArgumentException if n is not positive.
- */
- private static long nextLong(final SecureRandom rng, final long n) throws IllegalArgumentException {
- if (n > 0) {
- final byte[] byteArray = new byte[8];
- long bits;
- long val;
- do {
- rng.nextBytes(byteArray);
- bits = 0;
- for (final byte b : byteArray) {
- bits = (bits << 8) | (((long) b) & 0xffL);
- }
- bits = bits & 0x7fffffffffffffffL;
- val = bits % n;
- } while (bits - val + (n - 1) < 0);
- return val;
- }
- throw new NotStrictlyPositiveException(n);
- }
-
- /**
* {@inheritDoc}
* <p>
* <strong>Algorithm Description</strong>:
@@ -793,7 +744,7 @@ public class RandomDataGenerator impleme
*/
public void setSecureAlgorithm(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException {
- secRand = SecureRandom.getInstance(algorithm, provider);
+ secRand = RandomGeneratorFactory.createRandomGenerator(SecureRandom.getInstance(algorithm, provider));
}
/**
@@ -829,11 +780,12 @@ public class RandomDataGenerator impleme
* {@code System.currentTimeMillis() + System.identityHashCode(this)} as the default seed.
* </p>
*
- * @return the SecureRandom used to generate secure random data
+ * @return the SecureRandom used to generate secure random data, wrapped in a
+ * {@link RandomGenerator}.
*/
- private SecureRandom getSecRan() {
+ private RandomGenerator getSecRan() {
if (secRand == null) {
- secRand = new SecureRandom();
+ secRand = RandomGeneratorFactory.createRandomGenerator(new SecureRandom());
secRand.setSeed(System.currentTimeMillis() + System.identityHashCode(this));
}
return secRand;