Class L64X128Mix

  • All Implemented Interfaces:
    RandomLongSource, org.apache.commons.rng.JumpableUniformRandomProvider, org.apache.commons.rng.LongJumpableUniformRandomProvider, org.apache.commons.rng.RestorableUniformRandomProvider, org.apache.commons.rng.SplittableUniformRandomProvider, org.apache.commons.rng.UniformRandomProvider

    public class L64X128Mix
    extends LongProvider
    implements org.apache.commons.rng.SplittableUniformRandomProvider
    A 64-bit all purpose generator.

    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 64-bit LCG and 128-bit Xor-based generator. It is named as "L64X128MixRandom" 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 256 bits and the period is 264 (2128 - 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 63-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:
    Steele & Vigna (2021) Proc. ACM Programming Languages 5, 1-31, JDK 17 java.util.random javadoc
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected long la
      Per-instance LCG additive parameter (must be odd).
      protected long ls
      State of the LCG generator.
      protected static long M
      LCG multiplier.
      protected long x0
      State 0 of the XBG.
      protected long x1
      State 1 of the XBG.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
        L64X128Mix​(long[] seed)
      Creates a new instance.
        L64X128Mix​(long seed0, long seed1, long seed2, long seed3)
      Creates a new instance using a 4 element seed.
      protected L64X128Mix​(L64X128Mix source)
      Creates a copy instance.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected L64X128Mix copy()
      Create a copy.
      protected byte[] getStateInternal()
      Creates a snapshot of the RNG state.
      org.apache.commons.rng.UniformRandomProvider jump()
      Creates a copy of the UniformRandomProvider and then retreats the state of the current instance.
      org.apache.commons.rng.JumpableUniformRandomProvider longJump()
      Creates a copy of the UniformRandomProvider and then retreats the state of the current instance.
      long next()
      Return the next random value.
      protected void setStateInternal​(byte[] s)
      Resets the RNG to the given state.
      org.apache.commons.rng.SplittableUniformRandomProvider split​(org.apache.commons.rng.UniformRandomProvider source)
      Stream<org.apache.commons.rng.SplittableUniformRandomProvider> splits​(long streamSize, org.apache.commons.rng.SplittableUniformRandomProvider source)
      • Methods inherited from interface org.apache.commons.rng.JumpableUniformRandomProvider

        jumps, jumps
      • Methods inherited from interface org.apache.commons.rng.LongJumpableUniformRandomProvider

        longJumps, longJumps
      • Methods inherited from interface org.apache.commons.rng.SplittableUniformRandomProvider

        doubles, doubles, doubles, doubles, ints, ints, ints, ints, longs, longs, longs, longs, split, splits, splits, splits
      • Methods inherited from interface org.apache.commons.rng.UniformRandomProvider

        nextBoolean, nextBytes, nextBytes, nextDouble, nextDouble, nextDouble, nextFloat, nextFloat, nextFloat, nextInt, nextInt, nextInt, nextLong, nextLong, nextLong
    • Field Detail

      • x0

        protected long x0
        State 0 of the XBG.
      • x1

        protected long x1
        State 1 of the XBG.
      • la

        protected long la
        Per-instance LCG additive parameter (must be odd). Cannot be final to support RestorableUniformRandomProvider.
      • ls

        protected long ls
        State of the LCG generator.
    • Constructor Detail

      • L64X128Mix

        public L64X128Mix​(long[] seed)
        Creates a new instance.
        Parameters:
        seed - Initial seed. If the length is larger than 4, only the first 4 elements will be used; if smaller, the remaining elements will be automatically set. A seed containing all zeros in the last two elements will create a non-functional XBG sub-generator and a low quality output with a period of 264.

        The 1st element is used to set the LCG increment; the least significant bit is set to odd to ensure a full period LCG. The 2nd element is used to set the LCG state.

      • L64X128Mix

        public L64X128Mix​(long seed0,
                          long seed1,
                          long seed2,
                          long seed3)
        Creates a new instance using a 4 element seed. A seed containing all zeros in the last two elements will create a non-functional XBG sub-generator and a low quality output with a period of 264.

        The 1st element is used to set the LCG increment; the least significant bit is set to odd to ensure a full period LCG. The 2nd element is used to set the LCG state.

        Parameters:
        seed0 - Initial seed element 0.
        seed1 - Initial seed element 1.
        seed2 - Initial seed element 2.
        seed3 - Initial seed element 3.
      • L64X128Mix

        protected L64X128Mix​(L64X128Mix source)
        Creates a copy instance.
        Parameters:
        source - Source to copy.
    • Method Detail

      • next

        public long next()
        Return the next random value.
        Specified by:
        next in interface RandomLongSource
        Returns:
        the next random value.
      • split

        public org.apache.commons.rng.SplittableUniformRandomProvider split​(org.apache.commons.rng.UniformRandomProvider source)
        Specified by:
        split in interface org.apache.commons.rng.SplittableUniformRandomProvider
      • splits

        public Stream<org.apache.commons.rng.SplittableUniformRandomProvider> splits​(long streamSize,
                                                                                     org.apache.commons.rng.SplittableUniformRandomProvider source)
        Specified by:
        splits in interface org.apache.commons.rng.SplittableUniformRandomProvider
      • getStateInternal

        protected byte[] getStateInternal()
        Creates a snapshot of the RNG state.
        Returns:
        the internal state.
      • jump

        public org.apache.commons.rng.UniformRandomProvider 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 (2128 - 1) positions. It can provide up to 264 non-overlapping subsequences.

        Specified by:
        jump in interface org.apache.commons.rng.JumpableUniformRandomProvider
      • longJump

        public org.apache.commons.rng.JumpableUniformRandomProvider 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 232 cycles. The XBG state is unchanged.

        The jump size is the equivalent of moving the state backwards by 232 (2128 - 1) positions. It can provide up to 232 non-overlapping subsequences of length 232 (2128 - 1); each subsequence can provide up to 232 non-overlapping subsequences of length (2128 - 1) using the jump() method.

        Specified by:
        longJump in interface org.apache.commons.rng.LongJumpableUniformRandomProvider