__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)