113 lines
1.7 KiB
C
113 lines
1.7 KiB
C
#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();
|
|
}
|
|
};
|