port from perforce
This commit is contained in:
112
evoke-64k/ev10/random.h
Normal file
112
evoke-64k/ev10/random.h
Normal file
@@ -0,0 +1,112 @@
|
||||
#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();
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user