#pragma once

#include "Betriebssystem.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class Datei;

    class RandomGenerator : public virtual ReferenceCounter
    {
    private:
        struct random_data
        {
            int *fptr;		/* Front pointer.  */
            int *rptr;		/* Rear pointer.  */
            int *state;		/* Array of state values.  */
            int rand_type;		/* Type of random number generator.  */
            int rand_deg;		/* Degree of random number generator.  */
            int rand_sep;		/* Distance between front and rear.  */
            int *end_ptr;		/* Pointer behind state table.  */
        };

        int randtbl[ 32 ];
        random_data unsafe_state;
        int seed;
        int offset;

        void srand( int seed );

    public:
        //! Konstruktor
        //! Erzeugt einen neuen Zufallsgenerator mit dem seed des Zeitpunktes des Erzeugens
        DLLEXPORT RandomGenerator();
        //! Destruktor
        DLLEXPORT ~RandomGenerator();
        //! Gibt eine Zufallszahl zwischen 0 und 1 zurück
        DLLEXPORT double rand();
        //! Initialisiert den Gennerator mit einem Seed.
        //! Diese methode sollte möglichst nur mit seeds verwendet werden, die von getSeed zurückgegeben wurden, da der aufruf sonnst sehr lange dauern kann
        DLLEXPORT void setSeed( __int64 seed );
        //! Gibt den aktuellen Seed zurück, mit dem alle weiteren Zufallszahlen vorherbestimmt werden können
        DLLEXPORT __int64 getSeed() const;
    };
}