108 lines
2.6 KiB
Python
108 lines
2.6 KiB
Python
__author__ = "Lukas Mahler"
|
|
__version__ = "1.0.0"
|
|
__date__ = "12.07.2023"
|
|
__email__ = "m@hler.eu"
|
|
__status__ = "Production"
|
|
|
|
import math
|
|
|
|
|
|
class RandomNumberGenerator:
|
|
"""
|
|
Initializes a RandomNumberGenerator object.
|
|
|
|
The RandomNumberGenerator uses the parameters IA, IM, IQ, IR, NTAB, AM, and RNMX
|
|
to generate random numbers based on a seed value.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.mIdum = 0
|
|
self.mIy = 0
|
|
|
|
self.NTAB = 32
|
|
self.mIv = [0] * self.NTAB # Initialize mIv with zeros
|
|
|
|
self.IA = 16807
|
|
self.IM = 2147483647
|
|
self.IQ = 127773
|
|
self.IR = 2836
|
|
self.NDIV = 1 + (self.IM - 1) // self.NTAB
|
|
self.AM = 1.0 / self.IM
|
|
self.RNMX = 1.0 - 1.2e-7
|
|
|
|
def set_seed(self, seed):
|
|
"""
|
|
Sets the seed value for the random number generator.
|
|
|
|
:param seed: The seed value to initialize the random number generator.
|
|
:type seed: int
|
|
"""
|
|
|
|
self.mIdum = seed
|
|
|
|
if seed >= 0:
|
|
self.mIdum = -seed
|
|
|
|
self.mIy = 0
|
|
|
|
def random_number(self):
|
|
"""
|
|
Generates a random integer using the current seed value.
|
|
|
|
:return: A random integer value.
|
|
:rtype: int
|
|
"""
|
|
|
|
if self.mIdum <= 0 or self.mIy == 0:
|
|
if -self.mIdum < 1:
|
|
self.mIdum = 1
|
|
else:
|
|
self.mIdum = -self.mIdum
|
|
|
|
for j in range(self.NTAB + 7, -1, -1):
|
|
k = self.mIdum // self.IQ
|
|
self.mIdum = self.IA * (self.mIdum - k * self.IQ) - self.IR * k
|
|
|
|
if self.mIdum < 0:
|
|
self.mIdum += self.IM
|
|
|
|
if j < self.NTAB:
|
|
self.mIv[j] = self.mIdum
|
|
|
|
self.mIy = self.mIv[0]
|
|
|
|
k = self.mIdum // self.IQ
|
|
self.mIdum = self.IA * (self.mIdum - k * self.IQ) - self.IR * k
|
|
|
|
if self.mIdum < 0:
|
|
self.mIdum += self.IM
|
|
|
|
j = self.mIy // self.NDIV
|
|
self.mIy = self.mIv[j]
|
|
self.mIv[j] = self.mIdum
|
|
|
|
return self.mIy
|
|
|
|
def random_float(self, low, high):
|
|
"""
|
|
Generates a random float between the given low and high values.
|
|
|
|
:param low: The lower bound of the random float.
|
|
:type low: float
|
|
:param high: The upper bound of the random float.
|
|
:type high: float
|
|
:return: A random float value between low and high (inclusive).
|
|
:rtype: float
|
|
"""
|
|
|
|
float_val = self.AM * self.random_number()
|
|
|
|
if float_val > self.RNMX:
|
|
float_val = self.RNMX
|
|
|
|
return (float_val * (high - low)) + low
|
|
|
|
|
|
if __name__ == '__main__':
|
|
exit(1)
|