From ada4232495b9cab64ef1728cc91dcb0b3108a6d0 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 7 Oct 2004 04:10:45 +0000 Subject: [PATCH] replace rand --- stepmania/src/RageUtil.cpp | 29 ++++++++++++++++++++++++++--- stepmania/src/RageUtil.h | 23 +++++++---------------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/stepmania/src/RageUtil.cpp b/stepmania/src/RageUtil.cpp index 8bfce9c25a..e0f2091861 100644 --- a/stepmania/src/RageUtil.cpp +++ b/stepmania/src/RageUtil.cpp @@ -11,7 +11,31 @@ #include #include -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); } diff --git a/stepmania/src/RageUtil.h b/stepmania/src/RageUtil.h index dd61058f81..9806f9ca3f 100644 --- a/stepmania/src/RageUtil.h +++ b/stepmania/src/RageUtil.h @@ -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 )