Files
bluflame/evoke-64k/trunk/ev10/random.h
2026-04-18 22:31:51 +02:00

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();
}
};