Source Code (Use browser search to find items of interest.)
Class Index
kdelibs'KRandomSequence (./kdelibs/kdecore/krandomsequence.h:37)
class KRandomSequence
{
public:
/**
* Creates a pseudo-random sequence based on the seed lngSeed.
*
* @param lngSeed Seed to initialize the sequence with.
*
* If lngSeed is 0, the sequence is initialized with a value from
* kapp->random().
*
* A Pseudo-random sequence is different for each seed but can be
* reproduced by starting the sequence with the same seed.
*
* If you need a single value which needs to be unpredictable,
* you need to use kapp->random() instead.
*
*/
KRandomSequence( long lngSeed = 0 );
/**
* Standard destructor
*/
virtual ~KRandomSequence();
/**
* Restart the sequence based on lngSeed
*/
void setSeed( long lngSeed = 1 );
/**
* Get the next number from the pseudo-random sequence
*
* @return a psuedo-random double value between [0,1[
*/
double getDouble();
/**
* Get the next number from the pseudo-random sequence
*
* @return a pseudo-random integer value between [0, max[
* with 0 < max <= 1.000.000
*/
unsigned long getLong(unsigned long max);
private:
void Draw(); // Generate the random number
long m_lngSeed1;
long m_lngSeed2;
long m_lngShufflePos;
static const int m_nShuffleTableSize;
long *m_ShuffleArray;
KRandomSequencePrivate *d;
};
kdelibs'KRandomSequence::KRandomSequence() (./kdelibs/kdecore/krandomsequence.cpp:30)
KRandomSequence::KRandomSequence( long lngSeed1 )
{
// Seed the generator
setSeed( lngSeed1 );
// Set the size of the shuffle table
m_ShuffleArray = new long [m_nShuffleTableSize];
}
kdelibs'KRandomSequence::~KRandomSequence() (./kdelibs/kdecore/krandomsequence.cpp:40)
KRandomSequence::~KRandomSequence()
{
delete [] m_ShuffleArray;
}
//////////////////////////////////////////////////////////////////////////////
// Member Functions
//////////////////////////////////////////////////////////////////////////////
kdelibs'KRandomSequence::setSeed() (./kdelibs/kdecore/krandomsequence.cpp:50)
void KRandomSequence::setSeed( long lngSeed1 )
{
// Convert the positive seed number to a negative one so that the Draw()
// function can intialise itself the first time it is called. We just have
// to make sure that the seed used != 0 as zero perpetuates itself in a
// sequence of random numbers.
if ( lngSeed1 < 0 )
{
m_lngSeed1 = -1;
}
else if (lngSeed1 == 0)
{
m_lngSeed1 = -KApplication::random();
}
else
{
m_lngSeed1 = -lngSeed1;
}
}
kdelibs'KRandomSequence::Draw() (./kdelibs/kdecore/krandomsequence.cpp:73)
void KRandomSequence::Draw()
{
static const long sMM1 = sMod1 - 1;
static const long sA1 = 40014;
static const long sA2 = 40692;
static const long sQ1 = 53668;
static const long sQ2 = 52774;
static const long sR1 = 12211;
static const long sR2 = 3791;
static const long sDiv = 1 + sMM1 / m_nShuffleTableSize;
// Long period (>2 * 10^18) random number generator of L'Ecuyer with
// Bayes-Durham shuffle and added safeguards. Returns a uniform random
// deviate between 0.0 and 1.0 (exclusive of the endpoint values). Call
// with a negative number to initialize; thereafter, do not alter idum
// between successive deviates in a sequence. RNMX should approximate
// the largest floating point value that is less than 1.
int j; // Index for the shuffle table
long k;
// Initialise
if ( m_lngSeed1 <= 0 )
{
m_lngSeed2 = m_lngSeed1;
// Load the shuffle table after 8 warm-ups
for ( j = m_nShuffleTableSize + 7; j >= 0; j-- )
{
k = m_lngSeed1 / sQ1;
m_lngSeed1 = sA1 * ( m_lngSeed1 - k*sQ1) - k*sR1;
if ( m_lngSeed1 < 0 )
{
m_lngSeed1 += sMod1;
}
if ( j < m_nShuffleTableSize )
{
m_ShuffleArray[j] = m_lngSeed1;
}
}
m_lngShufflePos = m_ShuffleArray[0];
}
// Start here when not initializing
// Compute m_lngSeed1 = ( lngIA1*m_lngSeed1 ) % lngIM1 without overflows
// by Schrage's method
k = m_lngSeed1 / sQ1;
m_lngSeed1 = sA1 * ( m_lngSeed1 - k*sQ1 ) - k*sR1;
if ( m_lngSeed1 < 0 )
{
m_lngSeed1 += sMod1;
}
// Compute m_lngSeed2 = ( lngIA2*m_lngSeed2 ) % lngIM2 without overflows
// by Schrage's method
k = m_lngSeed2 / sQ2;
m_lngSeed2 = sA2 * ( m_lngSeed2 - k*sQ2 ) - k*sR2;
if ( m_lngSeed2 < 0 )
{
m_lngSeed2 += sMod2;
}
j = m_lngShufflePos / sDiv;
m_lngShufflePos = m_ShuffleArray[j] - m_lngSeed2;
m_ShuffleArray[j] = m_lngSeed1;
if ( m_lngShufflePos < 1 )
{
m_lngShufflePos += sMM1;
}
}
double
kdelibs'KRandomSequence::getDouble() (./kdelibs/kdecore/krandomsequence.cpp:149)
KRandomSequence::getDouble()
{
static const double finalAmp = 1.0 / double( sMod1 );
static const double epsilon = 1.2E-7;
static const double maxRand = 1.0 - epsilon;
double temp;
Draw();
// Return a value that is not one of the endpoints
if ( ( temp = finalAmp * m_lngShufflePos ) > maxRand )
{
// We don't want to return 1.0
return maxRand;
}
else
{
return temp;
}
}
unsigned long
kdelibs'KRandomSequence::getLong() (./kdelibs/kdecore/krandomsequence.cpp:169)
KRandomSequence::getLong(unsigned long max)
{
Draw();
return (((unsigned long) m_lngShufflePos) % max);
}