#include "Random.h" static const int A = 48271; static const int M = 2147483647; static const int Q = M / A; static const int R = M % A; /** * Construct with initialValue for the state. */ Random::Random( int initialValue ) { if( initialValue < 0 ) initialValue += M; state = initialValue; if( state == 0 ) state = 1; } /** * Return a pseudorandom int, and change the * internal state. */ int Random::randomInt( ) { int tmpState = A * ( state % Q ) - R * ( state / Q ); if( tmpState >= 0 ) state = tmpState; else state = tmpState + M; return state; } /** * Return a pseudorandom int, and change the * internal state. DOES NOT WORK. */ int Random::randomIntWRONG( ) { return state = ( A * state ) % M; } /** * Return a pseudorandom double in the open range 0..1 * and change the internal state. */ double Random::random0_1( ) { return (double) randomInt( ) / M; } /** * Return an int in the closed range [low,high], and * change the internal state. */ int Random::randomInt( int low, int high ) { double partitionSize = (double) M / ( high - low + 1 ); return (int) ( randomInt( ) / partitionSize ) + low; }