RandomNumberGenerator.hpp

00001 /*
00002 
00003 Copyright (C) University of Oxford, 2005-2010
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 
00033 #include "ChasteSerialization.hpp"
00034 #include <boost/serialization/split_member.hpp>
00035 
00040 class RandomNumberGenerator
00041 {
00042 public:
00043 
00044 
00049     double StandardNormalRandomDeviate();
00050 
00058     double NormalRandomDeviate(double mean, double sd);
00059 
00063     double ranf();
00064 
00071     unsigned randMod(unsigned base);
00072 
00082     void Shuffle(unsigned num, std::vector<unsigned>& rValues);
00083 
00088     static RandomNumberGenerator* Instance();
00089 
00096     static void Destroy();
00097 
00103     void Reseed(int seed);
00104 
00105 protected:
00106 
00111     RandomNumberGenerator();
00112 
00113 private:
00114 
00116     int mSeed;
00117 
00119     unsigned mTimesCalled;
00120 
00122     static RandomNumberGenerator* mpInstance;
00123 
00124     friend class boost::serialization::access;
00136     template<class Archive>
00137     void save(Archive & archive, const unsigned int version) const
00138     {
00139         // note, version is always the latest when saving
00140         archive & mSeed;
00141         archive & mTimesCalled;
00142     }
00154     template<class Archive>
00155     void load(Archive & archive, const unsigned int version)
00156     {
00157         archive & mSeed;
00158         archive & mTimesCalled;
00159         // reset the random number generator to use the correct seed
00160         srandom(mSeed);
00161         // call it the correct number of times to put it in the
00162         // same state as it used to be.
00163         // NOTE: This is only guaranteed to work if Normal random
00164         // deviates are not used, since the methods to generate
00165         // numbers from a normal distribution use static variables.
00166         for (unsigned i=0; i<mTimesCalled; i++)
00167         {
00168             random();
00169         }
00170     }
00171     BOOST_SERIALIZATION_SPLIT_MEMBER()
00172 
00173 };
00174 #endif /*RANDOMNUMBERGENERATORS_HPP_*/

Generated by  doxygen 1.6.2