ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/SplittableRandom.java
(Generate patch)

Comparing jsr166/src/main/java/util/SplittableRandom.java (file contents):
Revision 1.28 by jsr166, Sat Sep 19 21:07:10 2015 UTC vs.
Revision 1.36 by jsr166, Sun Nov 13 03:36:50 2016 UTC

# Line 219 | Line 219 | public final class SplittableRandom {
219          return seed += gamma;
220      }
221  
222 +    // IllegalArgumentException messages
223 +    static final String BAD_BOUND = "bound must be positive";
224 +    static final String BAD_RANGE = "bound must be greater than origin";
225 +    static final String BAD_SIZE  = "size must be non-negative";
226 +
227      /**
228       * The seed generator for default constructors.
229       */
230 <    private static final AtomicLong defaultGen = new AtomicLong(initialSeed());
231 <
232 <    private static long initialSeed() {
233 <        String pp = java.security.AccessController.doPrivileged(
234 <                new sun.security.action.GetPropertyAction(
235 <                        "java.util.secureRandomSeed"));
236 <        if (pp != null && pp.equalsIgnoreCase("true")) {
230 >    private static final AtomicLong defaultGen
231 >        = new AtomicLong(mix64(System.currentTimeMillis()) ^
232 >                         mix64(System.nanoTime()));
233 >
234 >    // at end of <clinit> to survive static initialization circularity
235 >    static {
236 >        if (java.security.AccessController.doPrivileged(
237 >            new java.security.PrivilegedAction<Boolean>() {
238 >                public Boolean run() {
239 >                    return Boolean.getBoolean("java.util.secureRandomSeed");
240 >                }})) {
241              byte[] seedBytes = java.security.SecureRandom.getSeed(8);
242 <            long s = (long)(seedBytes[0]) & 0xffL;
242 >            long s = (long)seedBytes[0] & 0xffL;
243              for (int i = 1; i < 8; ++i)
244 <                s = (s << 8) | ((long)(seedBytes[i]) & 0xffL);
245 <            return s;
244 >                s = (s << 8) | ((long)seedBytes[i] & 0xffL);
245 >            defaultGen.set(s);
246          }
238        return (mix64(System.currentTimeMillis()) ^
239                mix64(System.nanoTime()));
247      }
248  
242    // IllegalArgumentException messages
243    static final String BAD_BOUND = "bound must be positive";
244    static final String BAD_RANGE = "bound must be greater than origin";
245    static final String BAD_SIZE  = "size must be non-negative";
246
249      /*
250       * Internal versions of nextX methods used by streams, as well as
251       * the public nextX(origin, bound) methods.  These exist mainly to
# Line 529 | Line 531 | public final class SplittableRandom {
531      }
532  
533      /**
534 +     * Generates a pseudorandom number with the indicated number of
535 +     * low-order bits.  Because this class has no subclasses, this
536 +     * method cannot be invoked or overridden.
537 +     *
538 +     * @param  bits random bits
539 +     * @return the next pseudorandom value from this random number
540 +     *         generator's sequence
541 +     */
542 +    protected int next(int bits) {
543 +        return nextInt() >>> (32 - bits);
544 +    }
545 +
546 +    /**
547       * Returns a pseudorandom {@code double} value between the specified
548       * origin (inclusive) and bound (exclusive).
549       *
# Line 825 | Line 840 | public final class SplittableRandom {
840       * approach. The long and double versions of this class are
841       * identical except for types.
842       */
843 <    static final class RandomIntsSpliterator implements Spliterator.OfInt {
843 >    private static final class RandomIntsSpliterator
844 >            implements Spliterator.OfInt {
845          final SplittableRandom rng;
846          long index;
847          final long fence;
# Line 880 | Line 896 | public final class SplittableRandom {
896      /**
897       * Spliterator for long streams.
898       */
899 <    static final class RandomLongsSpliterator implements Spliterator.OfLong {
899 >    private static final class RandomLongsSpliterator
900 >            implements Spliterator.OfLong {
901          final SplittableRandom rng;
902          long index;
903          final long fence;
# Line 936 | Line 953 | public final class SplittableRandom {
953      /**
954       * Spliterator for double streams.
955       */
956 <    static final class RandomDoublesSpliterator implements Spliterator.OfDouble {
956 >    private static final class RandomDoublesSpliterator
957 >            implements Spliterator.OfDouble {
958          final SplittableRandom rng;
959          long index;
960          final long fence;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines