Class RandomBaseCAS
- java.lang.Object
-
- java.util.Random
-
- com.github.kilianB.pcg.RandomBase64
-
- com.github.kilianB.pcg.cas.RandomBaseCAS
-
- All Implemented Interfaces:
Pcg,java.io.Serializable
public abstract class RandomBaseCAS extends RandomBase64 implements Pcg
Base class for 64 bit state pcg random number generators. The PCG family uses a linear congruential generator as the state-transition function—the “CG” of PCG stands for “congruential generator”. Linear congruential generators are known to be statistically weak.PCG uses a new technique called permutation functions on tuples to produce output that is much more random than the RNG's internal state. The output function is defined by the extending classes. A paper highlighting the individual properties can be found here. http://www.pcg-random.org/paper.html. This class is an adaption to the original c source code provided by M.E. O'Neill. Contract: every extending class must implement the (long,long,boolean) constructor and pass it's argument to the superclass. This constructor functions as copy constructor and blindly passes the arguments on. As it does not perform proper initialization of the seed this method should not be exposed.
- Author:
- Kilian
- See Also:
- www.pcg-random.org, Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected longincStream number of the rng.protected longmult64linear congruential constant.protected java.util.concurrent.atomic.AtomicLongstate64 bit internal state-
Fields inherited from class com.github.kilianB.pcg.RandomBase64
MULT_64
-
Fields inherited from interface com.github.kilianB.pcg.Pcg
UNIQUE_SEED
-
-
Constructor Summary
Constructors Modifier Constructor Description RandomBaseCAS()Seeds the generator with 2 longs generated by xorshift*.RandomBaseCAS(long seed, long streamNumber)Create a random number generator with the given seed and stream number.protectedRandomBaseCAS(long initialState, long increment, boolean dummy)Deprecated.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidadvance(long steps)Advance or set back the rngs state.longgetInc()Returns the internal increment of the congurential generator used by this pcgprotected abstract intgetInt(long state)Construct a 32bit int from the given 64bit state using a permutation function.longgetState()Returns the internal state of the congruential generator used by this pcgbooleanisFast()Return true if this rng is a fast instance.protected voidsetInc(long increment)Set the increment of the pcg.protected voidsetState(long initialState)Set the internal state of the pcg.protected longstepRight()Update the state of the lcg and move a step forward.-
Methods inherited from class com.github.kilianB.pcg.RandomBase64
getMult, getRandomSeed, next, nextBoolean, nextByte, nextBytes, nextChar, nextDouble, nextFloat, nextInt, nextLong, nextLong, nextShort, setSeed, setSeed, split, splitDistinct
-
Methods inherited from class java.util.Random
doubles, doubles, doubles, doubles, ints, ints, ints, ints, longs, longs, longs, longs, nextBoolean, nextDouble, nextFloat, nextGaussian, nextInt
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface com.github.kilianB.pcg.Pcg
distance, distanceUnsafe, getMult, next, nextBoolean, nextBoolean, nextByte, nextBytes, nextChar, nextDouble, nextDouble, nextFloat, nextFloat, nextGaussian, nextInt, nextInt, nextLong, nextLong, nextShort, split, splitDistinct
-
-
-
-
Constructor Detail
-
RandomBaseCAS
public RandomBaseCAS()
Seeds the generator with 2 longs generated by xorshift*. The values choosen are very likely not used in any other invocation of this constructor.
-
RandomBaseCAS
public RandomBaseCAS(long seed, long streamNumber)Create a random number generator with the given seed and stream number. The seed defines the current state in which the rng is in and corresponds to seeds usually found in other RNG implementations. RNGs with different seeds are able to catch up after they exhaust their period and produce the same numbers.Different stream numbers alter the increment of the rng and ensure distinct state sequences
Only generators with the same seed AND stream numbers will produce identical values
- Parameters:
seed- used to compute the starting state of the RNGstreamNumber- used to compute the increment for the lcg.
-
RandomBaseCAS
@Deprecated protected RandomBaseCAS(long initialState, long increment, boolean dummy)Deprecated.Copy constructor. Has to be implemented in all inheriting instances. This will be invoked through reflection!. If no special behavior is desired simply pass though the values.- Parameters:
initialState- of the lcgincrement- used in the lcg. has to be odddummy- used to resolve signature disambiguate
-
-
Method Detail
-
stepRight
protected long stepRight()
Update the state of the lcg and move a step forward. The old state should be used to extract bits used to construct a number.- Specified by:
stepRightin classRandomBase64- Returns:
- the old value of the state variable before updating.
-
advance
public void advance(long steps)
Advance or set back the rngs state. In other words fast skip the next n generated random numbers or set the PNG back so it will create the last n numbers in the same sequence again.int x = nextInt(); nextInt(); nextInt(); step(-3); int y = nextInt(); x == y TRUEBe aware that this relationship is only true for deterministic generation calls.Random.nextGaussian()or any bound limited number generations might loop and consume more than one step to generate a number.To advance n steps the function performs
Math.ceil( log2(n) )iterations. So you may go ahead and skip as many steps as you like without any performance implications.Negative indices can be used to jump backwards in time going the long way around
-
getInt
protected abstract int getInt(long state)
Construct a 32bit int from the given 64bit state using a permutation function. The produced int will be used to construct all other datatypes returned by this RNG.- Specified by:
getIntin classRandomBase64- Parameters:
state- random int as produced by the internal lcg- Returns:
- a random int
-
isFast
public boolean isFast()
Return true if this rng is a fast instance. This check is mostly used int he distance calculation due to the fact that the state of fast RNGs is shifted by one. They first calculate a new value and directly use it instead of using the old state and calculating a new one
-
getState
public long getState()
Description copied from interface:PcgReturns the internal state of the congruential generator used by this pcg
-
getInc
public long getInc()
Description copied from interface:PcgReturns the internal increment of the congurential generator used by this pcg
-
setInc
protected void setInc(long increment)
Description copied from class:RandomBase64Set the increment of the pcg. This method is used during the seeding process of this class and therefore, it is most likely is never correct to alter the variable passed to this function."Although there are rules for the choice of constants [17], if we pick a power-of-two modulus and a good multiplicative constant, the only constraint on c for a full period generator is that c is odd and > 0"
Chapter 4.2.1 (http://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf)
Allowed operations are synchronization on those methods-
- Specified by:
setIncin classRandomBase64- Parameters:
increment- of the pcg
-
setState
protected void setState(long initialState)
Description copied from class:RandomBase64Set the internal state of the pcg. This method is used during the seeding process of this class and therefore, it is most likely is never correct to alter the variable passed to this function.Allowed operations are synchronization on those methods-
- Specified by:
setStatein classRandomBase64- Parameters:
initialState- of the pcg
-
-