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.