23#include "krandomsequence.h"
24#include "tdeapplication.h"
26const int KRandomSequence::m_nShuffleTableSize = 32;
39 m_ShuffleArray =
new long [m_nShuffleTableSize];
44 delete [] m_ShuffleArray;
50 m_ShuffleArray =
new long [m_nShuffleTableSize];
57 m_lngSeed1 = a.m_lngSeed1;
58 m_lngSeed2 = a.m_lngSeed2;
59 m_lngShufflePos = a.m_lngShufflePos;
60 memcpy(m_ShuffleArray, a.m_ShuffleArray,
sizeof(
long)*m_nShuffleTableSize);
79 else if (lngSeed1 == 0)
85 m_lngSeed1 = -lngSeed1;
89static const long sMod1 = 2147483563;
90static const long sMod2 = 2147483399;
92void KRandomSequence::Draw()
94 static const long sMM1 = sMod1 - 1;
95 static const long sA1 = 40014;
96 static const long sA2 = 40692;
97 static const long sQ1 = 53668;
98 static const long sQ2 = 52774;
99 static const long sR1 = 12211;
100 static const long sR2 = 3791;
101 static const long sDiv = 1 + sMM1 / m_nShuffleTableSize;
114 if ( m_lngSeed1 <= 0 )
116 m_lngSeed2 = m_lngSeed1;
119 for ( j = m_nShuffleTableSize + 7; j >= 0; j-- )
121 k = m_lngSeed1 / sQ1;
122 m_lngSeed1 = sA1 * ( m_lngSeed1 - k*sQ1) - k*sR1;
123 if ( m_lngSeed1 < 0 )
128 if ( j < m_nShuffleTableSize )
130 m_ShuffleArray[j] = m_lngSeed1;
134 m_lngShufflePos = m_ShuffleArray[0];
141 k = m_lngSeed1 / sQ1;
142 m_lngSeed1 = sA1 * ( m_lngSeed1 - k*sQ1 ) - k*sR1;
143 if ( m_lngSeed1 < 0 )
150 k = m_lngSeed2 / sQ2;
151 m_lngSeed2 = sA2 * ( m_lngSeed2 - k*sQ2 ) - k*sR2;
152 if ( m_lngSeed2 < 0 )
157 j = m_lngShufflePos / sDiv;
158 m_lngShufflePos = m_ShuffleArray[j] - m_lngSeed2;
159 m_ShuffleArray[j] = m_lngSeed1;
161 if ( m_lngShufflePos < 1 )
163 m_lngShufflePos += sMM1;
171 if ( m_lngSeed2 < 0 )
173 m_lngShufflePos += sMod2;
177 if ( m_lngSeed1 < 0 )
187 static const double finalAmp = 1.0 / double( sMod1 );
188 static const double epsilon = 1.2E-7;
189 static const double maxRand = 1.0 - epsilon;
193 if ( ( temp = finalAmp * m_lngShufflePos ) > maxRand )
209 return max ? (((
unsigned long) m_lngShufflePos) % max) : 0;
217 return (((
unsigned long) m_lngShufflePos) & 1);
220class KRandomSequenceList :
public TQGList
224 KRandomSequenceList() : TQGList() { }
225 virtual void deleteItem( TQPtrCollection::Item ) {}
231 KRandomSequenceList *list = (KRandomSequenceList *)_list;
232 KRandomSequenceList l;
234 l.append(list->takeFirst());
236 list->append(l.takeFirst());
238 list->insertAt(
getLong(list->count()+1), l.takeFirst());
A class to create a pseudo-random sequence.
KRandomSequence & operator=(const KRandomSequence &a)
Assignment.
virtual ~KRandomSequence()
Standard destructor.
KRandomSequence(long lngSeed=0)
Creates a pseudo-random sequence based on the seed lngSeed.
unsigned long getLong(unsigned long max)
Get the next number from the pseudo-random sequence.
double getDouble()
Get the next number from the pseudo-random sequence.
void modulate(int i)
Modulate the random sequence.
void randomize(TQGList *list)
Put a list in random order.
void setSeed(long lngSeed=0)
Restart the sequence based on lngSeed.
bool getBool()
Get a boolean from the pseudo-random sequence.
static int random()
Generates a uniform random number.