1a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson/*
229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is free software; you can redistribute it and/or modify it
529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * under the terms of the GNU General Public License version 2 only, as
629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * published by the Free Software Foundation.  Oracle designates this
729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * particular file as subject to the "Classpath" exception as provided
829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * by Oracle in the LICENSE file that accompanied this code.
929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
1029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This code is distributed in the hope that it will be useful, but WITHOUT
1129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * version 2 for more details (a copy is included in the LICENSE file that
1429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * accompanied this code).
1529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
1629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * You should have received a copy of the GNU General Public License version
1729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * 2 along with this work; if not, write to the Free Software Foundation,
1829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
2029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2129957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * or visit www.oracle.com if you need additional information or have any
2229957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * questions.
2329957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer */
2429957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer
2529957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer/*
2629957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * This file is available under and governed by the GNU General Public
2729957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * License version 2 only, as published by the Free Software Foundation.
2829957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * However, the following notice accompanied the original version of this
2929957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer * file:
3029957558cf0db700bfaae360a80c42dc3871d0e5Tobias Thierer *
31a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Written by Doug Lea with assistance from members of JCP JSR-166
32a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Expert Group and released to the public domain, as explained at
33a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * http://creativecommons.org/publicdomain/zero/1.0/
34a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson */
35a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
36a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonpackage java.util.concurrent;
37a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
38e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.io.ObjectStreamField;
39a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.Random;
40e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.Spliterator;
41e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicInteger;
42e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicLong;
43e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.function.DoubleConsumer;
44e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.function.IntConsumer;
45e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniakimport java.util.function.LongConsumer;
46ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.stream.DoubleStream;
47ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.stream.IntStream;
48ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.stream.LongStream;
49ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.stream.StreamSupport;
50a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
51a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson/**
52a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * A random number generator isolated to the current thread.  Like the
53a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * global {@link java.util.Random} generator used by the {@link
54a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * java.lang.Math} class, a {@code ThreadLocalRandom} is initialized
55a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * with an internally generated seed that may not otherwise be
56a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * modified. When applicable, use of {@code ThreadLocalRandom} rather
57a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * than shared {@code Random} objects in concurrent programs will
58a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * typically encounter much less overhead and contention.  Use of
59a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@code ThreadLocalRandom} is particularly appropriate when multiple
60a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * tasks (for example, each a {@link ForkJoinTask}) use random numbers
61a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * in parallel in thread pools.
62a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
63a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>Usages of this class should typically be of the form:
64a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@code ThreadLocalRandom.current().nextX(...)} (where
65a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@code X} is {@code Int}, {@code Long}, etc).
66a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * When all usages are of this form, it is never possible to
67a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * accidently share a {@code ThreadLocalRandom} across multiple threads.
68a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
69a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>This class also provides additional commonly used bounded random
70a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * generation methods.
71a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
72e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * <p>Instances of {@code ThreadLocalRandom} are not cryptographically
73e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * secure.  Consider instead using {@link java.security.SecureRandom}
74e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * in security-sensitive applications. Additionally,
75e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * default-constructed instances do not use a cryptographically random
76e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * seed unless the {@linkplain System#getProperty system property}
77e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak * {@code java.util.secureRandomSeed} is set to {@code true}.
78e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak *
79a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * @since 1.7
80a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * @author Doug Lea
81a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson */
82a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonpublic class ThreadLocalRandom extends Random {
83e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /*
84e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * This class implements the java.util.Random API (and subclasses
85e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Random) using a single static instance that accesses random
86e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * number state held in class Thread (primarily, field
87e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * threadLocalRandomSeed). In doing so, it also provides a home
88e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * for managing package-private utilities that rely on exactly the
89e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * same state as needed to maintain the ThreadLocalRandom
90e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * instances. We leverage the need for an initialization flag
91e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * field to also use it as a "probe" -- a self-adjusting thread
92e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * hash used for contention avoidance, as well as a secondary
93e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * simpler (xorShift) random seed that is conservatively used to
94e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * avoid otherwise surprising users by hijacking the
95e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * ThreadLocalRandom sequence.  The dual use is a marriage of
96e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * convenience, but is a simple and efficient way of reducing
97e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * application-level overhead and footprint of most concurrent
98e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * programs.
99e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
100e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Even though this class subclasses java.util.Random, it uses the
101e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * same basic algorithm as java.util.SplittableRandom.  (See its
102e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * internal documentation for explanations, which are not repeated
103e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * here.)  Because ThreadLocalRandoms are not splittable
104e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * though, we use only a single 64bit gamma.
105e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
106e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Because this class is in a different package than class Thread,
107e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * field access methods use Unsafe to bypass access control rules.
108e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * To conform to the requirements of the Random superclass
109e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * constructor, the common static ThreadLocalRandom maintains an
110e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * "initialized" field for the sake of rejecting user calls to
111e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * setSeed while still allowing a call from constructor.  Note
112e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * that serialization is completely unnecessary because there is
113e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * only a static singleton.  But we generate a serial form
114e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * containing "rnd" and "initialized" fields to ensure
115e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * compatibility across versions.
116e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
117e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Implementations of non-core methods are mostly the same as in
118e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * SplittableRandom, that were in part derived from a previous
119e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * version of this class.
120e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
121e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The nextLocalGaussian ThreadLocal supports the very rarely used
122e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * nextGaussian method by providing a holder for the second of a
123e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * pair of them. As is true for the base class version of this
124e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * method, this time/space tradeoff is probably never worthwhile,
125e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * but we provide identical statistical properties.
126a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
127a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
128e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static long mix64(long z) {
129e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        z = (z ^ (z >>> 33)) * 0xff51afd7ed558ccdL;
130e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        z = (z ^ (z >>> 33)) * 0xc4ceb9fe1a85ec53L;
131e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return z ^ (z >>> 33);
132e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
133a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
134e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static int mix32(long z) {
135e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        z = (z ^ (z >>> 33)) * 0xff51afd7ed558ccdL;
136e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return (int)(((z ^ (z >>> 33)) * 0xc4ceb9fe1a85ec53L) >>> 32);
137e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
138a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
139a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
140e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Field used only during singleton initialization.
141e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * True when constructor completes.
142a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
143e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    boolean initialized;
144a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
145e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /** Constructor used only for static singleton */
146e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private ThreadLocalRandom() {
147e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        initialized = true; // false during super() call
148e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
149a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
150a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
151e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Initialize Thread fields for the current thread.  Called only
152e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * when Thread.threadLocalRandomProbe is zero, indicating that a
153e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * thread local seed value needs to be generated. Note that even
154e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * though the initialization is purely thread-local, we need to
155e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * rely on (static) atomic generators to initialize the values.
156a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
157e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final void localInit() {
158e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int p = probeGenerator.addAndGet(PROBE_INCREMENT);
159e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int probe = (p == 0) ? 1 : p; // skip 0
160e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT));
161e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Thread t = Thread.currentThread();
162e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        U.putLong(t, SEED, seed);
163e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        U.putInt(t, PROBE, probe);
164a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
165a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
166a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
167a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns the current thread's {@code ThreadLocalRandom}.
168a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
169a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the current thread's {@code ThreadLocalRandom}
170a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
171a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static ThreadLocalRandom current() {
172e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (U.getInt(Thread.currentThread(), PROBE) == 0)
173e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            localInit();
174e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return instance;
175a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
176a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
177a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
178a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Throws {@code UnsupportedOperationException}.  Setting seeds in
179a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * this generator is not supported.
180a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
181a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws UnsupportedOperationException always
182a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
183a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public void setSeed(long seed) {
184e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        // only allow call from super() constructor
185a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (initialized)
186a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new UnsupportedOperationException();
187a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
188a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
189e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    final long nextSeed() {
190e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Thread t; long r; // read and update per-thread seed
191e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        U.putLong(t = Thread.currentThread(), SEED,
192e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                  r = U.getLong(t, SEED) + GAMMA);
193e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
194e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
195e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
196e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // We must define this, but never use it.
197a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected int next(int bits) {
198e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return (int)(mix64(nextSeed()) >>> (64 - bits));
199e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
200e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
201e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
202e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The form of nextLong used by LongStream Spliterators.  If
203e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * origin is greater than bound, acts as unbounded form of
204e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * nextLong, else as bounded form.
205e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
206e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value, unless greater than bound
207e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive), must not equal origin
208e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom value
209e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
210e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    final long internalNextLong(long origin, long bound) {
211e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long r = mix64(nextSeed());
212e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (origin < bound) {
213e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long n = bound - origin, m = n - 1;
214e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if ((n & m) == 0L)  // power of two
215e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                r = (r & m) + origin;
216e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            else if (n > 0L) {  // reject over-represented candidates
217e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                for (long u = r >>> 1;            // ensure nonnegative
218e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                     u + m - (r = u % n) < 0L;    // rejection check
219e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                     u = mix64(nextSeed()) >>> 1) // retry
220e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    ;
221e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                r += origin;
222e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
223e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            else {              // range not representable as long
224e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                while (r < origin || r >= bound)
225e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    r = mix64(nextSeed());
226e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
227e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
228e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
229e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
230e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
231e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
232e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The form of nextInt used by IntStream Spliterators.
233e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Exactly the same as long version, except for types.
234e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
235e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value, unless greater than bound
236e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive), must not equal origin
237e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom value
238e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
239e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    final int internalNextInt(int origin, int bound) {
240e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int r = mix32(nextSeed());
241e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (origin < bound) {
242e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            int n = bound - origin, m = n - 1;
243e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if ((n & m) == 0)
244e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                r = (r & m) + origin;
245e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            else if (n > 0) {
246e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                for (int u = r >>> 1;
247e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                     u + m - (r = u % n) < 0;
248e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                     u = mix32(nextSeed()) >>> 1)
249e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    ;
250e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                r += origin;
251e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
252e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            else {
253e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                while (r < origin || r >= bound)
254e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    r = mix32(nextSeed());
255e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
256e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
257e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
258e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
259e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
260e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
261e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The form of nextDouble used by DoubleStream Spliterators.
262e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
263e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value, unless greater than bound
264e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive), must not equal origin
265e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom value
266e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
267e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    final double internalNextDouble(double origin, double bound) {
268e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        double r = (nextLong() >>> 11) * DOUBLE_UNIT;
269e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (origin < bound) {
270e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r = r * (bound - origin) + origin;
271e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (r >= bound) // correct for rounding
272e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                r = Double.longBitsToDouble(Double.doubleToLongBits(bound) - 1);
273e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
274e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
275e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
276e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
277e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
278e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code int} value.
279e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
280e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code int} value
281e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
282e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public int nextInt() {
283e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return mix32(nextSeed());
284e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
285e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
286e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
287e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code int} value between zero (inclusive)
288e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * and the specified bound (exclusive).
289e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
290e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive).  Must be positive.
291e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code int} value between zero
292e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
293e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code bound} is not positive
294e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
295e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public int nextInt(int bound) {
296e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (bound <= 0)
297e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_BOUND);
298e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int r = mix32(nextSeed());
299e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int m = bound - 1;
300e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if ((bound & m) == 0) // power of two
301e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r &= m;
302e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        else { // reject over-represented candidates
303e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            for (int u = r >>> 1;
304e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                 u + m - (r = u % bound) < 0;
305e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                 u = mix32(nextSeed()) >>> 1)
306e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ;
307e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
308e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
309a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
310a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
311a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
312e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code int} value between the specified
313e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * origin (inclusive) and the specified bound (exclusive).
314a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
315e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value returned
316a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param bound the upper bound (exclusive)
317e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code int} value between the origin
318e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
319e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code origin} is greater than
320e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         or equal to {@code bound}
321e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
322e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public int nextInt(int origin, int bound) {
323e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (origin >= bound)
324e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_RANGE);
325e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return internalNextInt(origin, bound);
326e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
327e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
328e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
329e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code long} value.
330e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
331e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code long} value
332a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
333e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public long nextLong() {
334e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return mix64(nextSeed());
335a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
336a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
337a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
338e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code long} value between zero (inclusive)
339e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * and the specified bound (exclusive).
340a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
341e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive).  Must be positive.
342e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code long} value between zero
343e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
344e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code bound} is not positive
345a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
346e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public long nextLong(long bound) {
347e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (bound <= 0)
348e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_BOUND);
349e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long r = mix64(nextSeed());
350e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long m = bound - 1;
351e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if ((bound & m) == 0L) // power of two
352e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r &= m;
353e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        else { // reject over-represented candidates
354e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            for (long u = r >>> 1;
355e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                 u + m - (r = u % bound) < 0L;
356e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                 u = mix64(nextSeed()) >>> 1)
357e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ;
358a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
359e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
360a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
361a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
362a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
363e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code long} value between the specified
364e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * origin (inclusive) and the specified bound (exclusive).
365a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
366e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value returned
367a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param bound the upper bound (exclusive)
368e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code long} value between the origin
369e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
370e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code origin} is greater than
371e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         or equal to {@code bound}
372a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
373e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public long nextLong(long origin, long bound) {
374e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (origin >= bound)
375e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_RANGE);
376e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return internalNextLong(origin, bound);
377a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
378a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
379a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
380e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code double} value between zero
381e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * (inclusive) and one (exclusive).
382a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
383e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code double} value between zero
384e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and one (exclusive)
385a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
386e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public double nextDouble() {
387e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return (mix64(nextSeed()) >>> 11) * DOUBLE_UNIT;
388a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
389a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
390a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
391e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code double} value between 0.0
392e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * (inclusive) and the specified bound (exclusive).
393a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
394e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param bound the upper bound (exclusive).  Must be positive.
395e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code double} value between zero
396e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
397e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code bound} is not positive
398e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
399e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public double nextDouble(double bound) {
400e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (!(bound > 0.0))
401e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_BOUND);
402e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        double result = (mix64(nextSeed()) >>> 11) * DOUBLE_UNIT * bound;
403e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return (result < bound) ? result : // correct for rounding
404e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            Double.longBitsToDouble(Double.doubleToLongBits(bound) - 1);
405e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
406e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
407e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
408e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code double} value between the specified
409e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * origin (inclusive) and bound (exclusive).
410e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
411e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param origin the least value returned
412a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param bound the upper bound (exclusive)
413e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code double} value between the origin
414e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and the bound (exclusive)
415e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws IllegalArgumentException if {@code origin} is greater than
416e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         or equal to {@code bound}
417a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
418e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public double nextDouble(double origin, double bound) {
419e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (!(origin < bound))
420e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new IllegalArgumentException(BAD_RANGE);
421e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return internalNextDouble(origin, bound);
422e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
423e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
424e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
425e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code boolean} value.
426e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
427e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code boolean} value
428e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
429e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public boolean nextBoolean() {
430e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return mix32(nextSeed()) < 0;
431e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
432e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
433e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
434e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns a pseudorandom {@code float} value between zero
435e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * (inclusive) and one (exclusive).
436e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
437e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return a pseudorandom {@code float} value between zero
438e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *         (inclusive) and one (exclusive)
439e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
440e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public float nextFloat() {
441e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return (mix32(nextSeed()) >>> 8) * FLOAT_UNIT;
442e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
443e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
444e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    public double nextGaussian() {
445e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        // Use nextLocalGaussian instead of nextGaussian field
446e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Double d = nextLocalGaussian.get();
447e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (d != null) {
448e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            nextLocalGaussian.set(null);
449e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return d.doubleValue();
450e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
451e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        double v1, v2, s;
452e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        do {
453e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            v1 = 2 * nextDouble() - 1; // between -1 and 1
454e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            v2 = 2 * nextDouble() - 1; // between -1 and 1
455e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            s = v1 * v1 + v2 * v2;
456e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        } while (s >= 1 || s == 0);
457e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
458e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        nextLocalGaussian.set(new Double(v2 * multiplier));
459e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return v1 * multiplier;
460a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
461a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
462e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // stream methods, coded in a way intended to better isolate for
463e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // maintenance purposes the small differences across forms.
464ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
465ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number of
466ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pseudorandom {@code int} values.
467ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
468ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
469ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code int} values
470ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
471ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero
472ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
473ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
474ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public IntStream ints(long streamSize) {
475ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
476ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
477ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.intStream
478ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomIntsSpliterator
479ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, Integer.MAX_VALUE, 0),
480ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
481ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
482ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
483ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
484ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code int}
485ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * values.
486ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
487ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
488ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * ints(Long.MAX_VALUE)}.
489ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
490ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code int} values
491ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
492ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
493ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public IntStream ints() {
494ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.intStream
495ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomIntsSpliterator
496ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, Integer.MAX_VALUE, 0),
497ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
498ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
499ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
500ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
501ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number
502ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * of pseudorandom {@code int} values, each conforming to the given
503ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * origin (inclusive) and bound (exclusive).
504ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
505ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
506ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
507ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
508ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code int} values,
509ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
510ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
511ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero, or {@code randomNumberOrigin}
512ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
513ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
514ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
515ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public IntStream ints(long streamSize, int randomNumberOrigin,
516ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                          int randomNumberBound) {
517ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
518ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
519ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (randomNumberOrigin >= randomNumberBound)
520ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
521ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.intStream
522ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomIntsSpliterator
523ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, randomNumberOrigin, randomNumberBound),
524ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
525ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
526ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
527ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
528ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code
529ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * int} values, each conforming to the given origin (inclusive) and bound
530ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (exclusive).
531ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
532ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
533ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * ints(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)}.
534ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
535ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
536ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
537ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code int} values,
538ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
539ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code randomNumberOrigin}
540ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
541ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
542ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
543ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public IntStream ints(int randomNumberOrigin, int randomNumberBound) {
544ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (randomNumberOrigin >= randomNumberBound)
545ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
546ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.intStream
547ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomIntsSpliterator
548ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound),
549ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
550ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
551ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
552ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
553ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number of
554ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pseudorandom {@code long} values.
555ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
556ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
557ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code long} values
558ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
559ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero
560ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
561ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
562ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public LongStream longs(long streamSize) {
563ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
564ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
565ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.longStream
566ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomLongsSpliterator
567ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, Long.MAX_VALUE, 0L),
568ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
569ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
570ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
571ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
572ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code long}
573ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * values.
574ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
575ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
576ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * longs(Long.MAX_VALUE)}.
577ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
578ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code long} values
579ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
580ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
581ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public LongStream longs() {
582ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.longStream
583ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomLongsSpliterator
584ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, Long.MAX_VALUE, 0L),
585ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
586ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
587ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
588ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
589ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number of
590ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pseudorandom {@code long}, each conforming to the given origin
591ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (inclusive) and bound (exclusive).
592ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
593ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
594ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
595ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
596ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code long} values,
597ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
598ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
599ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero, or {@code randomNumberOrigin}
600ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
601ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
602ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
603ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public LongStream longs(long streamSize, long randomNumberOrigin,
604ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                            long randomNumberBound) {
605ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
606ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
607ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (randomNumberOrigin >= randomNumberBound)
608ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
609ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.longStream
610ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomLongsSpliterator
611ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, randomNumberOrigin, randomNumberBound),
612ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
613ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
614ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
615ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
616ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code
617ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * long} values, each conforming to the given origin (inclusive) and bound
618ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (exclusive).
619ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
620ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
621ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * longs(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)}.
622ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
623ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
624ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
625ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code long} values,
626ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
627ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code randomNumberOrigin}
628ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
629ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
630ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
631ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public LongStream longs(long randomNumberOrigin, long randomNumberBound) {
632ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (randomNumberOrigin >= randomNumberBound)
633ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
634ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.longStream
635ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomLongsSpliterator
636ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound),
637ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
638ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
639ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
640ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
641ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number of
642ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pseudorandom {@code double} values, each between zero
643ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (inclusive) and one (exclusive).
644ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
645ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
646ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of {@code double} values
647ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
648ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero
649ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
650ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
651ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public DoubleStream doubles(long streamSize) {
652ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
653ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
654ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.doubleStream
655ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomDoublesSpliterator
656ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, Double.MAX_VALUE, 0.0),
657ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
658ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
659e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
660ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
661ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code
662ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * double} values, each between zero (inclusive) and one
663ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (exclusive).
664ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
665ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
666ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * doubles(Long.MAX_VALUE)}.
667ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
668ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code double} values
669ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
670ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
671ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public DoubleStream doubles() {
672ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.doubleStream
673ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomDoublesSpliterator
674ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, Double.MAX_VALUE, 0.0),
675ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
676ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
677ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
678ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
679ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns a stream producing the given {@code streamSize} number of
680ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * pseudorandom {@code double} values, each conforming to the given origin
681ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (inclusive) and bound (exclusive).
682ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
683ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param streamSize the number of values to generate
684ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
685ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
686ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code double} values,
687ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
688ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code streamSize} is
689ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         less than zero
690ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code randomNumberOrigin}
691ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
692ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
693ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
694ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public DoubleStream doubles(long streamSize, double randomNumberOrigin,
695ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin                                double randomNumberBound) {
696ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (streamSize < 0L)
697ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_SIZE);
698ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (!(randomNumberOrigin < randomNumberBound))
699ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
700ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.doubleStream
701ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomDoublesSpliterator
702ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, streamSize, randomNumberOrigin, randomNumberBound),
703ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
704ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
705ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin
706ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    /**
707ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * Returns an effectively unlimited stream of pseudorandom {@code
708ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * double} values, each conforming to the given origin (inclusive) and bound
709ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * (exclusive).
710ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
711ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @implNote This method is implemented to be equivalent to {@code
712ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * doubles(Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)}.
713ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *
714ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberOrigin the origin (inclusive) of each random value
715ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @param randomNumberBound the bound (exclusive) of each random value
716ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @return a stream of pseudorandom {@code double} values,
717ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         each with the given origin (inclusive) and bound (exclusive)
718ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @throws IllegalArgumentException if {@code randomNumberOrigin}
719ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     *         is greater than or equal to {@code randomNumberBound}
720ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     * @since 1.8
721ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin     */
722ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound) {
723ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        if (!(randomNumberOrigin < randomNumberBound))
724ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            throw new IllegalArgumentException(BAD_RANGE);
725ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin        return StreamSupport.doubleStream
726ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin            (new RandomDoublesSpliterator
727ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             (0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound),
728ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin             false);
729ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin    }
730e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
731e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
732e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Spliterator for int streams.  We multiplex the four int
733e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * versions into one class by treating a bound less than origin as
734e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * unbounded, and also by treating "infinite" as equivalent to
735e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Long.MAX_VALUE. For splits, it uses the standard divide-by-two
736e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * approach. The long and double versions of this class are
737e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * identical except for types.
738e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
739e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final class RandomIntsSpliterator
740e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            implements Spliterator.OfInt {
741e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long index;
742e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final long fence;
743e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final int origin;
744e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final int bound;
745e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        RandomIntsSpliterator(long index, long fence,
746e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                              int origin, int bound) {
747e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.index = index; this.fence = fence;
748e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.origin = origin; this.bound = bound;
749e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
750e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
751e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public RandomIntsSpliterator trySplit() {
752e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, m = (i + fence) >>> 1;
753e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (m <= i) ? null :
754e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                new RandomIntsSpliterator(i, index = m, origin, bound);
755e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
756e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
757e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public long estimateSize() {
758e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return fence - index;
759e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
760e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
761e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public int characteristics() {
762e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (Spliterator.SIZED | Spliterator.SUBSIZED |
763e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    Spliterator.NONNULL | Spliterator.IMMUTABLE);
764e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
765e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
766e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public boolean tryAdvance(IntConsumer consumer) {
767e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
768e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
769e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
770e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                consumer.accept(ThreadLocalRandom.current().internalNextInt(origin, bound));
771e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = i + 1;
772e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                return true;
773e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
774e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return false;
775e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
776e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
777e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public void forEachRemaining(IntConsumer consumer) {
778e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
779e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
780e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
781e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = f;
782e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                int o = origin, b = bound;
783e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ThreadLocalRandom rng = ThreadLocalRandom.current();
784e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                do {
785e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    consumer.accept(rng.internalNextInt(o, b));
786e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                } while (++i < f);
787e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
788e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
789e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
790e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
791e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
792e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Spliterator for long streams.
793e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
794e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final class RandomLongsSpliterator
795e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            implements Spliterator.OfLong {
796e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long index;
797e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final long fence;
798e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final long origin;
799e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final long bound;
800e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        RandomLongsSpliterator(long index, long fence,
801e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                               long origin, long bound) {
802e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.index = index; this.fence = fence;
803e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.origin = origin; this.bound = bound;
804e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
805e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
806e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public RandomLongsSpliterator trySplit() {
807e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, m = (i + fence) >>> 1;
808e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (m <= i) ? null :
809e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                new RandomLongsSpliterator(i, index = m, origin, bound);
810e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
811e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
812e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public long estimateSize() {
813e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return fence - index;
814e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
815e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
816e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public int characteristics() {
817e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (Spliterator.SIZED | Spliterator.SUBSIZED |
818e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    Spliterator.NONNULL | Spliterator.IMMUTABLE);
819e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
820e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
821e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public boolean tryAdvance(LongConsumer consumer) {
822e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
823e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
824e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
825e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                consumer.accept(ThreadLocalRandom.current().internalNextLong(origin, bound));
826e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = i + 1;
827e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                return true;
828e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
829e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return false;
830e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
831e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
832e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public void forEachRemaining(LongConsumer consumer) {
833e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
834e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
835e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
836e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = f;
837e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                long o = origin, b = bound;
838e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ThreadLocalRandom rng = ThreadLocalRandom.current();
839e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                do {
840e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    consumer.accept(rng.internalNextLong(o, b));
841e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                } while (++i < f);
842e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
843e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
844e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
845e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
846e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
847e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
848e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Spliterator for double streams.
849e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
850e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final class RandomDoublesSpliterator
851e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            implements Spliterator.OfDouble {
852e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        long index;
853e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final long fence;
854e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final double origin;
855e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final double bound;
856e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        RandomDoublesSpliterator(long index, long fence,
857e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                                 double origin, double bound) {
858e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.index = index; this.fence = fence;
859e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            this.origin = origin; this.bound = bound;
860e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
861e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
862e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public RandomDoublesSpliterator trySplit() {
863e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, m = (i + fence) >>> 1;
864e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (m <= i) ? null :
865e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                new RandomDoublesSpliterator(i, index = m, origin, bound);
866e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
867e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
868e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public long estimateSize() {
869e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return fence - index;
870e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
871e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
872e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public int characteristics() {
873e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return (Spliterator.SIZED | Spliterator.SUBSIZED |
874e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    Spliterator.NONNULL | Spliterator.IMMUTABLE);
875e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
876e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
877e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public boolean tryAdvance(DoubleConsumer consumer) {
878e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
879e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
880e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
881e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                consumer.accept(ThreadLocalRandom.current().internalNextDouble(origin, bound));
882e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = i + 1;
883e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                return true;
884e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
885e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            return false;
886e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
887e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
888e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        public void forEachRemaining(DoubleConsumer consumer) {
889e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (consumer == null) throw new NullPointerException();
890e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long i = index, f = fence;
891e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            if (i < f) {
892e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                index = f;
893e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                double o = origin, b = bound;
894e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                ThreadLocalRandom rng = ThreadLocalRandom.current();
895e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                do {
896e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    consumer.accept(rng.internalNextDouble(o, b));
897e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                } while (++i < f);
898e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            }
899e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
900e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
901e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
902e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
903e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // Within-package utilities
904e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
905e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /*
906e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Descriptions of the usages of the methods below can be found in
907e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * the classes that use them. Briefly, a thread's "probe" value is
908e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * a non-zero hash code that (probably) does not collide with
909e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * other existing threads with respect to any power of two
910e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * collision space. When it does collide, it is pseudo-randomly
911e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * adjusted (using a Marsaglia XorShift). The nextSecondarySeed
912e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * method is used in the same contexts as ThreadLocalRandom, but
913e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * only for transient usages such as random adaptive spin/block
914e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * sequences for which a cheap RNG suffices and for which it could
915e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * in principle disrupt user-visible statistical properties of the
916e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * main ThreadLocalRandom if we were to use it.
917e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *
918e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Note: Because of package-protection issues, versions of some
919e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * these methods also appear in some subpackage classes.
920e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
921e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
922e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
923e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns the probe value for the current thread without forcing
924e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * initialization. Note that invoking ThreadLocalRandom.current()
925e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * can be used to force initialization on zero return.
926e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
927e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final int getProbe() {
928e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return U.getInt(Thread.currentThread(), PROBE);
929e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
930e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
931e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
932e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Pseudo-randomly advances and records the given probe value for the
933e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * given thread.
934e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
935e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final int advanceProbe(int probe) {
936e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        probe ^= probe << 13;   // xorshift
937e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        probe ^= probe >>> 17;
938e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        probe ^= probe << 5;
939e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        U.putInt(Thread.currentThread(), PROBE, probe);
940e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return probe;
941e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
942e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
943e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
944e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns the pseudo-randomly initialized or updated secondary seed.
945e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
946e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final int nextSecondarySeed() {
947e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        int r;
948e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Thread t = Thread.currentThread();
949e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if ((r = U.getInt(t, SECONDARY)) != 0) {
950e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r ^= r << 13;   // xorshift
951e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r ^= r >>> 17;
952e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r ^= r << 5;
953e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
954e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        else if ((r = mix32(seeder.getAndAdd(SEEDER_INCREMENT))) == 0)
955e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            r = 1; // avoid zero
956e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        U.putInt(t, SECONDARY, r);
957e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return r;
958e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
959e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
960e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // Serialization support
961e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
962a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final long serialVersionUID = -5851777807851030925L;
963e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
964e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
965e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @serialField rnd long
966e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *              seed for random computations
967e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @serialField initialized boolean
968e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     *              always true
969e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
970e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final ObjectStreamField[] serialPersistentFields = {
971e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        new ObjectStreamField("rnd", long.class),
972e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        new ObjectStreamField("initialized", boolean.class),
973e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    };
974e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
975e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
976e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Saves the {@code ThreadLocalRandom} to a stream (that is, serializes it).
977e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @param s the stream
978e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @throws java.io.IOException if an I/O error occurs
979e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
980e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private void writeObject(java.io.ObjectOutputStream s)
981e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        throws java.io.IOException {
982e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
983e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        java.io.ObjectOutputStream.PutField fields = s.putFields();
984e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        fields.put("rnd", U.getLong(Thread.currentThread(), SEED));
985e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        fields.put("initialized", true);
986e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        s.writeFields();
987e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
988e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
989e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
990e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * Returns the {@link #current() current} thread's {@code ThreadLocalRandom}.
991e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * @return the {@link #current() current} thread's {@code ThreadLocalRandom}
992e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
993e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private Object readResolve() {
994e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        return current();
995e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
996e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
997e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // Static initialization
998e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
999e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
1000e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The seed increment.
1001e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
1002e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final long GAMMA = 0x9e3779b97f4a7c15L;
1003e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1004e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
1005e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The increment for generating probe values.
1006e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
1007e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final int PROBE_INCREMENT = 0x9e3779b9;
1008e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1009e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
1010e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The increment of seeder per new instance.
1011e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
1012e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL;
1013e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1014e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // Constants from SplittableRandom
1015e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final double DOUBLE_UNIT = 0x1.0p-53;  // 1.0  / (1L << 53)
1016e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final float  FLOAT_UNIT  = 0x1.0p-24f; // 1.0f / (1 << 24)
1017e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1018e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // IllegalArgumentException messages
1019e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final String BAD_BOUND = "bound must be positive";
1020e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final String BAD_RANGE = "bound must be greater than origin";
1021e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final String BAD_SIZE  = "size must be non-negative";
1022e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1023e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // Unsafe mechanics
1024e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe();
1025e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final long SEED;
1026e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final long PROBE;
1027e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final long SECONDARY;
1028e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static {
1029e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try {
1030e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            SEED = U.objectFieldOffset
1031e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                (Thread.class.getDeclaredField("threadLocalRandomSeed"));
1032e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            PROBE = U.objectFieldOffset
1033e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                (Thread.class.getDeclaredField("threadLocalRandomProbe"));
1034e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            SECONDARY = U.objectFieldOffset
1035e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                (Thread.class.getDeclaredField("threadLocalRandomSecondarySeed"));
1036e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        } catch (ReflectiveOperationException e) {
1037e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            throw new Error(e);
1038e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
1039e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
1040e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1041e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /** Rarely-used holder for the second of a pair of Gaussians */
1042e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final ThreadLocal<Double> nextLocalGaussian =
1043e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        new ThreadLocal<>();
1044e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1045e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /** Generates per-thread initialization/probe field */
1046e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final AtomicInteger probeGenerator = new AtomicInteger();
1047e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1048e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /** The common ThreadLocalRandom */
1049e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static final ThreadLocalRandom instance = new ThreadLocalRandom();
1050e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1051e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    /**
1052e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     * The next seed for default constructors.
1053e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak     */
1054e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    private static final AtomicLong seeder
1055e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        = new AtomicLong(mix64(System.currentTimeMillis()) ^
1056e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                         mix64(System.nanoTime()));
1057e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
1058e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // at end of <clinit> to survive static initialization circularity
1059e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    static {
1060e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        if (java.security.AccessController.doPrivileged(
1061e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            new java.security.PrivilegedAction<Boolean>() {
1062e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public Boolean run() {
1063e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    return Boolean.getBoolean("java.util.secureRandomSeed");
1064e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }})) {
1065e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            byte[] seedBytes = java.security.SecureRandom.getSeed(8);
1066e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            long s = (long)seedBytes[0] & 0xffL;
1067e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            for (int i = 1; i < 8; ++i)
1068e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                s = (s << 8) | ((long)seedBytes[i] & 0xffL);
1069e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            seeder.set(s);
1070e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
1071e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    }
1072a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson}
1073