Main Page | Namespace List | Class Hierarchy | Compound List | File List | Namespace Members | Compound Members | File Members

abkrand.h

Go to the documentation of this file.
00001 /**************************************************************************
00002 ***    
00003 *** Copyright (c) 1995-2000 Regents of the University of California,
00004 ***               Andrew E. Caldwell, Andrew B. Kahng and Igor L. Markov
00005 *** Copyright (c) 2000-2004 Regents of the University of Michigan,
00006 ***               Saurabh N. Adya, Jarrod A. Roy and Igor L. Markov
00007 ***
00008 ***  Contact author(s): abk@cs.ucsd.edu, imarkov@umich.edu
00009 ***  Original Affiliation:   UCLA, Computer Science Department,
00010 ***                          Los Angeles, CA 90095-1596 USA
00011 ***
00012 ***  Permission is hereby granted, free of charge, to any person obtaining 
00013 ***  a copy of this software and associated documentation files (the
00014 ***  "Software"), to deal in the Software without restriction, including
00015 ***  without limitation 
00016 ***  the rights to use, copy, modify, merge, publish, distribute, sublicense, 
00017 ***  and/or sell copies of the Software, and to permit persons to whom the 
00018 ***  Software is furnished to do so, subject to the following conditions:
00019 ***
00020 ***  The above copyright notice and this permission notice shall be included
00021 ***  in all copies or substantial portions of the Software.
00022 ***
00023 *** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
00024 *** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
00025 *** OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
00026 *** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
00027 *** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
00028 *** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
00029 *** THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00030 ***
00031 ***
00032 ***************************************************************************/
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00044 
00045 /*  The basic Pseudo-random Number Generator
00046   This class should be a model for all other pseudo-random 
00047   generators (not necessarily >number< generators)
00048  
00049 CHANGES 
00050   970821 ilm   rid class RandomNumberGenerator of two [ambiguous] conversion
00051                    (unsigned and double). Instead derived two new classes
00052                    RandomUnsigned and RandmDouble which have the same
00053                    interface and respective conversions.
00054   970821 ilm   all private members/methods of RNG made protected
00055                    so that it is good as base class for RandomGenerators
00056   970821 ilm   added unsigned RNG::operator() (unsigned N) const to
00057                    RandomUnsigned for STL conformance
00058   971009 mro   extensive changes including making all end-user RNG classes
00059                    templates, making the internal random engine r250/r1279,
00060                adding RandomRawUnsigned, RandomRawDouble, RandomNormal
00061   971113 mro   added seed logging
00062   971114 mro   added SeedCleaner class, got rid of "Old" kernel
00063   971215 mro   moved SeedCleaner and SeedHandler classes to abkseed.h
00064   990617 mro   extensive expansion of seed-handling mechanism:  now
00065                   allows tripartite seeds for locally independent
00066                   RNGs.  Also improved selection of initial nondeterministic
00067                   seed and added support for verbosity.
00068 */
00070 
00071 #ifndef _ABKRAND_H_
00072 #define _ABKRAND_H_
00073 
00074 #include <stdlib.h>
00075 #include <math.h>
00076 #include <fstream>
00077 #include <limits.h>
00078 #include "abkseed.h"
00079 #include "abktimer.h"
00080 #include "abkassert.h"
00081 #include "verbosity.h"
00082 #include <vector>
00083 using std::vector;
00084 
00085 /* These classes are actually typedefed in the bottom of this class;
00086  statements are rather verbose, therefore not included here  -ILM
00087 
00088 class RandomNumberGenerator;
00089 class RandomUnsigned;
00090 class RandomDouble;
00091 
00092 typedef RandomNumberGenerator RNG;
00093 
00094  IMPORTANT:
00095 
00096  All random "kernel" classes MUST be derived from RandomRoot
00097 */
00098 
00099 //: All random "kernel" classes MUST be derived from RandomRoot
00100 class RandomRoot
00101     {
00102     private:
00103         SeedHandler _handler;
00104     protected:
00105         unsigned _seed;
00106         Verbosity _verb;
00107         RandomRoot(unsigned seed=UINT_MAX,
00108                    Verbosity verb=Verbosity("silent")):_handler(seed),
00109                                                        _verb(verb)
00110             {
00111             _seed = _handler._seed;
00112             if (verb.forMajStats)
00113                 cout << "_seed = " << _seed << endl;
00114             }
00115 
00116         RandomRoot(const char* locIdent,
00117                    unsigned counterOverride=UINT_MAX,
00118                    Verbosity verb=Verbosity("silent"));
00119                                                              
00120     public:
00121         static  const double randTick; //    = 1/(0xffffffff + 1.0); // 2^-32
00122         unsigned getSeed() const
00123             {
00124             abkfatal(!_handler._isSeedMultipartite,"can't use getSeed() "
00125                        "with multipartite seed");
00126             return _seed;
00127             }
00128 
00129         static unsigned getExternalSeed();
00130         const char *getLocIdent() const;
00131         unsigned getCounter() const;
00132 
00133         const Verbosity &getVerbosity() const {return _verb;}
00134     };
00135 
00136 //:  Currently implemented are based on the r250 (or r1279)
00137 //   Tausworthe shift-register algorithm.  The periods are enormously
00138 //   longer than the 32-bit linear congruential RNGs we were using.
00139 //   Short periods can be a problem even if you don't exhaust them,
00140 //   because you have a significant chance that the sequences produced
00141 //   by two different seeds will overlap in the global sequence of
00142 //   the RNG, and therefore not be independent.
00143 class Tausworthe : public RandomRoot
00144     {
00145     private:
00146         unsigned _encryptWithSeed(unsigned clear);
00147         // the reason for the function is to be able
00148         // to "encrypt" a buffer value in a way dependent on
00149         // the seed, so that the initial state of the buffer
00150         // depends very chaotically on the seed.
00151         // returns (clear XOR _seed)^17 mod cryptMod
00152         void     _encryptBufWithSeed();
00153 
00154         void _encryptBufMultipartiteSeed();
00155 
00156         unsigned _multmod(unsigned x,unsigned y);  
00157         // returns x*y mod cryptMod
00158         unsigned _bufferSize;
00159         unsigned _tauswortheQ;
00160         mutable unsigned *_buffer;
00161         mutable unsigned _cursor;
00162 
00163     protected:
00164         Tausworthe(unsigned bufSize, unsigned Q,
00165                        unsigned *preloads,unsigned seed=UINT_MAX,
00166                        Verbosity verb=Verbosity("silent"))
00167             :RandomRoot(seed,verb), _bufferSize(bufSize),
00168              _tauswortheQ(Q), _preloads(preloads)
00169             {
00170             _buffer = new unsigned[bufSize];
00171             for(unsigned i=0; i!=bufSize; i++) _buffer[i]=0;
00172             _encryptBufWithSeed();
00173             }
00174 
00175         Tausworthe(unsigned bufSize, unsigned Q,
00176                        unsigned *preloads,const char *locIdent,
00177                        unsigned counterOverride=UINT_MAX,
00178                        Verbosity verb=Verbosity("silent"))
00179             :RandomRoot(locIdent,counterOverride, verb),
00180              _bufferSize(bufSize),_tauswortheQ(Q),
00181              _preloads(preloads)
00182             {
00183             _buffer = new unsigned[bufSize];
00184             for(unsigned i=0; i!=bufSize; i++) _buffer[i]=0;
00185             _encryptBufMultipartiteSeed();
00186             }
00187 
00188         ~Tausworthe(){delete [] _buffer;}
00189         inline unsigned _getRawUnsigned() 
00190         {
00191                 //the function is the genuine "raw" engine for the RNG
00192                     {
00193                     unsigned retval;
00194                     int otherPoint = _cursor-_tauswortheQ;
00195                     if (otherPoint<0)
00196                         otherPoint += _bufferSize;
00197                 
00198                 #if defined(__SUNPRO_CC)
00199                 //|| defined(__GNUC__)
00200                     /* SUN compiler doesn't use "mutable" */
00201                     retval = const_cast<unsigned*>(_buffer)
00202                           [const_cast<Tausworthe*>(this)->_cursor] ^=
00203                         const_cast<unsigned*>(_buffer)[otherPoint];
00204                     if (++(const_cast<Tausworthe*>(this)->_cursor) >= _bufferSize)
00205                         const_cast<Tausworthe*>(this)->_cursor=0;
00206                 
00207                 #else
00208                     retval = _buffer[_cursor] ^= _buffer[otherPoint];
00209                     if (++_cursor >= _bufferSize)
00210                         _cursor=0;
00211                 #endif
00212                 
00213                     return retval;
00214                     }
00215                 
00216         }
00217         double   _getRawDouble() {return randTick * _getRawUnsigned();}
00218         unsigned *_preloads;
00219 
00220     };
00221 
00222 //: Existing engine classes: RandomKernel250 is derived from Tausworthe. 
00223 //    This is not necessary for future engine classes, and indeed
00224 //    if your generator is not Tausworthe-style then please
00225 //    don't derive it from Tausworthe as that would be confusing.
00226 class RandomKernel250 : public Tausworthe
00227     {
00228 
00229     protected:
00230         RandomKernel250(unsigned seed=UINT_MAX,
00231                         Verbosity verb=Verbosity("silent"));
00232 
00233         RandomKernel250(const char *locIdent,
00234                         unsigned counterOverride=UINT_MAX,
00235                         Verbosity verb=Verbosity("silent"));
00236 
00237     };
00238 //: The other existing engine class derived form Tausworthe.
00239 class RandomKernel1279 : public Tausworthe
00240     {
00241 
00242     protected:
00243         RandomKernel1279(unsigned seed=UINT_MAX,
00244                          Verbosity verb=Verbosity("silent"));
00245 
00246 
00247         RandomKernel1279(const char *locIdent,
00248                         unsigned counterOverride=UINT_MAX,
00249                         Verbosity verb=Verbosity("silent"));
00250     };
00251 
00252 //: Base template class of RandomUnsignT, RandomDoubleT, RandomRawUnsignT
00253 //  RandomRawDoubleT and so on 
00254 template <class RK> class RandomNumberGeneratorT: public RK
00255 {
00256  protected:
00257 
00258     double   _dLowerB, _dUpperB, _dDelta;
00259     unsigned  _lowerB,  _upperB,  _delta;
00260 
00261     unsigned _getUnsignedRand() ;
00262     double   _getDoubleRand() ;
00263 
00264  public:
00265     
00266 
00267     RandomNumberGeneratorT(double _lowerBdry, double _upperBdry,
00268                            unsigned seedN=UINT_MAX,
00269                            Verbosity verb=Verbosity("silent"))
00270                              : RK(seedN,verb),
00271                              _dLowerB(_lowerBdry),_dUpperB(_upperBdry),
00272                              _dDelta(_upperBdry-_lowerBdry),
00273                              _lowerB(unsigned(_lowerBdry)),
00274                              _upperB(unsigned(_upperBdry))
00275         { 
00276         abkfatal(_lowerBdry<_upperBdry," Invalid range for random number generator");
00277         abkfatal(_dDelta>1e-4," Range too small for random number generator ");
00278         _delta=unsigned(_dDelta);
00279         if (_dDelta<1) _delta=1;
00280         }
00281 
00282     RandomNumberGeneratorT(double _lowerBdry, double _upperBdry,
00283                            const char *locIdent,
00284                            unsigned counterOverride=UINT_MAX,
00285                            Verbosity verb=Verbosity("silent"))
00286                              :
00287                              RK(locIdent,counterOverride,verb),
00288                              _dLowerB(_lowerBdry),_dUpperB(_upperBdry),
00289                              _dDelta(_upperBdry-_lowerBdry),
00290                              _lowerB(unsigned(_lowerBdry)),
00291                              _upperB(unsigned(_upperBdry))
00292         { 
00293         abkfatal(_lowerBdry<_upperBdry," Invalid range for random number generator");
00294         abkfatal(_dDelta>1e-4," Range too small for random number generator ");
00295         _delta=unsigned(_dDelta);
00296         if (_dDelta<1) _delta=1;
00297         }
00298 
00299     unsigned operator()(unsigned N) {return RK::_getRawUnsigned()%N;}
00300 };
00301 
00302 //: To override the seed , do something like RandomUnsigned ru(0,19,257);
00303 //    where 0 is the lower limit (inclusive), 19 the upper limit (strict),
00304 //    and 257 the seed. (So it goes from 0 to 18 inclusive.)
00305 //    If you want the seed set by the system clock, or by seeds.in, use
00306 //    RandomUnsigned ru(0,19);
00307 //  To make a local independent RNG object, use the *second* ctor
00308 //    below, passing a local identifier.  Suggestion:  If your
00309 //    RNG is called _rng and is a member of MyClass, pass
00310 //    the string "MyClass::_rng".  If it's a local variable
00311 //    called rng in the method MyClass::myMethod(), pass
00312 //    the string "MyClass::myMethod(),_rng".  In this way
00313 //    you will get the same string of random values independently
00314 //    of how many RNG objects have been created in other people's
00315 //    code (it will keep track of the number of RNG objects created
00316 //    specifically with *your* string.
00317 //  Just as you can override the seed in the older ctor, you can
00318 //    override the counter with the ctor supporting local independence.
00319 //    This may be useful for debugging if you need to reproduce exactly
00320 //    what happened in a particular segment of code.
00321 template <class RK> class RandomUnsignedT : public RandomNumberGeneratorT<RK>
00322 {
00323 public:
00324     RandomUnsignedT(double _lowerBdry, double _upperBdry,
00325                         unsigned seedN=UINT_MAX,
00326                         Verbosity verb=Verbosity("silent")) :
00327                   RandomNumberGeneratorT<RK>(_lowerBdry,_upperBdry,seedN,verb) {}
00328 
00329     RandomUnsignedT(double _lowerBdry, double _upperBdry,
00330                     const char *locIdent, unsigned counterOverride=UINT_MAX,
00331                     Verbosity verb=Verbosity("silent")) :
00332                   RandomNumberGeneratorT<RK>(_lowerBdry,_upperBdry,
00333                                              locIdent,counterOverride,verb) {}
00334     operator unsigned() {return RandomNumberGeneratorT<RK>::_getUnsignedRand();}
00335 };
00336 
00337 //: Everything is exactly analogous to RandomUnsigned as above,
00338 //    replacing "unsigned" by "double" in the first two parameters
00339 //    to the constructor, and in that you cast to double to get
00340 //    the random value.
00341 template <class RK> class RandomDoubleT : public RandomNumberGeneratorT<RK>
00342 {
00343 public:
00344     RandomDoubleT(double _lowerBdry, double _upperBdry,
00345                       unsigned seedN=UINT_MAX,
00346                       Verbosity verb=Verbosity("silent")):
00347                   RandomNumberGeneratorT<RK>(_lowerBdry,_upperBdry,seedN,verb) {};
00348 
00349     RandomDoubleT(double _lowerBdry, double _upperBdry,
00350                       const char *locIdent,unsigned counterOverride=UINT_MAX,
00351                       Verbosity verb=Verbosity("silent")):
00352                   RandomNumberGeneratorT<RK>(_lowerBdry,_upperBdry,
00353                                              locIdent,counterOverride,verb) {};
00354     operator double() {return RandomNumberGeneratorT<RK>::_getDoubleRand();}
00355 };
00356 
00357 /*
00358 //: The next two "raw" classes do not accept ranges.  
00359 // RandomRawUnsigned takes as its range all possible unsigned values.  
00360 // RandomRawDouble returns a value in [0,1) with 32 significant bits.  They should
00361 // be slightly faster than RandomUnsigned and RandomDouble, which
00362 // adjust for ranges.
00363 */
00364 template <class RK> class RandomRawUnsignedT : public RK
00365 {
00366 public:
00367     RandomRawUnsignedT(unsigned seedN=UINT_MAX,
00368                        Verbosity verb=Verbosity("silent")) :
00369                   RK(seedN,verb) {};
00370                                  
00371     RandomRawUnsignedT(const char *locIdent,
00372                        unsigned counterOverride=UINT_MAX,
00373                        Verbosity verb=Verbosity("silent")) :
00374                   RK(locIdent,counterOverride,verb) {};
00375                                  
00376 
00377     operator unsigned() {return RK::_getRawUnsigned();}
00378     unsigned operator()(unsigned N) {return RK::_getRawUnsigned()%N;}
00379 };
00380 
00381 //:
00382 template <class RK> class RandomRawDoubleT : public RK
00383 {
00384 public:
00385 
00386     RandomRawDoubleT(unsigned seedN=UINT_MAX,
00387                      Verbosity verb=Verbosity("silent")) :
00388                   RK(seedN,verb) {};
00389                                  
00390     RandomRawDoubleT(const char *locIdent,
00391                      unsigned counterOverride=UINT_MAX,
00392                      Verbosity verb=Verbosity("silent")) :
00393                   RK(locIdent,counterOverride,verb) {};
00394                                  
00395 
00396     operator double() {return RK::_getRawDouble();}
00397     unsigned operator()(unsigned N) {return RK::_getRawUnsigned()%N;}
00398 };
00399 
00400 
00401 //: 
00402 //    The constructor of class accepts two values (mean, standard deviation)
00403 //    or three (overriding the seed):
00404 //
00405 //    RandomNormal rn(4.0,2.0);
00406 //    RandomNormal rn(4.0,2.0,14);
00407 //
00408 //    The values of rn will be normally distributed (Gaussian, bell curve)
00409 //    with mean 4.0 and standard deviation 2.0.
00410 template <class RK> class RandomNormalT : public RK
00411     {
00412     private:
00413         double _mu;
00414         double _sigma;
00415         mutable bool   _cacheFull;
00416         mutable double _cachedValue;
00417     public:
00418         RandomNormalT<RK>(double mean,
00419                               double stdDev,
00420                               unsigned seed=UINT_MAX,
00421                               Verbosity verb=Verbosity("silent"))
00422                               : RK(seed,verb),
00423                                 _mu(mean),
00424                                 _sigma(stdDev),
00425                                 _cacheFull(false),
00426                                 _cachedValue(0.0)
00427                                 {}
00428 
00429         RandomNormalT<RK>(double mean,
00430                               double stdDev,
00431                               const char *locIdent,
00432                               unsigned counterOverride=UINT_MAX,
00433                               Verbosity verb=Verbosity("silent"))
00434                               :
00435                                 RK(locIdent,counterOverride,verb),
00436                                 _mu(mean),
00437                                 _sigma(stdDev),
00438                                 _cacheFull(false),
00439                                 _cachedValue(0.0)
00440                                 {}
00441 
00442         operator double();
00443 
00444 
00445     };
00446 
00447 // This class generates pairs of binormal deviates
00448 // (see "Numerical Recipes in C", second edition, section 14.5)
00449 // with specified means, standard deviations, and correlations.
00450 // Each time the getPair() method is called, a new pair
00451 // of deviates is returned.  The "first" element of the
00452 // pair has mean equal to "mean1" and standard deviation
00453 // equal to "stdDev1"; mutatatis mutandis for the "second"
00454 // element.
00455 
00456 template <class RK> class RandomNormCorrPairsT 
00457     {
00458     private:
00459         RandomNormalT<RK> _norm;
00460         const double _mu1,_mu2;
00461         const double _sigma1,_sigma2;
00462         const double _rho;
00463         const double _c;   // we'll use x1+_c*x2 and x1-_c*x2,
00464                            // where x1, x2 are indep. unit normal deviates
00465 
00466         const double _a1,_a2,_b1,_b2; // intermed values useful to precalc
00467 
00468     public:
00469         RandomNormCorrPairsT<RK>(double mean1,double stdDev1,
00470                               double mean2, double stdDev2,
00471                               double correlation,
00472                               unsigned seed=UINT_MAX,
00473                               Verbosity verb=Verbosity("silent"))
00474                               : _norm(0,1,seed,verb),
00475                                                 _mu1(mean1),_mu2(mean2),
00476                                 _sigma1(stdDev1),_sigma2(stdDev2),
00477                                 _rho(correlation),
00478                                 _c(sqrt((1-_rho)/(1+_rho))),
00479                                 _a1(_sigma1/sqrt(1+_c*_c)),
00480                                 _a2(_sigma2/sqrt(1+_c*_c)),
00481                                 _b1(_sigma1*_c/sqrt(1+_c*_c)),
00482                                 _b2(_sigma2*_c/sqrt(1+_c*_c))
00483                                 {}
00484 
00485         RandomNormCorrPairsT<RK>(double mean1,double stdDev1,
00486                               double mean2, double stdDev2,
00487                               double correlation,
00488                               const char *locIdent,
00489                               unsigned counterOverride=UINT_MAX,
00490                               Verbosity verb=Verbosity("silent"))
00491                               : _norm(0,1,locIdent,counterOverride,verb),
00492                                                 _mu1(mean1),_mu2(mean2),
00493                                 _sigma1(stdDev1),_sigma2(stdDev2),
00494                                 _rho(correlation),
00495                                 _c(sqrt((1-_rho)/(1+_rho))),
00496                                 _a1(_sigma1/sqrt(1+_c*_c)),
00497                                 _a2(_sigma2/sqrt(1+_c*_c)),
00498                                 _b1(_sigma1*_c/sqrt(1+_c*_c)),
00499                                 _b2(_sigma2*_c/sqrt(1+_c*_c))
00500                                 {}
00501 
00502         std::pair<double,double> getPair();
00503 
00504 
00505     };
00506 
00507 //This RNG gives multinormally-distributed X_0, X_1,...,X_{n-1}
00508 //with specified pairwise correlations.
00509 template <class RK> class RandomNormCorrTuplesT 
00510 {
00511     private:
00512         //helper function; _rho_ij includes only upper-triangular elements
00513         // i.e. _rho_ij[i][j] is not really rho_ij but
00514         // rather rho_{i,i+j+1}
00515         //return value is success
00516         bool _findBasis(const vector<vector<double> > &_rho_ij,
00517             vector<vector<double> > &_v_ij);
00518 
00519         const unsigned _n; //number of variates
00520         vector<RandomNormalT<RK>*> _norm_j;
00521         vector<double> _y_j; //scratch space; fill with normal values
00522                              //then transform with _v_ij
00523         const vector<double> _mu_i;
00524         const vector<double> _sigma_i;
00525         vector<vector<double> > _v_ij;
00526 
00527         bool _bad; //will be set if _findBasis() fails
00528 
00529     public:
00530         RandomNormCorrTuplesT<RK>(const vector<double> &means,
00531                                   const vector<double> &stdDevs,
00532 
00533                                   //Note:  corrs[i][j] is the desired
00534                                   //correlation between X_i and
00535                                   //X_{i+j+1} (i.e. only upper-triangular
00536                                   //elements are included
00537                                   const vector<vector<double> > &corrs,
00538                                   const char *locIdent,
00539                                   unsigned counterOverride=UINT_MAX,
00540                                   Verbosity verb=Verbosity("silent"));
00541 
00542         ~RandomNormCorrTuplesT<RK>();
00543 
00544         void getTuple(vector<double> &tuple);
00545         bool bad() const {return _bad;}
00546 };
00547 /* -------------------------   IMPLEMENTATIONS  ----------------------- */
00548 // I don't seem to be able to get any compiler to instantiate these
00549 // methods from a template database.  I don't understand why.
00550 // If it's figured out, then the following "#include" can be
00551 // conditioned on the compiler
00552 // mro 011029
00553 
00554 #include "abkrand_templ.cxx"
00555 
00556 typedef RandomDoubleT<RandomKernel250> RandomDouble;
00557 typedef RandomDoubleT<RandomKernel1279> RandomDouble1279;
00558 typedef RandomUnsignedT<RandomKernel250> RandomUnsigned;
00559 typedef RandomUnsignedT<RandomKernel1279> RandomUnsigned1279;
00560 typedef RandomRawDoubleT<RandomKernel250> RandomRawDouble;
00561 typedef RandomRawDoubleT<RandomKernel1279> RandomRawDouble1279;
00562 typedef RandomRawUnsignedT<RandomKernel250> RandomRawUnsigned;
00563 typedef RandomRawUnsignedT<RandomKernel1279> RandomRawUnsigned1279;
00564 typedef RandomNormalT<RandomKernel250> RandomNormal;
00565 typedef RandomNormalT<RandomKernel1279> RandomNormal1279;
00566 typedef RandomNumberGeneratorT<RandomKernel250> RandomNumberGenerator;
00567 typedef RandomNumberGeneratorT<RandomKernel1279> RandomNumberGenerator1279;
00568 typedef RandomNumberGenerator RNG;
00569 typedef RandomNumberGenerator1279 RNG1279;
00570 typedef RandomNormCorrPairsT<RandomKernel250> RandomNormCorrPairs;
00571 typedef RandomNormCorrPairsT<RandomKernel1279> RandomNormCorrPairs1279;
00572 typedef RandomNormCorrTuplesT<RandomKernel250> RandomNormCorrTuples;
00573 typedef RandomNormCorrTuplesT<RandomKernel1279> RandomNormCorrTuples1279;
00574 
00575 /*typedef RandomRawUnsignedT<RandomKernelOld> RandomRawUnsignedOld; */
00576 #endif

Generated on Mon Apr 25 01:09:23 2005 for Parquete by doxygen 1.3.2