Class L128X1024Mix
- All Implemented Interfaces:
RandomLongSource, JumpableUniformRandomProvider, LongJumpableUniformRandomProvider, RestorableUniformRandomProvider, SplittableUniformRandomProvider, UniformRandomProvider
This is a member of the LXM family of generators: L=Linear congruential generator;
X=Xor based generator; and M=Mix. This member uses a 128-bit LCG and 1024-bit Xor-based
generator. It is named as "L128X1024MixRandom" in the java.util.random
package introduced in JDK 17; the LXM family is described in further detail in:
Steele and Vigna (2021) LXM: better splittable pseudorandom number generators (and almost as fast). Proceedings of the ACM on Programming Languages, Volume 5, Article 148, pp 1–31.
Memory footprint is 1312 bits and the period is 2128 (21024 - 1).
This generator implements
LongJumpableUniformRandomProvider.
In addition instances created with a different additive parameter for the LCG are robust
against accidental correlation in a multi-threaded setting. The additive parameters must be
different in the most significant 127-bits.
This generator implements
SplittableUniformRandomProvider.
The stream of generators created using the splits methods support parallelisation
and are robust against accidental correlation by using unique values for the additive parameter
for each instance in the same stream. The primitive streaming methods support parallelisation
but with no assurances of accidental correlation; each thread uses a new instance with a
randomly initialised state.
- Since:
- 1.5
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate intIndex in "state" array.private static final intSize of the LCG state vector.private static final longLow half of 128-bit LCG multiplier.private static final intSize of the seed vector.private final long[]State of the XBG.private static final intSize of the XBG state vector.Fields inherited from class AbstractL128
lah, lal, lsh, lsl -
Constructor Summary
ConstructorsModifierConstructorDescriptionL128X1024Mix(long[] seed) Creates a new instance.protectedL128X1024Mix(L128X1024Mix source) Creates a copy instance. -
Method Summary
Modifier and TypeMethodDescription(package private) AbstractL128copy()Create a copy.private static SplittableUniformRandomProvidercreate(long seed, UniformRandomProvider source) Create a new instance using the givenseedandsourceof randomness to initialise the instance.protected byte[]Creates a snapshot of the RNG state.jump()Creates a copy of the UniformRandomProvider and then retreats the state of the current instance.longJump()Creates a copy of the UniformRandomProvider and then retreats the state of the current instance.longnext()Return the next random value.protected voidsetStateInternal(byte[] s) Resets the RNG to the givenstate.split(UniformRandomProvider source) Creates a new random generator, split off from this one, that implements theSplittableUniformRandomProviderinterface.splits(long streamSize, SplittableUniformRandomProvider source) Returns a stream producing the givenstreamSizenumber of new random generators, each of which implements theSplittableUniformRandomProviderinterface.Methods inherited from class LongProvider
nextBoolean, nextInt, nextLong, resetCachedStateMethods inherited from class BaseProvider
checkIndex, checkStateSize, composeStateInternal, extendSeed, extendSeed, fillState, fillState, restoreState, saveState, splitStateInternal, toStringMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface JumpableUniformRandomProvider
jumps, jumpsMethods inherited from interface LongJumpableUniformRandomProvider
longJumps, longJumpsMethods inherited from interface SplittableUniformRandomProvider
doubles, doubles, doubles, doubles, ints, ints, ints, ints, longs, longs, longs, longs, split, splits, splits, splitsMethods inherited from interface UniformRandomProvider
nextBoolean, nextBytes, nextBytes, nextDouble, nextDouble, nextDouble, nextFloat, nextFloat, nextFloat, nextInt, nextInt, nextInt, nextLong, nextLong, nextLong
-
Field Details
-
SEED_SIZE
private static final int SEED_SIZESize of the seed vector.- See Also:
-
XBG_STATE_SIZE
private static final int XBG_STATE_SIZESize of the XBG state vector.- See Also:
-
LCG_STATE_SIZE
private static final int LCG_STATE_SIZESize of the LCG state vector.- See Also:
-
ML
private static final long MLLow half of 128-bit LCG multiplier.- See Also:
-
x
private final long[] xState of the XBG. -
index
private int indexIndex in "state" array.
-
-
Constructor Details
-
L128X1024Mix
public L128X1024Mix(long[] seed) Creates a new instance.- Parameters:
seed- Initial seed. If the length is larger than 20, only the first 20 elements will be used; if smaller, the remaining elements will be automatically set. A seed containing all zeros in the last 16 elements will create a non-functional XBG sub-generator and a low quality output with a period of 2128.The 1st and 2nd elements are used to set the LCG increment; the least significant bit is set to odd to ensure a full period LCG. The 3rd and 4th elements are used to set the LCG state.
-
L128X1024Mix
Creates a copy instance.- Parameters:
source- Source to copy.
-
-
Method Details
-
getStateInternal
protected byte[] getStateInternal()Creates a snapshot of the RNG state.- Overrides:
getStateInternalin classAbstractL128- Returns:
- the internal state.
-
setStateInternal
protected void setStateInternal(byte[] s) Resets the RNG to the givenstate.- Overrides:
setStateInternalin classAbstractL128- Parameters:
s- State (previously obtained by a call toBaseProvider.getStateInternal()).- See Also:
-
next
public long next()Return the next random value.- Specified by:
nextin interfaceRandomLongSource- Returns:
- the next random value.
-
jump
Creates a copy of the UniformRandomProvider and then retreats the state of the current instance. The copy is returned.The jump is performed by advancing the state of the LCG sub-generator by 1 cycle. The XBG state is unchanged.
The jump size is the equivalent of moving the state backwards by (21024 - 1) positions. It can provide up to 2128 non-overlapping subsequences.
- Specified by:
jumpin interfaceJumpableUniformRandomProvider- Overrides:
jumpin classAbstractL128- Returns:
- A copy of the current state.
-
longJump
Creates a copy of the UniformRandomProvider and then retreats the state of the current instance. The copy is returned.The jump is performed by advancing the state of the LCG sub-generator by 264 cycles. The XBG state is unchanged.
The jump size is the equivalent of moving the state backwards by 264 (21024 - 1) positions. It can provide up to 264 non-overlapping subsequences of length 264 (21024 - 1); each subsequence can provide up to 264 non-overlapping subsequences of length (21024 - 1) using the
jump()method.- Specified by:
longJumpin interfaceLongJumpableUniformRandomProvider- Overrides:
longJumpin classAbstractL128- Returns:
- A copy of the current state.
-
copy
-
split
Creates a new random generator, split off from this one, that implements theSplittableUniformRandomProviderinterface.- Specified by:
splitin interfaceSplittableUniformRandomProvider- Parameters:
source- A source of randomness used to initialise the new instance.- Returns:
- A new instance.
-
splits
public Stream<SplittableUniformRandomProvider> splits(long streamSize, SplittableUniformRandomProvider source) Returns a stream producing the givenstreamSizenumber of new random generators, each of which implements theSplittableUniformRandomProviderinterface.- Specified by:
splitsin interfaceSplittableUniformRandomProvider- Parameters:
streamSize- Number of objects to generate.source- A source of randomness used to initialise the new instances; this may be split to provide a source of randomness across a parallel stream.- Returns:
- a stream of random generators; the stream is limited to the given
streamSize.
-
create
Create a new instance using the givenseedandsourceof randomness to initialise the instance.- Parameters:
seed- Seed used to initialise the instance.source- Source of randomness used to initialise the instance.- Returns:
- A new instance.
-