2121"""
2222
2323#=============================================================================
24- from .baserandom import BaseRandom
24+ from .baserandom import BaseRandom
25+ from .annotation_types import Numerical
2526
2627
2728#=============================================================================
@@ -37,12 +38,12 @@ class BaseLCG( BaseRandom ):
3738
3839 x(i-1): x(i) = (a*x(i-1) + c) mod m
3940
40- Results are nevertheless considered to be poor as stated in the
41- evaluation done by Pierre L'Ecuyer and Richard Simard (Universite de
42- Montreal) in 'TestU01: A C Library for Empirical Testing of Random Number
43- Generators - ACM Transactions on Mathematical Software, vol.33 n.4,
44- pp.22-40, August 2007'. It is not recommended to use such pseudo-random
45- numbers generators for serious simulation applications.
41+ Results are nevertheless considered to be poor as stated in the evaluation
42+ done by Pierre L'Ecuyer and Richard Simard (Universite de Montreal) in
43+ 'TestU01: A C Library for Empirical Testing of Random Number Generators -
44+ ACM Transactions on Mathematical Software, vol.33 n.4, pp.22-40, August
45+ 2007'. It is not recommended to use such pseudo-random numbers generators
46+ for serious simulation applications.
4647
4748 See FastRand32 for a 2^32 (i.e. 4.3e+9) period LC-Generator with very low
4849 computation time but shorter period and worse randomness characteristics
@@ -52,73 +53,52 @@ class BaseLCG( BaseRandom ):
5253 characteristics than for FastRand32.
5354
5455 Furthermore this class is callable:
55- rand = BaseLCG()
56- print( rand() ) # prints a pseudo-random value within [0.0, 1.0)
57- print( rand(a) ) # prints a pseudo-random value within [0.0, a)
58- print( rand(a,b ) ) # prints a pseudo-random value within [a , b )
56+ rand = BaseLCG() # Caution: this is just used as illustrative. This base class cannot be instantiated
57+ print( rand() ) # prints a pseudo-random value within [0.0, 1.0)
58+ print( rand(a) ) # prints a pseudo-random value within [0, a) or [0 .0, a) depending on the type of a
59+ print( rand(a, n ) ) # prints a list of n pseudo-random values each within [0, a )
5960
6061 Reminder:
6162 We give you here below a copy of the table of tests for the LCGs that have
6263 been implemented in PyRandLib, as provided in paper "TestU01, ..." - see
6364 file README.md.
6465
65- | PyRabndLib class | TU01 generator name | Memory Usage | Period | time-32bits | time-64 bits | SmallCrush fails | Crush fails | BigCrush fails |
66- | ---------------- | ---------------------------------- | --------------- | ------- | ----------- | ------------ | ---------------- | ----------- | -------------- |
67- | FastRand32 | LCG(2^32, 69069, 1) | 1 x 4-bytes | 2^32 | 3.20 | 0.67 | 11 | 106 | *too many* |
68- | FastRand63 | LCG(2^63, 9219741426499971445, 1) | 2 x 4-bytes | 2^63 | 4.20 | 0.75 | 0 | 5 | 7 |
66+ | PyRandLib class | TU01 generator name | Memory Usage | Period | time-32bits | time-64 bits | SmallCrush fails | Crush fails | BigCrush fails |
67+ | --------------- | ---------------------------------- | --------------- | ------- | ----------- | ------------ | ---------------- | ----------- | -------------- |
68+ | FastRand32 | LCG(2^32, 69069, 1) | 1 x 4-bytes | 2^32 | 3.20 | 0.67 | 11 | 106 | *too many* |
69+ | FastRand63 | LCG(2^63, 9219741426499971445, 1) | 2 x 4-bytes | 2^63 | 4.20 | 0.75 | 0 | 5 | 7 |
6970
7071 * _small crush_ is a small set of simple tests that quickly tests some of
71- the expected characteristics for a pretty good PRG ;
72+ the expected characteristics for a pretty good PRNG ;
7273 * _crush_ is a bigger set of tests that test more deeply expected random
7374 characteristics;
74- * _big crush_ is the ultimate set of difficult tests that any GOOD PRG
75+ * _big crush_ is the ultimate set of difficult tests that any GOOD PRNG
7576 should definitively pass.
7677 """
7778
78- #------------------------------------------------------------------------=
79- def __init__ (self , _seedState : int = None ) -> None :
79+ #-------------------------------------------------------------------------
80+ def __init__ (self , _seedState : Numerical = None ) -> None :
8081 """Constructor.
8182
82- Should inSeed be None or not an integer then the local
83- time is used (with its shuffled value) as a seed.
83+ Should _seedState be None then the local time is used as a seed (with
84+ its shuffled value).
85+ Notice: method setstate() is not implemented in base class BaseRandom.
86+ So, it must be implemented in classes inheriting BaseLCG and it must
87+ initialize attribute self._state.
8488 """
85- super ().__init__ ( _seedState ) # this call creates attribute self._value and sets it
89+ super ().__init__ ( _seedState ) # this internally calls 'setstate()' which
90+ # MUST be implemented in inheriting classes
8691
8792
88- #------------------------------------------------------------------------=
89- def random (self ) -> float :
90- """This is the core of the pseudo-random generator.
91-
92- Returned values are within [0.0, 1.0).
93- Inheriting classes HAVE TO IMPLEMENT this method - see FastRand32
94- for an example. It should use and initialize attribute self._value.
95- """
96- raise NotImplementedError ()
97-
98-
99- #------------------------------------------------------------------------=
93+ #-------------------------------------------------------------------------
10094 def getstate (self ) -> int :
10195 """Returns an object capturing the current internal state of the generator.
10296
10397 This object can be passed to setstate() to restore the state.
104- For LCG, the state is defined with a single integer, 'self._value ',
105- which has to be used in methods 'random () and 'setstate() of every
98+ For LCG, the state is defined with a single integer, 'self._state ',
99+ which has to be used in methods 'next () and 'setstate() of every
106100 inheriting class.
107101 """
108- return self ._value
109-
110-
111- #------------------------------------------------------------------------=
112- def setstate (self , _state : int ) -> None :
113- """Restores the internal state of the generator.
114-
115- _state should have been obtained from a previous call to getstate(),
116- and setstate() restores the internal state of the generator to what
117- it was at the time setstate() was called.
118- Inheriting classes HAVE TO IMPLEMENT this method - see FastRand32
119- for an example. It should initialize attribute self._value.
120- """
121- raise NotImplementedError ()
122-
102+ return self ._state
123103
124104#===== end of module baselcg.py ========================================
0 commit comments