Class L64X128Mix

All Implemented Interfaces:
RandomLongSource, JumpableUniformRandomProvider, LongJumpableUniformRandomProvider, RestorableUniformRandomProvider, SplittableUniformRandomProvider, UniformRandomProvider

public class L64X128Mix extends AbstractL64X128 implements 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:
  • Constructor Details

    • 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 Details