RandomNumberGenerator.hpp

00001 /*
00002 
00003 Copyright (C) University of Oxford, 2005-2009
00004 
00005 University of Oxford means the Chancellor, Masters and Scholars of the
00006 University of Oxford, having an administrative office at Wellington
00007 Square, Oxford OX1 2JD, UK.
00008 
00009 This file is part of Chaste.
00010 
00011 Chaste is free software: you can redistribute it and/or modify it
00012 under the terms of the GNU Lesser General Public License as published
00013 by the Free Software Foundation, either version 2.1 of the License, or
00014 (at your option) any later version.
00015 
00016 Chaste is distributed in the hope that it will be useful, but WITHOUT
00017 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
00019 License for more details. The offer of Chaste under the terms of the
00020 License is subject to the License being interpreted in accordance with
00021 English Law and subject to any action against the University of Oxford
00022 being under the jurisdiction of the English Courts.
00023 
00024 You should have received a copy of the GNU Lesser General Public License
00025 along with Chaste. If not, see <http://www.gnu.org/licenses/>.
00026 
00027 */
00028 
00029 
00030 #ifndef RANDOMNUMBERGENERATORS_HPP_
00031 #define RANDOMNUMBERGENERATORS_HPP_
00032 #include <cmath>
00033 #include <ctime>
00034 #include <stdlib.h>
00035 #include <iostream>
00036 #include <vector>
00037 
00038 #include <boost/serialization/access.hpp>
00039 #include <boost/serialization/split_member.hpp>
00040 
00041 class RandomNumberGenerator
00042 {
00043 public:
00044     double StandardNormalRandomDeviate(void);
00045     double NormalRandomDeviate(double mean, double sd);
00046     double ranf(void);
00047     unsigned randMod(unsigned base);
00048     void Shuffle(unsigned num, std::vector<unsigned>& rValues);
00049 
00050 
00051     static RandomNumberGenerator* Instance();
00052     static void Destroy();
00053     void Reseed(int seed)
00054     {
00055         mSeed = seed;
00056         srandom(seed);
00057         mTimesCalled = 0;
00058     }
00059 protected:
00063     RandomNumberGenerator()
00064     {
00065         mSeed = 0;
00066         mTimesCalled = 0;
00067         srandom(0);
00068     }
00069 
00070 private:
00071     int mSeed;
00072     unsigned mTimesCalled;
00073 
00074     static RandomNumberGenerator* mpInstance;
00075 
00076     friend class boost::serialization::access;
00083     template<class Archive>
00084     void save(Archive & archive, const unsigned int version) const
00085     {
00086         // note, version is always the latest when saving
00087         archive & mSeed;
00088         archive & mTimesCalled;
00089     }
00090     template<class Archive>
00091     void load(Archive & archive, const unsigned int version)
00092     {
00093         archive & mSeed;
00094         archive & mTimesCalled;
00095         // reset the random number generator to use the correct seed
00096         srandom(mSeed);
00097         // call it the correct number of times to put it in the
00098         // same state as it used to be.
00099         // NOTE: This is only guaranteed to work if Normal random
00100         // deviates are not used, since the methods to generate
00101         // numbers from a normal distribution use static variables.
00102         for (unsigned i=0; i<mTimesCalled; i++)
00103         {
00104             random();
00105         }
00106     }
00107     BOOST_SERIALIZATION_SPLIT_MEMBER()
00108 
00109 };
00110 #endif /*RANDOMNUMBERGENERATORS_HPP_*/

Generated on Wed Mar 18 12:51:50 2009 for Chaste by  doxygen 1.5.5