00001
00002
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 )
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
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
00186
00187 seed = (UINT)time( NULL );
00188 init();
00189 }
00190
00191 void Random::Randomize( const UINT value )
00192 {
00193
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
00231
00232
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