public class XorShift128PlusRandom extends Random
nextInt(int) method, instead of relying on the
very-slightly-biased-but-fast approximation of XorShift64StarRandom.nextInt(int).
More details about xorshift+ generators can be found in my
paper “Further scramblings
of Marsaglia's xorshift generators”, 2014. The basic
idea is taken from Mutsuo Saito and Makuto Matsumoto's
XSadd generator, which
is however based on 32-bit shifts and fails several statistical tests when reversed.
Note that this is
not a cryptographic-strength pseudorandom number generator, but its quality is
preposterously higher than Random's, and its cycle length is
2128 − 1, which is more than enough for any single-thread application.
On an Intel® Core™ i7-4770 CPU @3.40GHz (Haswell),
all methods of this class except for nextInt() are faster than
those of ThreadLocalRandom (available only from Java 7).
See the table in the documentation of XorShift64StarRandom for more details.
This is a top-quality generator: for instance, it performs much better than WELL1024a
or MT19937 in the TestU01 BigCrush suite.
More details can be found on the xorshift*/xorshift+ generators and the PRNG shootout page.
If you need a longer period, consider using XorShift1024StarRandom or XorShift1024StarRandomGenerator.
| Constructor and Description |
|---|
XorShift128PlusRandom()
Creates a new generator seeded using
Util.randomSeed(). |
XorShift128PlusRandom(long seed)
Creates a new generator using a given seed.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
nextBoolean() |
void |
nextBytes(byte[] bytes) |
double |
nextDouble() |
float |
nextFloat() |
int |
nextInt() |
int |
nextInt(int n) |
long |
nextLong() |
long |
nextLong(long n)
Returns a pseudorandom uniformly distributed
long value
between 0 (inclusive) and the specified value (exclusive), drawn from
this random number generator's sequence. |
void |
setSeed(long seed)
Sets the seed of this generator.
|
void |
setState(long[] state)
Sets the state of this generator.
|
next, nextGaussianpublic XorShift128PlusRandom()
Util.randomSeed().public XorShift128PlusRandom(long seed)
seed - a nonzero seed for the generator (if zero, the generator will be seeded with -1).public long nextLong(long n)
long value
between 0 (inclusive) and the specified value (exclusive), drawn from
this random number generator's sequence. The algorithm used to generate
the value guarantees that the result is uniform, provided that the
sequence of 64-bit values produced by this generator is.n - the positive bound on the random number to be returned.long value between 0 (inclusive) and n (exclusive).public double nextDouble()
nextDouble in class Randompublic boolean nextBoolean()
nextBoolean in class Randompublic void setSeed(long seed)
The seed will be passed twice through HashCommon.murmurHash3(long). In this way, if the
user passes a small value we will avoid the short irregular transient associated
with states with a very small number of bits set.
setSeed in class Randomseed - a nonzero seed for this generator (if zero, the generator will be seeded with Long.MIN_VALUE).public void setState(long[] state)
The internal state of the generator will be reset, and the state array filled with the provided array.
state - an array of 16 longs; at least one must be nonzero.