#pragma once struct RandomGenerator { float getRand() { return 2.0f * ( genFloat() - 0.5f ); } float getRand( float a, float b ) { return genFloat( a, b ); } int getRandInt( int a, int b ) { return genInteger( a, b ); } enum RandConstants { KK = 17, JJ = 10, R1 = 13, R2 = 9 }; int g_iP1; int g_iP2; unsigned g_u32Buffer[ KK ]; float genFloat() { unsigned int u32Tmp; // nächste Zahl u32Tmp= _lrotl( g_u32Buffer[ g_iP2 ], R1 ) + _lrotl( g_u32Buffer[ g_iP1 ], R2 ); g_u32Buffer[ g_iP1 ]= u32Tmp; // Listen rotieren g_iP1--; if ( g_iP1 < 0 ) { g_iP1 = KK - 1; } g_iP2--; if ( g_iP2 < 0 ) { g_iP2 = KK - 1; } // conversion to float: union { double f; unsigned long i[2]; } convert; convert.i[0] = u32Tmp << 20; convert.i[1] = ( u32Tmp >> 12 ) | 0x3FF00000; return (float)( convert.f - 1.0f ); } unsigned int getLastTempValue() { return g_u32Buffer[ g_iP1 ]; } void setSeed( unsigned int Seed ) { int i; // Buffer füllen for( i= 0; i < KK; i++ ) { Seed= Seed * 2891336453 + 1; g_u32Buffer[ i ] = Seed; } // Pointer initialisieren g_iP1= 0; g_iP2= JJ; // Anfang der Folge wegwerfen for( i= 0; i < 9; i++ ) { genFloat(); } } int genInteger( int iMin, int iMax ) { float fInterval = (float)( iMax - iMin ) + 0.96875f; float fRet= fInterval * genFloat(); fRet+= (float)iMin; int iRet= (int)( fRet - 0.484375f ); //int iRet= (int)( fRet ); assert( iRet >= iMin ); assert( iRet <= iMax ); return iRet; } float genFloat( float fMin, float fMax ) { float fInterval = (float)( fMax - fMin ); return fMin + fInterval * genFloat(); } };