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