src/java.base/share/classes/java/util/random/L64X1024Random.java
branchJDK-8193209-branch
changeset 57436 b0c958c0e6c6
parent 57388 b1e6bc96af3d
child 57437 f02ffcb61dce
equal deleted inserted replaced
57435:9a4184201823 57436:b0c958c0e6c6
       
     1 /*
       
     2  * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 package java.util;
       
    26 
       
    27 import java.math.BigInteger;
       
    28 import java.util.concurrent.atomic.AtomicLong;
       
    29 
       
    30 /**
       
    31  * A generator of uniform pseudorandom values applicable for use in
       
    32  * (among other contexts) isolated parallel computations that may
       
    33  * generate subtasks.  Class {@code L64X1024Random} implements
       
    34  * interfaces {@link java.util.Rng} and {@link java.util.SplittableRng},
       
    35  * and therefore supports methods for producing pseudorandomly chosen
       
    36  * numbers of type {@code int}, {@code long}, {@code float}, and {@code double}
       
    37  * as well as creating new split-off {@code L64X1024Random} objects,
       
    38  * with similar usages as for class {@link java.util.SplittableRandom}.
       
    39  *
       
    40  * <p>Series of generated values pass the TestU01 BigCrush and PractRand test suites
       
    41  * that measure independence and uniformity properties of random number generators.
       
    42  * (Most recently validated with
       
    43  * <a href="http://simul.iro.umontreal.ca/testu01/tu01.html">version 1.2.3 of TestU01</a>
       
    44  * and <a href="http://pracrand.sourceforge.net">version 0.90 of PractRand</a>.
       
    45  * Note that TestU01 BigCrush was used to test not only values produced by the {@code nextLong()}
       
    46  * method but also the result of bit-reversing each value produced by {@code nextLong()}.)
       
    47  * These tests validate only the methods for certain
       
    48  * types and ranges, but similar properties are expected to hold, at
       
    49  * least approximately, for others as well.
       
    50  *
       
    51  * <p>{@code L64X1024Random} is a specific member of the LXM family of algorithms
       
    52  * for pseudorandom number generators.  Every LXM generator consists of two
       
    53  * subgenerators; one is an LCG (Linear Congruential Generator) and the other is
       
    54  * an Xorshift generator.  Each output of an LXM generator is the sum of one
       
    55  * output from each subgenerator, possibly processed by a final mixing function
       
    56  * (but {@code L64X1024Random} does not use a mixing function).
       
    57  *
       
    58  * <p>The LCG subgenerator for {@code L64X1024Random} has an update step of the
       
    59  * form {@code s = m * s + a}, where {@code s}, {@code m}, and {@code a} are all
       
    60  * of type {@code long}; {@code s} is the mutable state, the multiplier {@code m}
       
    61  * is fixed (the same for all instances of {@code L64X1024Random}}) and the addend
       
    62  * {@code a} is a parameter (a final field of the instance).  The parameter
       
    63  * {@code a} is required to be odd (this allows the LCG to have the maximal
       
    64  * period, namely 2<sup>64</sup>); therefore there are 2<sup>63</sup> distinct choices
       
    65  * of parameter.
       
    66  *
       
    67  * <p>The Xorshift subgenerator for {@code L64X1024Random} is the {@code xoroshiro1024}
       
    68  * algorithm (parameters 25, 27, and 36), without any final scrambler such as "+" or "**".
       
    69  * Its state consists of an array {@code x} of sixteen {@code long} values,
       
    70  * which can take on any values provided that they are not all zero.
       
    71  * The period of this subgenerator is 2<sup>1024</sup>-1.
       
    72  *
       
    73  * <p> Because the periods 2<sup>64</sup> and 2<sup>1024</sup>-1 of the two subgenerators
       
    74  * are relatively prime, the <em>period</em> of any single {@code L64X1024Random} object 
       
    75  * (the length of the series of generated 64-bit values before it repeats) is the product
       
    76  * of the periods of the subgenerators, that is, 2<sup>64</sup>(2<sup>1024</sup>-1),
       
    77  * which is just slightly smaller than 2<sup>1088</sup>.  Moreover, if two distinct
       
    78  * {@code L64X1024Random} objects have different {@code a} parameters, then their
       
    79  * cycles of produced values will be different.
       
    80  *
       
    81  * <p>The 64-bit values produced by the {@code nextLong()} method are exactly equidistributed.
       
    82  * For any specific instance of {@code L64X1024Random}, over the course of its cycle each
       
    83  * of the 2<sup>64</sup> possible {@code long} values will be produced 2<sup>1024</sup>-1 times.
       
    84  * The values produced by the {@code nextInt()}, {@code nextFloat()}, and {@code nextDouble()}
       
    85  * methods are likewise exactly equidistributed.
       
    86  *
       
    87  * <p>In fact, the 64-bit values produced by the {@code nextLong()} method are 16-equidistributed.
       
    88  * To be precise: for any specific instance of {@code L64X1024Random}, consider
       
    89  * the (overlapping) length-16 subsequences of the cycle of 64-bit values produced by
       
    90  * {@code nextLong()} (assuming no other methods are called that would affect the state).
       
    91  * There are 2<sup>64</sup>(2<sup>1024</sup>-1) such subsequences, and each subsequence,
       
    92  * which consists of 16 64-bit values, can have one of 2<sup>1024</sup> values. Of those
       
    93  * 2<sup>1024</sup> subsequence values, nearly all of them (2<sup>1024</sup>-2<sup>64</sup>)
       
    94  * occur 2<sup>64</sup> times over the course of the entire cycle, and the other
       
    95  * 2<sup>64</sup> subsequence values occur only 2<sup>64</sup>-1 times.  So the ratio
       
    96  * of the probability of getting one of the less common subsequence values and the
       
    97  * probability of getting one of the more common subsequence values is 1-2<sup>-64</sup>.
       
    98  * (Note that the set of 2<sup>64</sup> less-common subsequence values will differ from
       
    99  * one instance of {@code L64X1024Random} to another, as a function of the additive
       
   100  * parameter of the LCG.)  The values produced by the {@code nextInt()}, {@code nextFloat()},
       
   101  * and {@code nextDouble()} methods are likewise 16-equidistributed.
       
   102  *
       
   103  * <p>Method {@link #split} constructs and returns a new {@code L64X1024Random}
       
   104  * instance that shares no mutable state with the current instance. However, with
       
   105  * very high probability, the values collectively generated by the two objects
       
   106  * have the same statistical properties as if the same quantity of values were
       
   107  * generated by a single thread using a single {@code L64X1024Random} object.
       
   108  * This is because, with high probability, distinct {@code L64X1024Random} objects
       
   109  * have distinct {@code a} parameters and therefore use distinct members of the
       
   110  * algorithmic family; and even if their {@code a} parameters are the same, with
       
   111  * very high probability they will traverse different parts of their common state
       
   112  * cycle.
       
   113  *
       
   114  * <p>As with {@link java.util.SplittableRandom}, instances of
       
   115  * {@code L64X1024Random} are <em>not</em> thread-safe.
       
   116  * They are designed to be split, not shared, across threads. For
       
   117  * example, a {@link java.util.concurrent.ForkJoinTask} fork/join-style
       
   118  * computation using random numbers might include a construction
       
   119  * of the form {@code new Subtask(someL64X1024Random.split()).fork()}.
       
   120  *
       
   121  * <p>This class provides additional methods for generating random
       
   122  * streams, that employ the above techniques when used in
       
   123  * {@code stream.parallel()} mode.
       
   124  *
       
   125  * <p>Instances of {@code L64X1024Random} are not cryptographically
       
   126  * secure.  Consider instead using {@link java.security.SecureRandom}
       
   127  * in security-sensitive applications. Additionally,
       
   128  * default-constructed instances do not use a cryptographically random
       
   129  * seed unless the {@linkplain System#getProperty system property}
       
   130  * {@code java.util.secureRandomSeed} is set to {@code true}.
       
   131  *
       
   132  * @author  Guy Steele
       
   133  * @since   1.9
       
   134  */
       
   135 public final class L64X1024Random extends AbstractSplittableRng {
       
   136 
       
   137     /*
       
   138      * Implementation Overview.
       
   139      *
       
   140      * The split() operation uses the current generator to choose 18 new 64-bit
       
   141      * long values that are then used to initialize the parameter `a`, the
       
   142      * state variable `s`, and the array `x` for a newly constructed generator.
       
   143      *
       
   144      * With extremely high probability, no two generators so chosen
       
   145      * will have the same `a` parameter, and testing has indicated
       
   146      * that the values generated by two instances of {@code L64X1024Random}
       
   147      * will be (approximately) independent if have different values for `a`.
       
   148      *
       
   149      * The default (no-argument) constructor, in essence, uses
       
   150      * "defaultGen" to generate 18 new 64-bit values for the same
       
   151      * purpose.  Multiple generators created in this way will certainly
       
   152      * differ in their `a` parameters.  The defaultGen state must be accessed
       
   153      * in a thread-safe manner, so we use an AtomicLong to represent
       
   154      * this state.  To bootstrap the defaultGen, we start off using a
       
   155      * seed based on current time unless the
       
   156      * java.util.secureRandomSeed property is set. This serves as a
       
   157      * slimmed-down (and insecure) variant of SecureRandom that also
       
   158      * avoids stalls that may occur when using /dev/random.
       
   159      *
       
   160      * File organization: First static fields, then instance
       
   161      * fields, then constructors, then instance methods.
       
   162      */
       
   163 
       
   164     /* ---------------- static fields ---------------- */
       
   165 
       
   166     /*
       
   167      * The length of the array x.
       
   168      */
       
   169 
       
   170     private static final int N = 16;
       
   171 
       
   172     /**
       
   173      * The seed generator for default constructors.
       
   174      */
       
   175     private static final AtomicLong defaultGen = new AtomicLong(RngSupport.initialSeed());
       
   176 
       
   177     /*
       
   178      * The period of this generator, which is (2**1024 - 1) * 2**64.
       
   179      */
       
   180     private static final BigInteger thePeriod =
       
   181 	BigInteger.ONE.shiftLeft(N*64).subtract(BigInteger.ONE).shiftLeft(64);
       
   182 
       
   183     /*
       
   184      * Multiplier used in the LCG portion of the algorithm, taken from
       
   185      * Pierre L'Ecuyer, Tables of linear congruential generators of
       
   186      * different sizes and good lattice structure, <em>Mathematics of
       
   187      * Computation</em> 68, 225 (January 1999), pages 249-260,
       
   188      * Table 4 (first multiplier for size 2<sup>64</sup>).
       
   189      */
       
   190 
       
   191     private static final long m = 2862933555777941757L;
       
   192     
       
   193     /* ---------------- instance fields ---------------- */
       
   194 
       
   195     /**
       
   196      * The parameter that is used as an additive constant for the LCG.
       
   197      * Must be odd.
       
   198      */
       
   199     private final long a;
       
   200 
       
   201     /**
       
   202      * The per-instance state: s for the LCG; the array x for the xorshift;
       
   203      * p is the rotating pointer into the array x.
       
   204      * At least one of the 16 elements of the array x must be nonzero.
       
   205      */
       
   206     private long s;
       
   207     private final long[] x;
       
   208     private int p = N - 1;
       
   209 
       
   210     /* ---------------- constructors ---------------- */
       
   211 
       
   212     /**
       
   213      * Basic constructor that initializes all fields from parameters.
       
   214      * It then adjusts the field values if necessary to ensure that
       
   215      * all constraints on the values of fields are met.
       
   216      *
       
   217      * @param a additive parameter for the LCG
       
   218      * @param s initial state for the LCG
       
   219      * @param x0 first word of the initial state for the xorshift generator
       
   220      * @param x1 second word of the initial state for the xorshift generator
       
   221      * @param x2 third word of the initial state for the xorshift generator
       
   222      * @param x3 fourth word of the initial state for the xorshift generator
       
   223      * @param x4 fifth word of the initial state for the xorshift generator
       
   224      * @param x5 sixth word of the initial state for the xorshift generator
       
   225      * @param x6 seventh word of the initial state for the xorshift generator
       
   226      * @param x7 eight word of the initial state for the xorshift generator
       
   227      * @param x8 ninth word of the initial state for the xorshift generator
       
   228      * @param x9 tenth word of the initial state for the xorshift generator
       
   229      * @param x10 eleventh word of the initial state for the xorshift generator
       
   230      * @param x11 twelfth word of the initial state for the xorshift generator
       
   231      * @param x12 thirteenth word of the initial state for the xorshift generator
       
   232      * @param x13 fourteenth word of the initial state for the xorshift generator
       
   233      * @param x14 fifteenth word of the initial state for the xorshift generator
       
   234      * @param x15 sixteenth word of the initial state for the xorshift generator
       
   235      */
       
   236     public L64X1024Random(long a, long s,
       
   237 			  long x0, long x1, long x2, long x3,
       
   238 			  long x4, long x5, long x6, long x7,
       
   239 			  long x8, long x9, long x10, long x11,
       
   240 			  long x12, long x13, long x14, long x15) {
       
   241 	// Force a to be odd.
       
   242         this.a = a | 1;
       
   243         this.s = s;
       
   244 	this.x = new long[N];
       
   245 	this.x[0] = x0;
       
   246 	this.x[1] = x1;
       
   247         this.x[2] = x2;
       
   248         this.x[3] = x3;
       
   249         this.x[4] = x4;
       
   250         this.x[5] = x5;
       
   251         this.x[6] = x6;
       
   252         this.x[7] = x7;
       
   253         this.x[8] = x8;
       
   254         this.x[9] = x9;
       
   255         this.x[10] = x10;
       
   256         this.x[11] = x11;
       
   257         this.x[12] = x12;
       
   258         this.x[13] = x13;
       
   259         this.x[14] = x14;
       
   260         this.x[15] = x15;
       
   261 	// If x0, x1, ..., x15 are all zero (very unlikely), we must choose nonzero values.
       
   262         if ((x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15) == 0) {
       
   263 	    for (int j = 0; j < N; j++) {
       
   264 		this.x[j] = RngSupport.mixStafford13(s += RngSupport.GOLDEN_RATIO_64);
       
   265 	    }
       
   266 	}
       
   267     }
       
   268 
       
   269     /**
       
   270      * Creates a new instance of {@code L64X1024Random} using the
       
   271      * specified {@code long} value as the initial seed. Instances of
       
   272      * {@code L64X1024Random} created with the same seed in the same
       
   273      * program execution generate identical sequences of values.
       
   274      *
       
   275      * @param seed the initial seed
       
   276      */
       
   277     public L64X1024Random(long seed) {
       
   278 	// Using a value with irregularly spaced 1-bits to xor the seed
       
   279 	// argument tends to improve "pedestrian" seeds such as 0 or
       
   280 	// other small integers.  We may as well use SILVER_RATIO_64.
       
   281 	//
       
   282 	// The seed is hashed by mixMurmur64 to produce the `a` parameter.
       
   283 	// The seed is hashed by mixStafford13 to produce the initial `x[0]`,
       
   284 	// which will then be used to produce the first generated value.
       
   285 	// The other x values are filled in as if by a SplitMix PRNG with
       
   286 	// GOLDEN_RATIO_64 as the gamma value and Stafford13 as the mixer.
       
   287         this(RngSupport.mixMurmur64(seed ^= RngSupport.SILVER_RATIO_64),
       
   288 	     1,
       
   289 	     RngSupport.mixStafford13(seed),
       
   290 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   291 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   292 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   293 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   294 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   295 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   296 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   297 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   298 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   299 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   300 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   301 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   302 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   303 	     RngSupport.mixStafford13(seed += RngSupport.GOLDEN_RATIO_64),
       
   304 	     RngSupport.mixStafford13(seed + RngSupport.GOLDEN_RATIO_64));
       
   305     }
       
   306 
       
   307     /**
       
   308      * Creates a new instance of {@code L64X1024Random} that is likely to
       
   309      * generate sequences of values that are statistically independent
       
   310      * of those of any other instances in the current program execution,
       
   311      * but may, and typically does, vary across program invocations.
       
   312      */
       
   313     public L64X1024Random() {
       
   314 	// Using GOLDEN_RATIO_64 here gives us a good Weyl sequence of values.
       
   315         this(defaultGen.getAndAdd(RngSupport.GOLDEN_RATIO_64));
       
   316     }
       
   317 
       
   318     /**
       
   319      * Creates a new instance of {@code L64X1024Random} using the specified array of
       
   320      * initial seed bytes. Instances of {@code L64X1024Random} created with the same
       
   321      * seed array in the same program execution generate identical sequences of values.
       
   322      *
       
   323      * @param seed the initial seed
       
   324      */
       
   325     public L64X1024Random(byte[] seed) {
       
   326 	// Convert the seed to 18 long values, of which the last 16 are not all zero.
       
   327 	long[] data = RngSupport.convertSeedBytesToLongs(seed, 18, 16);
       
   328 	long a = data[0], s = data[1];
       
   329 	// Force a to be odd.
       
   330         this.a = a | 1;
       
   331         this.s = s;
       
   332 	this.x = new long[N];
       
   333 	for (int j = 0; j < N; j++) {
       
   334 	    this.x[j] = data[2+j];
       
   335 	}
       
   336     }
       
   337 
       
   338     /* ---------------- public methods ---------------- */
       
   339 
       
   340     /**
       
   341      * Constructs and returns a new instance of {@code L64X1024Random}
       
   342      * that shares no mutable state with this instance.
       
   343      * However, with very high probability, the set of values collectively
       
   344      * generated by the two objects has the same statistical properties as if
       
   345      * same the quantity of values were generated by a single thread using
       
   346      * a single {@code L64X1024Random} object.  Either or both of the two
       
   347      * objects may be further split using the {@code split} method,
       
   348      * and the same expected statistical properties apply to the
       
   349      * entire set of generators constructed by such recursive splitting.
       
   350      *
       
   351      * @param source a {@code SplittableRng} instance to be used instead
       
   352      *               of this one as a source of pseudorandom bits used to
       
   353      *               initialize the state of the new ones.
       
   354      * @return a new instance of {@code L64X1024Random}
       
   355      */
       
   356     public L64X1024Random split(SplittableRng source) {
       
   357 	// Literally pick a new instance "at random".
       
   358         return new L64X1024Random(source.nextLong(), source.nextLong(), 
       
   359 				  source.nextLong(), source.nextLong(),
       
   360 				  source.nextLong(), source.nextLong(),
       
   361 				  source.nextLong(), source.nextLong(),
       
   362 				  source.nextLong(), source.nextLong(),
       
   363 				  source.nextLong(), source.nextLong(),
       
   364 				  source.nextLong(), source.nextLong(),
       
   365 				  source.nextLong(), source.nextLong(),
       
   366 				  source.nextLong(), source.nextLong());
       
   367     }
       
   368 
       
   369     /**
       
   370      * Returns a pseudorandom {@code long} value.
       
   371      *
       
   372      * @return a pseudorandom {@code long} value
       
   373      */
       
   374 
       
   375     public long nextLong() {
       
   376 	// First part of xoroshiro1024: fetch array data
       
   377 	final int q = p;
       
   378 	final long s0 = x[p = (p + 1) & (N - 1)];
       
   379 	long s15 = x[q];
       
   380 
       
   381 	final long z = s + s0;
       
   382 	s = m * s + a;  // LCG
       
   383 
       
   384 	// Second part of xoroshiro1024: update array data
       
   385 	s15 ^= s0;
       
   386 	x[q] = Long.rotateLeft(s0, 25) ^ s15 ^ (s15 << 27);
       
   387 	x[p] = Long.rotateLeft(s15, 36);
       
   388 	
       
   389 	return z;
       
   390     }
       
   391 
       
   392     public BigInteger period() { return thePeriod; }
       
   393 }