Class EnhancedRandom

java.lang.Object
java.util.Random
com.github.tommyettinger.random.EnhancedRandom
All Implemented Interfaces:
Externalizable, Serializable, RandomGenerator
Direct Known Subclasses:
AceRandom, ArchivalWrapper, Bear32Random, ChopRandom, Crand64Random, DistinctRandom, DistributedRandom, FlowRandom, FourWheelRandom, GoldenQuasiRandom, InterpolatedRandom, Jsf32Random, KnownSequenceRandom, LaserRandom, LowChangeQuasiRandom, MizuchiRandom, PasarRandom, PouchRandom, Respite32Random, ReverseWrapper, RomuTrioRandom, ScruffRandom, Sfc64Random, StrangerRandom, TricycleRandom, TrimRandom, TupleQuasiRandom, VanDerCorputQuasiRandom, WhiskerRandom, Xoroshiro128StarStarRandom, Xoshiro128PlusPlusRandom, Xoshiro256MX3Random, Xoshiro256StarStarRandom

public abstract class EnhancedRandom extends Random implements Externalizable
A superset of the functionality in Random, meant for random number generators that would be too bare-bones with just Random's methods.
See Also:
  • Nested Class Summary

  • Constructor Summary

    Constructors
    Constructor
    Description
     
    EnhancedRandom(long seed)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static boolean
    Given two EnhancedRandom objects that could have the same or different classes, this returns true if they have the same class and same state, or false otherwise.
    Creates a new EnhancedRandom with identical states to this one, so if the same EnhancedRandom methods are called on this object and its copy (in the same order), the same outputs will be produced.
    static long
    fixGamma(long gamma)
    Attempts to improve the quality of a "gamma" increment for an additive sequence.
    long
    getSelectedState(int selection)
    Gets a selected state value from this EnhancedRandom.
    int
    Gets the number of possible state variables that can be selected with getSelectedState(int) or setSelectedState(int, long).
    abstract String
    Gets the tag used to identify this type of EnhancedRandom, as a String.
    double
    maxDoubleOf(double innerBound, double outerBound, int trials)
    Returns the maximum result of trials calls to nextDouble(double, double) using the given innerBound and outerBound.
    float
    maxFloatOf(float innerBound, float outerBound, int trials)
    Returns the maximum result of trials calls to nextFloat(float, float) using the given innerBound and outerBound.
    int
    maxIntOf(int innerBound, int outerBound, int trials)
    Returns the maximum result of trials calls to nextSignedInt(int, int) using the given innerBound and outerBound.
    long
    maxLongOf(long innerBound, long outerBound, int trials)
    Returns the maximum result of trials calls to nextSignedLong(long, long) using the given innerBound and outerBound.
    double
    minDoubleOf(double innerBound, double outerBound, int trials)
    Returns the minimum result of trials calls to nextDouble(double, double) using the given innerBound and outerBound.
    float
    minFloatOf(float innerBound, float outerBound, int trials)
    Returns the minimum result of trials calls to nextFloat(float, float) using the given innerBound and outerBound.
    int
    minIntOf(int innerBound, int outerBound, int trials)
    Returns the minimum result of trials calls to nextSignedInt(int, int) using the given innerBound and outerBound.
    long
    minLongOf(long innerBound, long outerBound, int trials)
    Returns the minimum result of trials calls to nextSignedLong(long, long) using the given innerBound and outerBound.
    int
    next(int bits)
    Generates the next pseudorandom number with a specific maximum size in bits (not a max number).
    boolean
    Returns the next pseudorandom, uniformly distributed boolean value from this random number generator's sequence.
    boolean
    nextBoolean(float chance)
    Returns true if a random value between 0 and 1 is less than the specified value.
    void
    nextBytes(byte[] bytes)
    Generates random bytes and places them into a user-supplied byte array.
    double
    Returns the next pseudorandom, uniformly distributed double value between 0.0 (inclusive) and 1.0 (exclusive) from this random number generator's sequence.
    double
    nextDouble(double outerBound)
    Gets a pseudo-random double between 0 (inclusive) and outerBound (exclusive).
    double
    nextDouble(double innerBound, double outerBound)
    Gets a pseudo-random double between innerBound (inclusive) and outerBound (exclusive).
    double
    Gets a random double between 0.0 and 1.0, exclusive at both ends; this method is also more uniform than nextDouble() if you use the bit-patterns of the returned doubles.
    double
    nextExclusiveDouble(double outerBound)
    Just like nextDouble(double), but this is exclusive on both 0.0 and outerBound.
    double
    nextExclusiveDouble(double innerBound, double outerBound)
    Just like nextDouble(double, double), but this is exclusive on both innerBound and outerBound.
    double
    Gets a random double between 0.0 and 1.0, exclusive at both ends.
    float
    Gets a random float between 0.0 and 1.0, exclusive at both ends.
    float
    nextExclusiveFloat(float outerBound)
    Just like nextFloat(float), but this is exclusive on both 0.0 and outerBound.
    float
    nextExclusiveFloat(float innerBound, float outerBound)
    Just like nextFloat(float, float), but this is exclusive on both innerBound and outerBound.
    float
    Gets a random float between 0.0 and 1.0, exclusive at both ends.
    double
    Gets a random double that may be positive or negative, but cannot be 0, and always has a magnitude less than 1.
    float
    Gets a random float that may be positive or negative, but cannot be 0, and always has a magnitude less than 1.
    float
    Returns the next pseudorandom, uniformly distributed float value between 0.0 (inclusive) and 1.0 (exclusive) from this random number generator's sequence.
    float
    nextFloat(float outerBound)
    Gets a pseudo-random float between 0 (inclusive) and outerBound (exclusive).
    float
    nextFloat(float innerBound, float outerBound)
    Gets a pseudo-random float between innerBound (inclusive) and outerBound (exclusive).
    double
    Returns the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.
    double
    nextGaussian(double mean, double stddev)
    Returns the next pseudorandom, Gaussian ("normally") distributed double value with the specified mean and standard deviation from this random number generator's sequence.
    double
    This is just like nextDouble(), returning a double between 0 and 1, except that it is inclusive on both 0.0 and 1.0.
    double
    nextInclusiveDouble(double outerBound)
    Just like nextDouble(double), but this is inclusive on both 0.0 and outerBound.
    double
    nextInclusiveDouble(double innerBound, double outerBound)
    Just like nextDouble(double, double), but this is inclusive on both innerBound and outerBound.
    float
    This is just like nextFloat(), returning a float between 0 and 1, except that it is inclusive on both 0.0 and 1.0.
    float
    nextInclusiveFloat(float outerBound)
    Just like nextFloat(float), but this is inclusive on both 0.0 and outerBound.
    float
    nextInclusiveFloat(float innerBound, float outerBound)
    Just like nextFloat(float, float), but this is inclusive on both innerBound and outerBound.
    int
    Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
    int
    nextInt(int bound)
    Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.
    int
    nextInt(int innerBound, int outerBound)
    Returns a pseudorandom, uniformly distributed int value between the specified innerBound (inclusive) and the specified outerBound (exclusive).
    abstract long
    Returns the next pseudorandom, uniformly distributed long value from this random number generator's sequence.
    long
    nextLong(long bound)
    Returns a pseudorandom, uniformly distributed long value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.
    long
    nextLong(long inner, long outer)
    Returns a pseudorandom, uniformly distributed long value between the specified innerBound (inclusive) and the specified outerBound (exclusive).
    int
    Returns -1 or 1, randomly.
    int
    nextSignedInt(int outerBound)
    Returns a pseudorandom, uniformly distributed int value between an inner bound of 0 (inclusive) and the specified outerBound (exclusive).
    int
    nextSignedInt(int innerBound, int outerBound)
    Returns a pseudorandom, uniformly distributed int value between the specified innerBound (inclusive) and the specified outerBound (exclusive).
    long
    nextSignedLong(long outerBound)
    Returns a pseudorandom, uniformly distributed long value between an inner bound of 0 (inclusive) and the specified outerBound (exclusive).
    long
    nextSignedLong(long inner, long outer)
    Returns a pseudorandom, uniformly distributed long value between the specified innerBound (inclusive) and the specified outerBound (exclusive).
    float
    Returns a triangularly distributed random number between -1.0 (exclusive) and 1.0 (exclusive), where values around zero are more likely.
    float
    nextTriangular(float max)
    Returns a triangularly distributed random number between -max (exclusive) and max (exclusive), where values around zero are more likely.
    float
    nextTriangular(float min, float max)
    Returns a triangularly distributed random number between min (inclusive) and max (exclusive), where the mode argument defaults to the midpoint between the bounds, giving a symmetric distribution.
    float
    nextTriangular(float min, float max, float mode)
    Returns a triangularly distributed random number between min (inclusive) and max (exclusive), where values around mode are more likely.
    int
    nextUnsignedInt(int bound)
    Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.
    int
    Optional; moves the state to its previous value and returns the previous int that would have been produced by nextInt().
    long
    Optional; moves the state to its previous value and returns the previous long that would have been produced by nextLong().
    static double
    probit(double d)
    A way of taking a double in the (0.0, 1.0) range and mapping it to a Gaussian or normal distribution, so high inputs correspond to high outputs, and similarly for the low range.
    <T> T
    Gets a randomly selected item from the given List, such as an ArrayList.
    <T> T
    randomElement(T[] array)
    Gets a randomly-selected item from the given array, which must be non-null and non-empty
    void
    The object implements the readExternal method to restore its contents by calling the methods of DataInput for primitive types and readObject for objects, strings and arrays.
    static long
    Uses Math.random() to hastily put together a not-especially-uniform long value, meant only to produce a seed when no seed was specified (the "I don't care" seed).
    abstract void
    setSeed(long seed)
    Sets the seed of this random number generator using a single long seed.
    void
    setSelectedState(int selection, long value)
    Sets a selected state value to the given long value.
    void
    setState(long state)
    Sets each state variable to the given state.
    void
    setState(long... states)
    Sets all state variables to alternating values chosen from states.
    void
    setState(long stateA, long stateB)
    Sets each state variable to either stateA or stateB, alternating.
    void
    setState(long stateA, long stateB, long stateC)
    Sets each state variable to stateA, stateB, or stateC, alternating.
    void
    setState(long stateA, long stateB, long stateC, long stateD)
    Sets each state variable to stateA, stateB, stateC, or stateD, alternating.
    void
    setState(long stateA, long stateB, long stateC, long stateD, long stateE)
    Sets each state variable to stateA, stateB, stateC, or stateD, alternating.
    void
    Similar to copy(), but fills this EnhancedRandom with the state of another EnhancedRandom, usually (but not necessarily) one of the same type.
    void
    shuffle(boolean[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(boolean[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(byte[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(byte[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(char[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(char[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(double[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(double[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(float[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(float[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(int[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(int[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(long[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(long[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(short[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    void
    shuffle(short[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    <T> void
    shuffle(List<T> items)
    Shuffles the given List in-place pseudo-randomly, using this to determine how to shuffle.
    <T> void
    shuffle(List<T> items, int offset, int length)
    Shuffles a section of the given List in-place pseudo-randomly, using this to determine how to shuffle.
    <T> void
    shuffle(T[] items)
    Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
    <T> void
    shuffle(T[] items, int offset, int length)
    Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
    long
    skip(long advance)
    Optional; advances or rolls back the EnhancedRandom' state without actually generating each number.
    Given a String in the format produced by stringSerialize(), this will attempt to set this EnhancedRandom object to match the state in the serialized data.
    stringDeserialize(String data, com.github.tommyettinger.digital.Base base)
    Given a String in the format produced by stringSerialize(Base), and the same Base used by the serialization, this will attempt to set this EnhancedRandom object to match the state in the serialized data.
    Serializes the current state of this EnhancedRandom to a String that can be used by stringDeserialize(String) to load this state at another time.
    stringSerialize(com.github.tommyettinger.digital.Base base)
    Serializes the current state of this EnhancedRandom to a String that can be used by stringDeserialize(String) to load this state at another time.
    void
    The object implements the writeExternal method to save its contents by calling the methods of DataOutput for its primitive values or calling the writeObject method of ObjectOutput for objects, strings, and arrays.

    Methods inherited from class java.util.Random

    doubles, doubles, doubles, doubles, ints, ints, ints, ints, longs, longs, longs, longs

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface java.util.random.RandomGenerator

    isDeprecated, nextExponential
  • Constructor Details

    • EnhancedRandom

      public EnhancedRandom()
    • EnhancedRandom

      public EnhancedRandom(long seed)
  • Method Details

    • getTag

      public abstract String getTag()
      Gets the tag used to identify this type of EnhancedRandom, as a String. This tag should be unique, and for uniformity purposes, all tags used in this library are 4 characters long. User-defined tags should have a different length.
      Returns:
      a unique String identifier for this type of EnhancedRandom; usually 4 chars long.
    • seedFromMath

      public static long seedFromMath()
      Uses Math.random() to hastily put together a not-especially-uniform long value, meant only to produce a seed when no seed was specified (the "I don't care" seed).
      Returns:
      a kind-of-uniform long value
    • setSeed

      public abstract void setSeed(long seed)
      Sets the seed of this random number generator using a single long seed. This should behave exactly the same as if a new object of this type was created with the constructor that takes a single long value. This does not necessarily assign the state variable(s) of the implementation with the exact contents of seed, so getSelectedState(int) should not be expected to return seed after this, though it may. If this implementation has more than one long of state, then the expectation is that none of those state variables will be exactly equal to seed (almost all the time).
      Overrides:
      setSeed in class Random
      Parameters:
      seed - the initial seed
    • getStateCount

      public int getStateCount()
      Gets the number of possible state variables that can be selected with getSelectedState(int) or setSelectedState(int, long). This defaults to returning 0, making no state variable available for reading or writing. An implementation that has only one long state, like DistinctRandom generator, should return 1. A generator that permits setting two different long values, like LaserRandom, should return 2. Much larger values are possible for types like the Mersenne Twister or some CMWC generators.
      Returns:
      the non-negative number of selections possible for state variables
    • getSelectedState

      public long getSelectedState(int selection)
      Gets a selected state value from this EnhancedRandom. The number of possible selections is up to the implementing class, and is accessible via getStateCount(), but negative values for selection are typically not tolerated. This should return the exact value of the selected state, assuming it is implemented. The default implementation throws an UnsupportedOperationException, and implementors only have to allow reading the state if they choose to implement this differently. If this method is intended to be used, getStateCount() must also be implemented.
      Parameters:
      selection - used to select which state variable to get; generally non-negative
      Returns:
      the exact value of the selected state
    • setSelectedState

      public void setSelectedState(int selection, long value)
      Sets a selected state value to the given long value. The number of possible selections is up to the implementing class, but negative values for selection are typically not tolerated. Implementors are permitted to change value if it is not valid, but they should not alter it if it is valid. The public implementation calls setSeed(long) with value, which doesn't need changing if the generator has one state that is set verbatim by setSeed(). Otherwise, this method should be implemented when getSelectedState(int) is and the state is allowed to be set by users. Having accurate ways to get and set the full state of a random number generator makes it much easier to serialize and deserialize that class.
      Parameters:
      selection - used to select which state variable to set; generally non-negative
      value - the exact value to use for the selected state, if valid
    • setState

      public void setState(long state)
      Sets each state variable to the given state. If getStateCount() is 1, then this should set the whole state to the given value using setSelectedState(int, long). If getStateCount() is more than 1, then all states will be set in the same way (using setSelectedState(), all to state).
      Parameters:
      state - the long value to use for each state variable
    • setState

      public void setState(long stateA, long stateB)
      Sets each state variable to either stateA or stateB, alternating. This uses setSelectedState(int, long) to set the values. If there is one state variable (getStateCount() is 1), then this only sets that state variable to stateA. If there are two state variables, the first is set to stateA, and the second to stateB. If there are more, it reuses stateA, then stateB, then stateA, and so on until all variables are set.
      Parameters:
      stateA - the long value to use for states at index 0, 2, 4, 6...
      stateB - the long value to use for states at index 1, 3, 5, 7...
    • setState

      public void setState(long stateA, long stateB, long stateC)
      Sets each state variable to stateA, stateB, or stateC, alternating. This uses setSelectedState(int, long) to set the values. If there is one state variable (getStateCount() is 1), then this only sets that state variable to stateA. If there are two state variables, the first is set to stateA, and the second to stateB. With three state variables, the first is set to stateA, the second to stateB, and the third to stateC. If there are more, it reuses stateA, then stateB, then stateC, then stateA, and so on until all variables are set.
      Parameters:
      stateA - the long value to use for states at index 0, 3, 6, 9...
      stateB - the long value to use for states at index 1, 4, 7, 10...
      stateC - the long value to use for states at index 2, 5, 8, 11...
    • setState

      public void setState(long stateA, long stateB, long stateC, long stateD)
      Sets each state variable to stateA, stateB, stateC, or stateD, alternating. This uses setSelectedState(int, long) to set the values. If there is one state variable (getStateCount() is 1), then this only sets that state variable to stateA. If there are two state variables, the first is set to stateA, and the second to stateB. With three state variables, the first is set to stateA, the second to stateB, and the third to stateC. With four state variables, the first is set to stateA, the second to stateB, the third to stateC, and the fourth to stateD. If there are more, it reuses stateA, then stateB, then stateC, then stateD, then stateA, and so on until all variables are set.
      Parameters:
      stateA - the long value to use for states at index 0, 4, 8, 12...
      stateB - the long value to use for states at index 1, 5, 9, 13...
      stateC - the long value to use for states at index 2, 6, 10, 14...
      stateD - the long value to use for states at index 3, 7, 11, 15...
    • setState

      public void setState(long stateA, long stateB, long stateC, long stateD, long stateE)
      Sets each state variable to stateA, stateB, stateC, or stateD, alternating. This uses setSelectedState(int, long) to set the values. If there is one state variable (getStateCount() is 1), then this only sets that state variable to stateA. If there are two state variables, the first is set to stateA, and the second to stateB. With three state variables, the first is set to stateA, the second to stateB, and the third to stateC. With four state variables, the first is set to stateA, the second to stateB, the third to stateC, and the fourth to stateD. If there are more, it reuses stateA, then stateB, then stateC, then stateD, then stateA, and so on until all variables are set.
      Parameters:
      stateA - the long value to use for states at index 0, 5, 10, 15...
      stateB - the long value to use for states at index 1, 6, 11, 16...
      stateC - the long value to use for states at index 2, 7, 12, 17...
      stateD - the long value to use for states at index 3, 8, 13, 18...
      stateE - the long value to use for states at index 4, 9, 14, 19...
    • setState

      public void setState(long... states)
      Sets all state variables to alternating values chosen from states. If states is empty, then this does nothing, and leaves the current generator unchanged. This works for generators with any getStateCount(), but may allocate an array if states is used as a varargs (you can pass an existing array without needing to allocate). This uses setSelectedState(int, long) to change the states.
      Parameters:
      states - an array or varargs of long values to use as states
    • next

      public int next(int bits)
      Generates the next pseudorandom number with a specific maximum size in bits (not a max number). If you want to get a random number in a range, you should usually use nextInt(int) instead. For some specific cases, this method is more efficient and less biased than nextInt(int). For bits values between 1 and 30, this should be similar in effect to nextInt(1 << bits); though it won't typically produce the same values, they will have the correct range. If bits is 31, this can return any non-negative int; note that nextInt(1 << 31) won't behave this way because 1 << 31 is negative. If bits is 32 (or 0), this can return any int.

      The general contract of next is that it returns an int value and if the argument bits is between 1 and 32 (inclusive), then that many low-order bits of the returned value will be (approximately) independently chosen bit values, each of which is (approximately) equally likely to be 0 or 1.

      Note that you can give this values for bits that are outside its expected range of 1 to 32, but the value used, as long as bits is positive, will effectively be bits % 32. As stated before, a value of 0 for bits is the same as a value of 32.

      Overrides:
      next in class Random
      Parameters:
      bits - the amount of random bits to request, from 1 to 32
      Returns:
      the next pseudorandom value from this random number generator's sequence
    • nextBytes

      public void nextBytes(byte[] bytes)
      Generates random bytes and places them into a user-supplied byte array. The number of random bytes produced is equal to the length of the byte array.
      Specified by:
      nextBytes in interface RandomGenerator
      Overrides:
      nextBytes in class Random
      Parameters:
      bytes - the byte array to fill with random bytes
      Throws:
      NullPointerException - if the byte array is null
    • nextInt

      public int nextInt()
      Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence. The general contract of nextInt is that one int value is pseudorandomly generated and returned. All 232 possible int values are produced with (approximately) equal probability.
      Specified by:
      nextInt in interface RandomGenerator
      Overrides:
      nextInt in class Random
      Returns:
      the next pseudorandom, uniformly distributed int value from this random number generator's sequence
    • nextInt

      public int nextInt(int bound)
      Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All bound possible int values are produced with (approximately) equal probability.
      This method clamps bound to be at least 0; it never returns a negative int.
      It should be mentioned that the technique this uses has some bias, depending on bound, but it typically isn't measurable without specifically looking for it. Using the method this does allows this method to always advance the state by one step, instead of a varying and unpredictable amount with the more typical ways of rejection-sampling random numbers and only using numbers that can produce an int within the bound without bias. See M.E. O'Neill's blog about random numbers for discussion of alternative, unbiased methods.
      Specified by:
      nextInt in interface RandomGenerator
      Overrides:
      nextInt in class Random
      Parameters:
      bound - the upper bound (exclusive). If negative or 0, this always returns 0.
      Returns:
      the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive) from this random number generator's sequence
    • nextUnsignedInt

      public int nextUnsignedInt(int bound)
      Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All bound possible int values are produced with (approximately) equal probability.
      This method treats the outer bound as unsigned, so if a negative int is passed as bound, it will be treated as positive and larger than Integer.MAX_VALUE. That means this can produce results that are positive or negative, but when you mask the result and the bound with 0xFFFFFFFFL (to treat them as unsigned), the result will always be between 0L (inclusive) and the masked bound (exclusive).
      This is primarily useful as a building block for other methods in this class.
      Parameters:
      bound - the upper bound (exclusive); treated as unsigned
      Returns:
      the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive), treated as unsigned, from this random number generator's sequence
    • nextSignedInt

      public int nextSignedInt(int outerBound)
      Returns a pseudorandom, uniformly distributed int value between an inner bound of 0 (inclusive) and the specified outerBound (exclusive). This is meant for cases where the outer bound may be negative, especially if the bound is unknown or may be user-specified. A negative outer bound is used as the lower bound; a positive outer bound is used as the upper bound. An outer bound of -1, 0, or 1 will always return 0, keeping the bound exclusive (except for outer bound 0). This method is slightly slower than nextInt(int).
      Parameters:
      outerBound - the outer exclusive bound; may be any int value, allowing negative
      Returns:
      a pseudorandom int between 0 (inclusive) and outerBound (exclusive)
      See Also:
    • nextInt

      public int nextInt(int innerBound, int outerBound)
      Returns a pseudorandom, uniformly distributed int value between the specified innerBound (inclusive) and the specified outerBound (exclusive). If outerBound is less than or equal to innerBound, this always returns innerBound.
      For any case where outerBound might be valid but less than innerBound, you can use nextSignedInt(int, int). If outerBound is less than innerBound here, this simply returns innerBound.
      Specified by:
      nextInt in interface RandomGenerator
      Parameters:
      innerBound - the inclusive inner bound; may be any int, allowing negative
      outerBound - the exclusive outer bound; must be greater than innerBound (otherwise this returns innerBound)
      Returns:
      a pseudorandom int between innerBound (inclusive) and outerBound (exclusive)
      See Also:
    • nextSignedInt

      public int nextSignedInt(int innerBound, int outerBound)
      Returns a pseudorandom, uniformly distributed int value between the specified innerBound (inclusive) and the specified outerBound (exclusive). This is meant for cases where either bound may be negative, especially if the bounds are unknown or may be user-specified.
      Parameters:
      innerBound - the inclusive inner bound; may be any int, allowing negative
      outerBound - the exclusive outer bound; may be any int, allowing negative
      Returns:
      a pseudorandom int between innerBound (inclusive) and outerBound (exclusive)
      See Also:
    • nextLong

      public abstract long nextLong()
      Returns the next pseudorandom, uniformly distributed long value from this random number generator's sequence. The general contract of nextLong is that one long value is pseudorandomly generated and returned.
      The only methods that need to be implemented by this interface are this and copy(), though other methods can be implemented as appropriate for generators that, for instance, natively produce ints rather than longs.
      Specified by:
      nextLong in interface RandomGenerator
      Overrides:
      nextLong in class Random
      Returns:
      the next pseudorandom, uniformly distributed long value from this random number generator's sequence
    • nextLong

      public long nextLong(long bound)
      Returns a pseudorandom, uniformly distributed long value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextLong is that one long value in the specified range is pseudorandomly generated and returned. All bound possible long values are produced with (approximately) equal probability, though there is a small amount of bias depending on the bound.
      Note that this advances the state by the same amount as a single call to nextLong(), which allows methods like skip(long) to function correctly, but introduces some bias when bound is very large. This will also advance the state if bound is 0 or negative, so usage with a variable bound will advance the state reliably.
      This method has some bias, particularly on larger bounds. Actually measuring bias with bounds in the trillions or greater is challenging but not impossible, so don't use this for a real-money gambling purpose. The bias isn't especially significant, though.
      Specified by:
      nextLong in interface RandomGenerator
      Parameters:
      bound - the upper bound (exclusive). If negative or 0, this always returns 0.
      Returns:
      the next pseudorandom, uniformly distributed long value between zero (inclusive) and bound (exclusive) from this random number generator's sequence
      See Also:
    • nextSignedLong

      public long nextSignedLong(long outerBound)
      Returns a pseudorandom, uniformly distributed long value between an inner bound of 0 (inclusive) and the specified outerBound (exclusive). This is meant for cases where the outer bound may be negative, especially if the bound is unknown or may be user-specified. A negative outer bound is used as the lower bound; a positive outer bound is used as the upper bound. An outer bound of -1, 0, or 1 will always return 0, keeping the bound exclusive (except for outer bound 0).

      Note that this advances the state by the same amount as a single call to nextLong(), which allows methods like skip(long) to function correctly, but introduces some bias when bound is very large. This method should be about as fast as nextLong(long) , unlike the speed difference between nextInt(int) and nextSignedInt(int).

      Parameters:
      outerBound - the outer exclusive bound; may be any long value, allowing negative
      Returns:
      a pseudorandom long between 0 (inclusive) and outerBound (exclusive)
      See Also:
    • nextLong

      public long nextLong(long inner, long outer)
      Returns a pseudorandom, uniformly distributed long value between the specified innerBound (inclusive) and the specified outerBound (exclusive). If outerBound is less than or equal to innerBound, this always returns innerBound.
      For any case where outerBound might be valid but less than innerBound, you can use nextSignedLong(long, long).
      Specified by:
      nextLong in interface RandomGenerator
      Parameters:
      inner - the inclusive inner bound; may be any long, allowing negative
      outer - the exclusive outer bound; must be greater than innerBound (otherwise this returns innerBound)
      Returns:
      a pseudorandom long between innerBound (inclusive) and outerBound (exclusive)
      See Also:
    • nextSignedLong

      public long nextSignedLong(long inner, long outer)
      Returns a pseudorandom, uniformly distributed long value between the specified innerBound (inclusive) and the specified outerBound (exclusive). This is meant for cases where either bound may be negative, especially if the bounds are unknown or may be user-specified.
      Parameters:
      inner - the inclusive inner bound; may be any long, allowing negative
      outer - the exclusive outer bound; may be any long, allowing negative
      Returns:
      a pseudorandom long between innerBound (inclusive) and outerBound (exclusive)
      See Also:
    • nextBoolean

      public boolean nextBoolean()
      Returns the next pseudorandom, uniformly distributed boolean value from this random number generator's sequence. The general contract of nextBoolean is that one boolean value is pseudorandomly generated and returned. The values true and false are produced with (approximately) equal probability.
      The public implementation simply returns a sign check on nextLong(), returning true if the generated long is negative. This is typically the safest way to implement this method; many types of generators have less statistical quality on their lowest bit, so just returning based on the lowest bit isn't always a good idea.
      Specified by:
      nextBoolean in interface RandomGenerator
      Overrides:
      nextBoolean in class Random
      Returns:
      the next pseudorandom, uniformly distributed boolean value from this random number generator's sequence
    • nextFloat

      public float nextFloat()
      Returns the next pseudorandom, uniformly distributed float value between 0.0 (inclusive) and 1.0 (exclusive) from this random number generator's sequence.

      The general contract of nextFloat is that one float value, chosen (approximately) uniformly from the range 0.0f (inclusive) to 1.0f (exclusive), is pseudorandomly generated and returned. All 224 possible float values of the form m x 2-24, where m is a positive integer less than 224, are produced with (approximately) equal probability.

      The public implementation uses the upper 24 bits of nextLong(), with an unsigned right shift and a multiply by a very small float (5.9604645E-8f or 0x1p-24f). It tends to be fast if nextLong() is fast, but alternative implementations could use 24 bits of nextInt() (or just next(int), giving it 24) if that generator doesn't efficiently generate 64-bit longs.

      Specified by:
      nextFloat in interface RandomGenerator
      Overrides:
      nextFloat in class Random
      Returns:
      the next pseudorandom, uniformly distributed float value between 0.0 and 1.0 from this random number generator's sequence
    • nextFloat

      public float nextFloat(float outerBound)
      Gets a pseudo-random float between 0 (inclusive) and outerBound (exclusive). The outerBound may be positive or negative. Exactly the same as nextFloat() * outerBound.
      Specified by:
      nextFloat in interface RandomGenerator
      Parameters:
      outerBound - the exclusive outer bound
      Returns:
      a float between 0 (inclusive) and outerBound (exclusive)
    • nextFloat

      public float nextFloat(float innerBound, float outerBound)
      Gets a pseudo-random float between innerBound (inclusive) and outerBound (exclusive). Either, neither, or both of innerBound and outerBound may be negative; this does not change which is inclusive and which is exclusive.
      Specified by:
      nextFloat in interface RandomGenerator
      Parameters:
      innerBound - the inclusive inner bound; may be negative
      outerBound - the exclusive outer bound; may be negative
      Returns:
      a float between innerBound (inclusive) and outerBound (exclusive)
    • nextDouble

      public double nextDouble()
      Returns the next pseudorandom, uniformly distributed double value between 0.0 (inclusive) and 1.0 (exclusive) from this random number generator's sequence.

      The general contract of nextDouble is that one double value, chosen (approximately) uniformly from the range 0.0d (inclusive) to 1.0d (exclusive), is pseudorandomly generated and returned.

      The public implementation uses the upper 53 bits of nextLong(), with an unsigned right shift and a multiply by a very small double (1.1102230246251565E-16, or 0x1p-53). It should perform well if nextLong() performs well, and is expected to perform less well if the generator naturally produces 32 or fewer bits at a time.

      Specified by:
      nextDouble in interface RandomGenerator
      Overrides:
      nextDouble in class Random
      Returns:
      the next pseudorandom, uniformly distributed double value between 0.0 and 1.0 from this random number generator's sequence
    • nextDouble

      public double nextDouble(double outerBound)
      Gets a pseudo-random double between 0 (inclusive) and outerBound (exclusive). The outerBound may be positive or negative. Exactly the same as nextDouble() * outerBound.
      Specified by:
      nextDouble in interface RandomGenerator
      Parameters:
      outerBound - the exclusive outer bound
      Returns:
      a double between 0 (inclusive) and outerBound (exclusive)
    • nextDouble

      public double nextDouble(double innerBound, double outerBound)
      Gets a pseudo-random double between innerBound (inclusive) and outerBound (exclusive). Either, neither, or both of innerBound and outerBound may be negative; this does not change which is inclusive and which is exclusive.
      Specified by:
      nextDouble in interface RandomGenerator
      Parameters:
      innerBound - the inclusive inner bound; may be negative
      outerBound - the exclusive outer bound; may be negative
      Returns:
      a double between innerBound (inclusive) and outerBound (exclusive)
    • nextInclusiveDouble

      public double nextInclusiveDouble()
      This is just like nextDouble(), returning a double between 0 and 1, except that it is inclusive on both 0.0 and 1.0. It returns 1.0 extremely rarely, 0.000000000000011102230246251565404236316680908203125% of the time if there is no bias in the generator, but it can happen. This uses similar code to nextExclusiveDouble() internally, and retains its quality of having approximately uniform distributions for every mantissa bit, unlike most ways of generating random floating-point numbers.
      Returns:
      a double between 0.0, inclusive, and 1.0, inclusive
    • nextInclusiveDouble

      public double nextInclusiveDouble(double outerBound)
      Just like nextDouble(double), but this is inclusive on both 0.0 and outerBound. It may be important to note that it returns outerBound on only 0.000000000000011102230246251565% of calls.
      Parameters:
      outerBound - the outer inclusive bound; may be positive or negative
      Returns:
      a double between 0.0, inclusive, and outerBound, inclusive
    • nextInclusiveDouble

      public double nextInclusiveDouble(double innerBound, double outerBound)
      Just like nextDouble(double, double), but this is inclusive on both innerBound and outerBound. It may be important to note that it returns outerBound on only 0.000000000000011102230246251565% of calls, if it can return it at all because of floating-point imprecision when innerBound is a larger number.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer inclusive bound; may be positive or negative
      Returns:
      a double between innerBound, inclusive, and outerBound, inclusive
    • nextInclusiveFloat

      public float nextInclusiveFloat()
      This is just like nextFloat(), returning a float between 0 and 1, except that it is inclusive on both 0.0 and 1.0. It returns 1.0 rarely, 0.00000596046412226771% of the time if there is no bias in the generator, but it can happen. This method does not return purely-equidistant floats, because there the resolution of possible floats it can generate is higher as it approaches 0.0 . The smallest non-zero float this can return is 5.421011E-20f (0x1p-64f in hex), and the largest non-one float this can return is 0.9999999f (0x1.fffffcp-1f in hex). This uses nearly identical code to nextExclusiveFloat(), but carefully adds and subtracts a small number to force rounding at 0.0 and 1.0 . This retains the exclusive version's quality of having approximately uniform distributions for every mantissa bit, unlike most ways of generating random floating-point numbers.
      Returns:
      a float between 0.0, inclusive, and 1.0, inclusive
    • nextInclusiveFloat

      public float nextInclusiveFloat(float outerBound)
      Just like nextFloat(float), but this is inclusive on both 0.0 and outerBound. It may be important to note that it returns outerBound on only 0.00000596046412226771% of calls.
      Parameters:
      outerBound - the outer inclusive bound; may be positive or negative
      Returns:
      a float between 0.0, inclusive, and outerBound, inclusive
    • nextInclusiveFloat

      public float nextInclusiveFloat(float innerBound, float outerBound)
      Just like nextFloat(float, float), but this is inclusive on both innerBound and outerBound. It may be important to note that it returns outerBound on only 0.00000596046412226771% of calls, if it can return it at all because of floating-point imprecision when innerBound is a larger number.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer inclusive bound; may be positive or negative
      Returns:
      a float between innerBound, inclusive, and outerBound, inclusive
    • nextExclusiveDouble

      public double nextExclusiveDouble()
      Gets a random double between 0.0 and 1.0, exclusive at both ends; this method is also more uniform than nextDouble() if you use the bit-patterns of the returned doubles. This is a simplified version of this algorithm by Allen Downey. This can return double values between 2.710505431213761E-20 and 0.9999999999999999, or 0x1.0p-65 and 0x1.fffffffffffffp-1 in hex notation. It cannot return 0 or 1. Some cases can prefer nextExclusiveDoubleEquidistant(), which is implemented more traditionally but may have slower performance. This method can also return doubles that are extremely close to 0, but can't return doubles that are as close to 1, due to how floating-point numbers work. However, nextExclusiveDoubleEquidistant() can return only a minimum value that is as distant from 0 as its maximum value is distant from 1.
      To compare, nextDouble() and nextExclusiveDoubleEquidistant() are less likely to produce a "1" bit for their lowest 5 bits of mantissa/significand (the least significant bits numerically, but potentially important for some uses), with the least significant bit produced half as often as the most significant bit in the mantissa. As for this method, it has approximately the same likelihood of producing a "1" bit for any position in the mantissa.
      The implementation may have different performance characteristics than nextDouble(), because this doesn't perform any floating-point multiplication or division, and instead assembles bits obtained by one call to nextLong(). This uses BitConversion.longBitsToDouble(long) and BitConversion.countLeadingZeros(long), both of which typically have optimized intrinsics on HotSpot, and this is branchless and loopless, unlike the original algorithm by Allen Downey. When compared with nextExclusiveDoubleEquidistant(), this method performs better on at least HotSpot JVMs. On GraalVM 17, this is over twice as fast as nextExclusiveDoubleEquidistant().
      Returns:
      a random uniform double between 2.710505431213761E-20 and 0.9999999999999999 (both inclusive)
    • nextExclusiveDoubleEquidistant

      public double nextExclusiveDoubleEquidistant()
      Gets a random double between 0.0 and 1.0, exclusive at both ends. This can return double values between 1.1102230246251565E-16 and 0.9999999999999999, or 0x1.0p-53 and 0x1.fffffffffffffp-1 in hex notation. It cannot return 0 or 1, and its minimum and maximum results are equally distant from 0 and from 1, respectively. Many usages may prefer nextExclusiveDouble(), which is better-distributed if you consider the bit representation of the returned doubles, tends to perform better, and can return doubles that much closer to 0 than this can.
      The implementation simply uses nextLong(long) to get a uniformly-chosen long between 1 and (2 to the 53) - 1, both inclusive, and multiplies it by (2 to the -53). Using larger values than (2 to the 53) would cause issues with the double math.
      Returns:
      a random uniform double between 0 and 1 (both exclusive)
    • nextExclusiveDouble

      public double nextExclusiveDouble(double outerBound)
      Just like nextDouble(double), but this is exclusive on both 0.0 and outerBound. Like nextExclusiveDouble(), which this uses, this may have better bit-distribution of double values, and it may also be better able to produce very small doubles when outerBound is large. It should typically be a little faster than nextDouble(double).
      Parameters:
      outerBound - the outer exclusive bound; may be positive or negative
      Returns:
      a double between 0.0, exclusive, and outerBound, exclusive
    • nextExclusiveDouble

      public double nextExclusiveDouble(double innerBound, double outerBound)
      Just like nextDouble(double, double), but this is exclusive on both innerBound and outerBound. Like nextExclusiveDouble(), which this uses,, this may have better bit-distribution of double values, and it may also be better able to produce doubles close to innerBound when outerBound - innerBound is large. It should typically be a little faster than nextDouble(double, double).
      Parameters:
      innerBound - the inner exclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      Returns:
      a double between innerBound, exclusive, and outerBound, exclusive
    • nextExclusiveSignedDouble

      public double nextExclusiveSignedDouble()
      Gets a random double that may be positive or negative, but cannot be 0, and always has a magnitude less than 1.
      This is a modified version of this algorithm by Allen Downey. This version can return double values between -0.9999999999999999 and -5.421010862427522E-20, as well as between 2.710505431213761E-20 and 0.9999999999999999, or -0x1.fffffffffffffp-1 to -0x1.0p-64 as well as between 0x1.0p-65 and 0x1.fffffffffffffp-1 in hex notation. It cannot return -1, 0 or 1. It has much more uniform bit distribution across its mantissa/significand bits than Random.nextDouble(), especially when the result of nextDouble() is expanded to the -1.0 to 1.0 range (such as with 2.0 * (nextDouble() - 0.5)). Where the given example code is unable to produce a "1" bit for its lowest bit of mantissa (the least significant bits numerically, but potentially important for some uses), this has approximately the same likelihood of producing a "1" bit for any positions in the mantissa, and also equal odds for the sign bit.
      Returns:
      a random uniform double between -1 and 1 with a tiny hole around 0 (all exclusive)
    • nextExclusiveFloat

      public float nextExclusiveFloat()
      Gets a random float between 0.0 and 1.0, exclusive at both ends. This method is also more uniform than nextFloat() if you use the bit-patterns of the returned floats. This is a simplified version of this algorithm by Allen Downey. This version can return float values between 2.7105054E-20 to 0.99999994, or 0x1.0p-65 to 0x1.fffffep-1 in hex notation. It cannot return 0 or 1. To compare, nextFloat() is less likely to produce a "1" bit for its lowest 5 bits of mantissa/significand (the least significant bits numerically, but potentially important for some uses), with the least significant bit produced half as often as the most significant bit in the mantissa. As for this method, it has approximately the same likelihood of producing a "1" bit for any position in the mantissa.
      The implementation may have different performance characteristics than nextFloat(), because this doesn't perform any floating-point multiplication or division, and instead assembles bits obtained by one call to nextLong(). This uses BitConversion.intBitsToFloat(int) and BitConversion.countLeadingZeros(long), both of which typically have optimized intrinsics on HotSpot, and this is branchless and loopless, unlike the original algorithm by Allen Downey. When compared with nextExclusiveFloatEquidistant(), this method performs better on at least HotSpot JVMs. On GraalVM 17, this is over twice as fast as nextExclusiveFloatEquidistant().
      Returns:
      a random uniform float between 0 and 1 (both exclusive)
    • nextExclusiveFloatEquidistant

      public float nextExclusiveFloatEquidistant()
      Gets a random float between 0.0 and 1.0, exclusive at both ends. This can return float values between 5.9604645E-8 and 0.99999994, or 0x1.0p-24 and 0x1.fffffep-1 in hex notation. It cannot return 0 or 1, and its minimum and maximum results are equally distant from 0 and from 1, respectively. Most usages might prefer nextExclusiveFloat(), which is better-distributed if you consider the bit representation of the returned floats, tends to perform better, and can return floats that much closer to 0 than this can.
      The implementation simply uses nextInt(int) to get a uniformly-chosen int between 1 and (2 to the 24) - 1, both inclusive, and multiplies it by (2 to the -24). Using larger values than (2 to the 24) would cause issues with the float math.
      Returns:
      a random uniform float between 0 and 1 (both exclusive)
    • nextExclusiveFloat

      public float nextExclusiveFloat(float outerBound)
      Just like nextFloat(float), but this is exclusive on both 0.0 and outerBound. Like nextExclusiveFloat(), this may have better bit-distribution of float values, and it may also be better able to produce very small floats when outerBound is large. It should be a little faster than nextFloat(float).
      Parameters:
      outerBound - the outer exclusive bound; may be positive or negative
      Returns:
      a float between 0.0, exclusive, and outerBound, exclusive
    • nextExclusiveFloat

      public float nextExclusiveFloat(float innerBound, float outerBound)
      Just like nextFloat(float, float), but this is exclusive on both innerBound and outerBound. Like nextExclusiveFloat(), this may have better bit-distribution of float values, and it may also be better able to produce floats close to innerBound when outerBound - innerBound is large. It should be a little faster than nextFloat(float, float).
      Parameters:
      innerBound - the inner exclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      Returns:
      a float between innerBound, exclusive, and outerBound, exclusive
    • nextExclusiveSignedFloat

      public float nextExclusiveSignedFloat()
      Gets a random float that may be positive or negative, but cannot be 0, and always has a magnitude less than 1.
      This is a modified version of this algorithm by Allen Downey. This version can return double values between -0.99999994 and -1.1641532E-10, as well as between 2.7105054E-20 and 0.99999994, or -0x1.fffffep-1 to -0x1.0p-33 as well as between 0x1.0p-65 and 0x1.fffffep-1 in hex notation. It cannot return -1, 0 or 1. It has much more uniform bit distribution across its mantissa/significand bits than Random.nextDouble(), especially when the result of nextDouble() is expanded to the -1.0 to 1.0 range (such as with 2.0 * (nextDouble() - 0.5)). Where the given example code is unable to produce a "1" bit for its lowest bit of mantissa (the least significant bits numerically, but potentially important for some uses), this has approximately the same likelihood of producing a "1" bit for any positions in the mantissa, and also equal odds for the sign bit.
      Returns:
      a random uniform double between -1 and 1 with a tiny hole around 0 (all exclusive)
    • nextGaussian

      public double nextGaussian()
      Returns the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.

      The general contract of nextGaussian is that one double value, chosen from (approximately) the usual normal distribution with mean 0.0 and standard deviation 1.0, is pseudorandomly generated and returned.

      This does not use a rough approximation, which is a departure from earlier versions; instead, it uses the Ziggurat method, which produces high-quality variables very quickly. Like earlier versions that used probit() or a bit-counting approximation, this requests exactly one long from the generator's sequence (using nextLong()). This makes it different from code like java.util.Random's nextGaussian() method, which can (rarely) fetch a higher number of random doubles.

      The implementation here was ported from code by Olaf Berstein, based on a paper by Jorgen A. Doornik and some steps from a paper by George Marsaglia. Ziggurat has more information, for the curious.

      Specified by:
      nextGaussian in interface RandomGenerator
      Overrides:
      nextGaussian in class Random
      Returns:
      the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence
    • nextGaussian

      public double nextGaussian(double mean, double stddev)
      Returns the next pseudorandom, Gaussian ("normally") distributed double value with the specified mean and standard deviation from this random number generator's sequence.
      This defaults to simply returning mean + stddev * nextGaussian().
      Specified by:
      nextGaussian in interface RandomGenerator
      Parameters:
      mean - the mean of the Gaussian distribution to be drawn from
      stddev - the standard deviation (square root of the variance) of the Gaussian distribution to be drawn from
      Returns:
      a Gaussian distributed double with the specified mean and standard deviation
    • skip

      public long skip(long advance)
      Optional; advances or rolls back the EnhancedRandom' state without actually generating each number. Skips forward or backward a number of steps specified by advance, where a step is equal to one call to nextLong(), and returns the random number produced at that step. Negative numbers can be used to step backward, or 0 can be given to get the most-recently-generated long from nextLong().

      The public implementation throws an UnsupportedOperationException. Many types of random number generator do not have an efficient way of skipping arbitrarily through the state sequence, and those types should not implement this method differently.

      Parameters:
      advance - Number of future generations to skip over; can be negative to backtrack, 0 gets the most-recently-generated number
      Returns:
      the random long generated after skipping forward or backwards by advance numbers
    • previousLong

      public long previousLong()
      Optional; moves the state to its previous value and returns the previous long that would have been produced by nextLong(). This can be equivalent to calling skip(long) with -1L, but not always; many generators can't efficiently skip long distances, but can step back by one value.
      Generators that natively generate int results typically produce long values by generating an int for the high 32 bits and an int for the low 32 bits. When producing the previous long, the order the high and low bits are generated, such as by previousInt(), should be reversed. Generators that natively produce long values usually don't need to implement previousInt(), but those that produce int usually should implement it, and may optionally call previousInt() twice in this method.
      If you know how to implement the reverse of a particular random number generator, it is recommended you do so here, rather than rely on skip(). This isn't always easy, but should always be possible for any decent PRNG (some historical PRNGs, such as the Middle-Square PRNG, cannot be reversed at all). If a generator cannot be reversed because multiple initial states can transition to the same subsequent state, it is known to have statistical problems that are not necessarily present in a generator that matches one initial state to one subsequent state.
      The public implementation calls skip(long) with -1L, and if skip() has not been implemented differently, then it will throw an UnsupportedOperationException.
      Returns:
      the previous number this would have produced with nextLong()
    • previousInt

      public int previousInt()
      Optional; moves the state to its previous value and returns the previous int that would have been produced by nextInt(). This can be equivalent to calling previousLong() and casting to int, but not always; generators that natively generate int results typically move the state once in nextInt() and twice in nextLong(), and should move the state back once here.
      If nextInt() is implemented using a call to nextLong(), the implementation in this class is almost always sufficient and correct. If nextInt() changes state differently from nextLong(), then this should be implemented, if feasible, and previousLong() can be implemented using this method. If you know how to implement the reverse of a particular random number generator, it is recommended you do so here, rather than rely on skip(). This isn't always easy, but should always be possible for any decent PRNG (some historical PRNGs, such as the Middle-Square PRNG, cannot be reversed at all). If a generator cannot be reversed because multiple initial states can transition to the same subsequent state, it is known to have statistical problems that are not necessarily present in a generator that matches one initial state to one subsequent state.
      The public implementation calls previousLong() and casts it to int, and if previousLong() and skip() have not been implemented differently, then it will throw an UnsupportedOperationException.
      Returns:
      the previous number this would have produced with nextInt()
    • copy

      public abstract EnhancedRandom copy()
      Creates a new EnhancedRandom with identical states to this one, so if the same EnhancedRandom methods are called on this object and its copy (in the same order), the same outputs will be produced. This is not guaranteed to copy the inherited state of any parent class, so if you call methods that are only implemented by a superclass (like Random) and not this one, the results may differ.
      Returns:
      a deep copy of this EnhancedRandom.
    • setWith

      public void setWith(EnhancedRandom other)
      Similar to copy(), but fills this EnhancedRandom with the state of another EnhancedRandom, usually (but not necessarily) one of the same type. If this class has the same getStateCount() as other's class, then this method copies the full state of other into this object. Otherwise, if this class has a larger state count than other's class, then all of other's state is copied into the same selections in this object, and the rest of this object's state is filled with -1L using setSelectedState(int, long). If this class has a smaller state count than other's class, then only part of other's state is copied, and this method stops when all of this object's states have been assigned.
      If this class has restrictions on its state, they will be respected by the public implementation of this method as long as setSelectedState(int, long) behaves correctly for those restrictions. Note that this method will public to throwing an UnsupportedOperationException unless getSelectedState(int) is implemented by other so its state can be accessed. This may also behave badly if setSelectedState(int, long) isn't implemented (it may be fine for some cases where the state count is 1, but don't count on it). If other's class doesn't implement getStateCount(), then this method sets the entire state of this object to -1L; if this class doesn't implement getStateCount(), then this method does nothing.
      Parameters:
      other - another EnhancedRandom, typically with the same class as this one, to copy its state into this
    • probit

      public static double probit(double d)
      A way of taking a double in the (0.0, 1.0) range and mapping it to a Gaussian or normal distribution, so high inputs correspond to high outputs, and similarly for the low range. This is centered on 0.0 and its standard deviation seems to be 1.0 (the same as Random.nextGaussian()). If this is given an input of 0.0 or less, it returns -38.5, which is slightly less than the result when given Double.MIN_VALUE. If it is given an input of 1.0 or more, it returns 38.5, which is significantly larger than the result when given the largest double less than 1.0 (this value is further from 1.0 than Double.MIN_VALUE is from 0.0). If given Double.NaN, it returns whatever Math.copySign(double, double) returns for the arguments 38.5, Double.NaN, which is implementation-dependent. It uses an algorithm by Peter John Acklam, as implemented by Sherali Karimov. Original source. Information on the algorithm. Wikipedia's page on the probit function may help, but is more likely to just be confusing.
      Acklam's algorithm and Karimov's implementation are both quite fast. This appears faster than generating Gaussian-distributed numbers using either the Box-Muller Transform or Marsaglia's Polar Method, though it isn't as precise and can't produce as extreme min and max results in the extreme cases they should appear. If given a typical uniform random double that's exclusive on 1.0, it won't produce a result higher than 8.209536145151493, and will only produce results of at least -8.209536145151493 if 0.0 is excluded from the inputs (if 0.0 is an input, the result is -38.5). A chief advantage of using this with a random number generator is that it only requires one random double to obtain one Gaussian value; Random.nextGaussian() generates at least two random doubles for each two Gaussian values, but may rarely require much more random generation. Note that this method isn't used by default for nextGaussian(), because it uses a very different approximation that is faster but less precise.
      This can be used both as an optimization for generating Gaussian random values, and as a way of generating Gaussian values that match a pattern present in the inputs (which you could have by using a sub-random sequence as the input, such as those produced by a van der Corput, Halton, Sobol or R2 sequence). Most methods of generating Gaussian values (e.g. Box-Muller and Marsaglia polar) do not have any way to preserve a particular pattern.
      Parameters:
      d - should be between 0 and 1, exclusive, but other values are tolerated
      Returns:
      a normal-distributed double centered on 0.0; all results will be between -38.5 and 38.5, both inclusive
    • fixGamma

      public static long fixGamma(long gamma)
      Attempts to improve the quality of a "gamma" increment for an additive sequence. This is stricter than the checks in Java 8's SplittableRandom. The goal here is to make sure the gamma is "sufficiently random" to avoid patterns when used as an increment. Examples of gamma values that aren't random enough include 1L, 3L, 0xFFFFFFFFFFFFFFFFL, 0xAAAAAAAAAAAAAAABL, and so on. It rejects any gamma value where any of four bit counts are less than 24 or greater than 40. The values that have their bits counted are:
      • The gamma itself,
      • The Gray code of the gamma, defined as (gamma ^ (gamma >>> 1)),
      • The MathTools.modularMultiplicativeInverse(long) of the gamma,
      • And the Gray code of the above inverse of the gamma.
      If a gamma is rejected, this multiplies it by an LCG constant, 0xD1342543DE82EF95L, adds an increasing even number (first 2, then 4, then 6, and so on) and tries again repeatedly. It returns the first gamma that wasn't rejected, which could be the original gamma.
      Parameters:
      gamma - any long, though almost always an odd number, that would be added as an increment in a sequence
      Returns:
      gamma or a modification upon it such that its bits are "sufficiently random" to be a good increment
      See Also:
    • areEqual

      public static boolean areEqual(EnhancedRandom left, EnhancedRandom right)
      Given two EnhancedRandom objects that could have the same or different classes, this returns true if they have the same class and same state, or false otherwise. Both of the arguments should implement getSelectedState(int), or this will throw an UnsupportedOperationException. This can be useful for comparing EnhancedRandom classes that do not implement equals(), for whatever reason. This returns true if both arguments are null, but false if only one is null.
      Parameters:
      left - an EnhancedRandom to compare for equality
      right - another EnhancedRandom to compare for equality
      Returns:
      true if the two EnhancedRandom objects have the same class and state, or false otherwise
    • nextBoolean

      public boolean nextBoolean(float chance)
      Returns true if a random value between 0 and 1 is less than the specified value.
      Parameters:
      chance - a float between 0.0 and 1.0; higher values are more likely to result in true
      Returns:
      a boolean selected with the given chance of being true
    • nextSign

      public int nextSign()
      Returns -1 or 1, randomly.
      Returns:
      -1 or 1, selected with approximately equal likelihood
    • nextTriangular

      public float nextTriangular()
      Returns a triangularly distributed random number between -1.0 (exclusive) and 1.0 (exclusive), where values around zero are more likely. Advances the state twice.

      This is an optimized version of nextTriangular(-1, 1, 0)

    • nextTriangular

      public float nextTriangular(float max)
      Returns a triangularly distributed random number between -max (exclusive) and max (exclusive), where values around zero are more likely. Advances the state twice.

      This is an optimized version of nextTriangular(-max, max, 0)

      Parameters:
      max - the upper limit
    • nextTriangular

      public float nextTriangular(float min, float max)
      Returns a triangularly distributed random number between min (inclusive) and max (exclusive), where the mode argument defaults to the midpoint between the bounds, giving a symmetric distribution. Advances the state once.

      This method is equivalent to nextTriangular(min, max, (min + max) * 0.5f)

      Parameters:
      min - the lower limit
      max - the upper limit
    • nextTriangular

      public float nextTriangular(float min, float max, float mode)
      Returns a triangularly distributed random number between min (inclusive) and max (exclusive), where values around mode are more likely. Advances the state once.
      Parameters:
      min - the lower limit
      max - the upper limit
      mode - the point around which the values are more likely
    • minIntOf

      public int minIntOf(int innerBound, int outerBound, int trials)
      Returns the minimum result of trials calls to nextSignedInt(int, int) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the lower the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the lowest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • maxIntOf

      public int maxIntOf(int innerBound, int outerBound, int trials)
      Returns the maximum result of trials calls to nextSignedInt(int, int) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the higher the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the highest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • minLongOf

      public long minLongOf(long innerBound, long outerBound, int trials)
      Returns the minimum result of trials calls to nextSignedLong(long, long) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the lower the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the lowest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • maxLongOf

      public long maxLongOf(long innerBound, long outerBound, int trials)
      Returns the maximum result of trials calls to nextSignedLong(long, long) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the higher the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the highest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • minDoubleOf

      public double minDoubleOf(double innerBound, double outerBound, int trials)
      Returns the minimum result of trials calls to nextDouble(double, double) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the lower the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the lowest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • maxDoubleOf

      public double maxDoubleOf(double innerBound, double outerBound, int trials)
      Returns the maximum result of trials calls to nextDouble(double, double) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the higher the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the highest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • minFloatOf

      public float minFloatOf(float innerBound, float outerBound, int trials)
      Returns the minimum result of trials calls to nextFloat(float, float) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the lower the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the lowest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • maxFloatOf

      public float maxFloatOf(float innerBound, float outerBound, int trials)
      Returns the maximum result of trials calls to nextFloat(float, float) using the given innerBound and outerBound. The innerBound is inclusive; the outerBound is exclusive. The higher trials is, the higher the average value this returns.
      Parameters:
      innerBound - the inner inclusive bound; may be positive or negative
      outerBound - the outer exclusive bound; may be positive or negative
      trials - how many random numbers to acquire and compare
      Returns:
      the highest random number between innerBound (inclusive) and outerBound (exclusive) this found
    • randomElement

      public <T> T randomElement(T[] array)
      Gets a randomly-selected item from the given array, which must be non-null and non-empty
      Type Parameters:
      T - any reference type
      Parameters:
      array - a non-null, non-empty array of T items
      Returns:
      a random item from array
      Throws:
      NullPointerException - if array is null
      IndexOutOfBoundsException - if array is empty
    • randomElement

      public <T> T randomElement(List<T> list)
      Gets a randomly selected item from the given List, such as an ArrayList. If the List is empty, this throws an IndexOutOfBoundsException.
      Type Parameters:
      T - the type of items
      Parameters:
      list - a non-empty implementation of List, such as ArrayList
      Returns:
      a randomly-selected item from list
    • shuffle

      public void shuffle(int[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - an int array; must be non-null
    • shuffle

      public void shuffle(int[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - an int array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(long[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a long array; must be non-null
    • shuffle

      public void shuffle(long[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a long array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(float[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a float array; must be non-null
    • shuffle

      public void shuffle(float[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a float array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(char[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a char array; must be non-null
    • shuffle

      public void shuffle(char[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a char array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(byte[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a byte array; must be non-null
    • shuffle

      public void shuffle(byte[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a byte array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(double[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a double array; must be non-null
    • shuffle

      public void shuffle(double[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a double array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(short[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a short array; must be non-null
    • shuffle

      public void shuffle(short[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a short array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public void shuffle(boolean[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a boolean array; must be non-null
    • shuffle

      public void shuffle(boolean[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a boolean array; must be non-null
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public <T> void shuffle(T[] items)
      Shuffles the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - an array of some reference type; must be non-null but may contain null items
    • shuffle

      public <T> void shuffle(T[] items, int offset, int length)
      Shuffles a section of the given array in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - an array of some reference type; must be non-null but may contain null items
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • shuffle

      public <T> void shuffle(List<T> items)
      Shuffles the given List in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a List of some type T; must be non-null but may contain null items
    • shuffle

      public <T> void shuffle(List<T> items, int offset, int length)
      Shuffles a section of the given List in-place pseudo-randomly, using this to determine how to shuffle.
      Parameters:
      items - a List of some type T; must be non-null but may contain null items
      offset - the index of the first element of the array that can be shuffled
      length - the length of the section to shuffle
    • stringSerialize

      public String stringSerialize()
      Serializes the current state of this EnhancedRandom to a String that can be used by stringDeserialize(String) to load this state at another time. This always uses Base.BASE16 for its conversions.
      Returns:
      a String storing all data from the EnhancedRandom part of this generator
    • stringSerialize

      public String stringSerialize(com.github.tommyettinger.digital.Base base)
      Serializes the current state of this EnhancedRandom to a String that can be used by stringDeserialize(String) to load this state at another time.
      Parameters:
      base - which Base to use, from the "digital" library, such as Base.BASE10
      Returns:
      a String storing all data from the EnhancedRandom part of this generator
    • stringDeserialize

      public EnhancedRandom stringDeserialize(String data)
      Given a String in the format produced by stringSerialize(), this will attempt to set this EnhancedRandom object to match the state in the serialized data. This only works if this EnhancedRandom is the same implementation that was serialized. Always uses Base.BASE16. Returns this EnhancedRandom, after possibly changing its state.
      Parameters:
      data - a String probably produced by stringSerialize()
      Returns:
      this, after setting its state
    • stringDeserialize

      public EnhancedRandom stringDeserialize(String data, com.github.tommyettinger.digital.Base base)
      Given a String in the format produced by stringSerialize(Base), and the same Base used by the serialization, this will attempt to set this EnhancedRandom object to match the state in the serialized data. This only works if this EnhancedRandom is the same implementation that was serialized, and also needs the Bases to be identical. Returns this EnhancedRandom, after possibly changing its state.
      Parameters:
      data - a String probably produced by stringSerialize(Base)
      base - which Base to use, from the "digital" library, such as Base.BASE10
      Returns:
      this, after setting its state
    • writeExternal

      public void writeExternal(ObjectOutput out) throws IOException
      The object implements the writeExternal method to save its contents by calling the methods of DataOutput for its primitive values or calling the writeObject method of ObjectOutput for objects, strings, and arrays.
      Specified by:
      writeExternal in interface Externalizable
      Parameters:
      out - the stream to write the object to
      Throws:
      IOException - Includes any I/O exceptions that may occur
    • readExternal

      public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
      The object implements the readExternal method to restore its contents by calling the methods of DataInput for primitive types and readObject for objects, strings and arrays. The readExternal method must read the values in the same sequence and with the same types as were written by writeExternal.
      Specified by:
      readExternal in interface Externalizable
      Parameters:
      in - the stream to read data from in order to restore the object
      Throws:
      IOException - if I/O errors occur
      ClassNotFoundException