replace rand

This commit is contained in:
Glenn Maynard
2004-10-07 04:10:45 +00:00
parent 8846c1ad3c
commit ada4232495
2 changed files with 33 additions and 19 deletions
+26 -3
View File
@@ -11,7 +11,31 @@
#include <sys/types.h>
#include <sys/stat.h>
unsigned long randseed = time(NULL);
int randseed = time(NULL);
// From "Numerical Recipes in C".
float RandomFloat( int &seed )
{
const int MASK = 123459876;
seed ^= MASK;
const int IA = 16807;
const int IM = 2147483647;
const int IQ = 127773;
const int IR = 2836;
long k = seed / IQ;
seed = IA*(seed-k*IQ)-IR*k;
if( seed < 0 )
seed += IM;
const float AM = .999999f / IM;
float ans = AM * seed;
seed ^= MASK;
return ans;
}
RandomGen::RandomGen( unsigned long seed_ )
{
@@ -22,8 +46,7 @@ RandomGen::RandomGen( unsigned long seed_ )
int RandomGen::operator() ( int maximum )
{
seed = 1664525L * seed + 1013904223L;
return (seed >> 2) % maximum;
return int(RandomFloat( seed ) * maximum);
}
+7 -16
View File
@@ -112,40 +112,31 @@ inline uint32_t Swap24LE( uint32_t n ) { return Swap24( n ); }
inline uint16_t Swap16LE( uint16_t n ) { return Swap16( n ); }
#endif
// Fast random number generators
// Taken from "Numerical Recipes in C"
extern int randseed;
extern unsigned long randseed;
inline unsigned long Random()
{
randseed = 1664525L * randseed + 1013904223L;
return randseed;
}
float RandomFloat( int &seed );
inline float RandomFloat()
{
randseed = 1664525L * randseed + 1013904223L;
unsigned long itemp = 0x3f800000 | (0x007fffff & randseed);
return (*(float *)&itemp) - 1.0f;
return RandomFloat( randseed );
}
// Returns a float between dLow and dHigh inclusive
inline float RandomFloat(float fLow, float fHigh)
{
return RandomFloat() * (fHigh - fLow) + fLow;
return SCALE( RandomFloat(), 0.0f, 1.0f, fLow, fHigh );
}
// Returns an integer between nLow and nHigh inclusive
inline int RandomInt(int nLow, int nHigh)
{
return ((Random() >> 2) % (nHigh - nLow + 1)) + nLow;
return int( RandomFloat() * (nHigh - nLow + 1) + nLow );
}
/* Alternative: */
class RandomGen
{
unsigned long seed;
int seed;
public:
RandomGen( unsigned long seed = 0 );
@@ -156,7 +147,7 @@ public:
// Simple function for generating random numbers
inline float randomf( const float low=-1.0f, const float high=1.0f )
{
return low + ( high - low ) * ( (float)rand() ) / RAND_MAX;
return RandomFloat( low, high );
}
inline float froundf( const float f, const float fRoundInterval )