Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/DataType/Sort/Random.cpp

Go to the documentation of this file.
00001 // Random.cpp - Implementation of Randomize number
00002 //              generations and verification algorithm.
00003 
00004 #ifndef __J2K__Sort__Random_CPP__
00005 #define __J2K__Sort__Random_CPP__
00006 
00007 #include <j2k/DataType/Sort/Random.hpp>
00008 
00009 Random::Random() 
00010 : maximum( RAND_MAX )
00011 {
00012   Randomize();
00013   Resize( 256 );
00014 }
00015 
00016 Random::Random( const ULONG Size )
00017 : maximum( Size )
00018 {
00019   Randomize();
00020   Resize( Size );
00021 }
00022 
00023 Random::Random( const ULONG Size, const ULONG Max )
00024 : maximum( Max )
00025 {
00026   Randomize();
00027   Resize( Size );
00028 }
00029 
00030 Random::Random( const ULONG Size, const ULONG Max, const UINT value )
00031 : maximum( Max )
00032 {
00033   Randomize( value );
00034   Resize( Size );
00035 }
00036 
00037 Random::Random( const Random& r )   // Copy Constructor
00038  : maximum( r.maximum ),
00039    size(    r.size )
00040 {
00041   Randomize( r.seed );
00042 
00043   Resize( size );
00044 
00045   for( register size_t i = 0; i < size; i++ ) 
00046   {
00047     array[i]       = r.array[i];
00048     arrayBackup[i] = r.arrayBackup[i];
00049   }
00050 }
00051 
00052 Random::~Random() 
00053 {
00054 //  Clear();
00055 }
00056 
00057 void Random::Clear() 
00058 {
00059   if ( filled == false )  return;
00060 
00061   if ( array != NULL )
00062   {    
00063     delete[]  array;
00064   }
00065 
00066   if ( arrayBackup != NULL )
00067   {  
00068     delete[]  arrayBackup;
00069   }
00070 
00071   filled = false;
00072 }
00073 
00074 void Random::Resize( const ULONG Size )
00075 {
00076   if ( filled == true )
00077   {
00078     Clear();
00079   }
00080 
00081   size        = Size;
00082   array       = new Elem[ size ];
00083   arrayBackup = new Elem[ size ];
00084   filled      = true;
00085 }
00086 
00087 void Random::Backup() 
00088 {
00089   for( register size_t i = 0; i < size; i++ ) 
00090   {
00091     arrayBackup[i] = array[i];
00092   }
00093 }
00094 
00095 void Random::Restore() 
00096 {
00097   for( register size_t i = 0; i < size; i++ ) 
00098   {
00099     array[i] = arrayBackup[i];
00100   }
00101 }
00102 
00103 void Random::feed() 
00104 {
00105   feed( false );
00106 }
00107 
00108 void Random::feedUp() 
00109 {
00110   feedUp( false );
00111 }
00112 
00113 void Random::feedDown() 
00114 {
00115   feedDown( false );
00116 }
00117 
00118 void Random::feedValue( Elem value )
00119 {
00120   feedValue( false, value );
00121 }
00122 
00123 void Random::feed( BOOL keepBackup )
00124 {
00125   init();
00126 
00127   for( register size_t i = 0; i < size; i++ ) 
00128   {
00129     array[i] = getRnd();
00130 
00131     if ( keepBackup == false )
00132     {
00133       arrayBackup[i] = array[i];
00134     }
00135   }
00136 }
00137 
00138 void Random::feedValue( BOOL keepBackup, Elem value )
00139 {
00140   init();
00141 
00142   for( register size_t i = 0; i < size; i++ ) 
00143   {
00144     array[i] = value;
00145 
00146     if ( keepBackup == false )
00147     {
00148       arrayBackup[i] = array[i];
00149     }
00150   }
00151 }
00152 
00153 void Random::feedUp( BOOL keepBackup )
00154 {
00155   init();
00156 
00157   for( register size_t i = 0; i < size; i++ ) 
00158   {
00159     array[i] = (Elem)( i );
00160 
00161     if ( keepBackup == false )
00162     {
00163       arrayBackup[i] = array[i];
00164     }
00165   }
00166 }
00167 
00168 void Random::feedDown( BOOL keepBackup )
00169 {
00170   init();
00171 
00172   for( register size_t i = 0; i < size; i++ ) 
00173   {
00174     array[i] = (Elem)( size - i );
00175 
00176     if ( keepBackup == false )
00177     {
00178       arrayBackup[i] = array[i];
00179     }
00180   }
00181 }
00182 
00183 void Random::Randomize() 
00184 {
00185   // Seed the random-number generator with current time so that
00186   // the numbers will be different every time we run.
00187   seed = (UINT)time( NULL );
00188   init();
00189 }
00190 
00191 void Random::Randomize( const UINT value )
00192 {
00193   // Seed the random-number generator with the given value
00194   seed = value;
00195   init();
00196 }
00197 
00198 void Random::init() const 
00199 {
00200   srand( seed );
00201 }
00202 
00203 Elem*  Random::getArray() 
00204 {
00205   return array;
00206 }
00207 
00208 UINT Random::getSeed() const 
00209 {
00210   return seed;
00211 }
00212 
00213 ULONG Random::getMaximum() const 
00214 {
00215   return maximum;
00216 }
00217 
00218 ULONG Random::getSize() const 
00219 {
00220   return size;
00221 }
00222 
00223 Elem Random::getRnd() 
00224 {
00225   return getRnd( maximum );
00226 }
00227 
00228 Elem Random::getRnd( const ULONG Max )
00229 {
00230   // Get a number of type Elem from a double calculation
00231   // to obtain a wide uniform spread random number
00232   // in the range from 0 to Max.
00233 
00234   double r1 = rand();
00235   double r2 = r1 / RAND_MAX * Max;
00236   
00237   return ( Elem ) floor( r2 + 0.5 );
00238 }
00239 
00240 void Random::Verify( const ULONG spread )
00241 {
00242    Elem* nb = new Elem[ spread ];
00243    register size_t i = 0;
00244 
00245    for( i = 0; i < size; i++ )
00246    {
00247      array[i] = getRnd();
00248 
00249      nb[ array[i] % spread ]++;
00250  
00251      printf( " [%6d] ", array[i] );
00252    }
00253 
00254    printf("\n\n");
00255 
00256    for( i = 0; i < spread; i++ )
00257    {
00258      double s = (double)array[i] / size * 100;
00259      printf( " %6d %.2f \t", array[i], s );
00260    }
00261 }
00262 
00263 void Random::Display() 
00264 {
00265   if ( array == NULL )
00266   {
00267     return;
00268   } 
00269   else 
00270   {
00271     for( register size_t i = 0; i < size; i++ )
00272     {
00273       printf(" %d", array[i] );
00274     }
00275 
00276     printf("\n");
00277   }
00278 }
00279 
00280 #endif // End of Random.cpp

Generated on Sun Oct 14 18:46:18 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001