public class XorShift1024StarRandom extends Random
More details can be found in my paper “An experimental exploration of
Marsaglia's xorshift generators, scrambled”, ACM Trans. Math. Softw., 2016, and
on the xoroshiro+/xorshift*/xorshift+
generators and the PRNG shootout page.
Note that this is not a cryptographic-strength pseudorandom number generator. Its period is 21024 − 1, which is more than enough for any massive parallel application (it is actually possible to define analogously a generator with period 24096 − 1, but its interest is eminently academic).
By using the supplied jump() method it is possible to generate non-overlapping long sequences
for parallel computations. This class provides also a split() method to support recursive parallel computations, in the spirit of
Java 8's SplittableRandom.
| Constructor and Description |
|---|
XorShift1024StarRandom()
Creates a new generator seeded using
Util.randomSeed(). |
XorShift1024StarRandom(long seed)
Creates a new generator using a given seed.
|
| Modifier and Type | Method and Description |
|---|---|
void |
jump()
The the jump function for this generator.
|
protected int |
next(int bits) |
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,
int p)
Sets the state of this generator.
|
XorShift1024StarRandom |
split()
Returns a new instance that shares no mutable state
with this instance.
|
public XorShift1024StarRandom()
Util.randomSeed().public XorShift1024StarRandom(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 jump()
nextLong(); it can be used to generate 2512
non-overlapping subsequences for parallel computations.public XorShift1024StarRandom split()
public void setSeed(long seed)
The argument will be used to seed a SplitMix64RandomGenerator, whose output
will in turn be used to seed this generator. This approach makes “warmup” unnecessary,
and makes the probability of starting from a state
with a large fraction of bits set to zero astronomically small.
public void setState(long[] state,
int p)
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.p - the internal index.