00001 /*************************************************************************** 00002 random.h - description 00003 ------------------- 00004 begin : Mon Jul 24 2000 00005 copyright : (C) 2000 by Michael Peeters 00006 email : Michael.Peeters@vub.ac.be 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #ifndef RANDOM_H 00019 #define RANDOM_H 00020 00021 #include "numerictypes.h" 00022 #include <stdexcept> 00023 #include <time.h> 00024 00025 namespace MODEL{ 00026 00030 class Random { 00031 public: 00032 Random(counter initial_seed=0) {seed(initial_seed);} 00033 00035 number operator()(void) {number temp; return generate(temp);} 00036 00038 virtual number& generate(number& storage) = 0; 00039 00041 void seed(integer seed) 00042 { 00043 if(seed!=0) 00044 _seed=seed; 00045 else 00046 _seed=::time(NULL); 00047 } 00049 counter get_seed(void) {return _seed;} 00050 00051 protected: 00052 counter _seed; 00053 }; 00054 00056 class Uniform : public Random 00057 { 00058 public: 00059 Uniform(counter inital_seed=0); 00060 virtual number& generate(number& storage); 00061 const counter& seed_update(void); 00062 00063 private: 00064 static const counter IA=16807; 00065 static const counter IM=2147483647; 00066 static const number AM=1.0/IM; 00067 static const counter IQ=127773; 00068 static const counter IR=2836; 00069 static const counter tabelsize=32; 00070 static const counter NDIV = 1+(IM-1)/tabelsize; 00071 static const number RNMX=1.0-EPS; 00072 00073 counter tabel[tabelsize]; 00074 00075 counter lastseed; 00076 }; 00077 00081 class Normal { 00082 public: 00083 Normal(counter seed=0); 00084 virtual ~Normal(); 00085 virtual number& generate(number& storage); 00086 number operator()(void) {number temp; return generate(temp);} 00087 00088 private: 00089 Uniform* rnd; 00090 bool regenerate2; //numbers are generated in pairs 00091 number saved;//the second one 00092 }; 00093 00094 } // end namespace 00095 #endif 00096 00097 /********************************************************************* 00098 $Id: random.h,v 1.1 2001/05/22 10:54:55 mpeeters Exp $ 00099 ********************************************************************** 00100 00101 $Log: random.h,v $ 00102 Revision 1.1 2001/05/22 10:54:55 mpeeters 00103 Moved sources and headers for libModel to model/ subdirectory, in an attempt to rationalize the source tree. This should make things "netter". 00104 00105 Revision 1.3 2000/09/29 13:00:49 mpeeters 00106 Added ChangeLog (using cvs2cl.pl script by Karl Fogel) 00107 Changed makefile to take into account tutorial 00108 Muddled around in random.h 00109 Added tutorial section to the Introduction 00110 00111 Revision 1.2 2000/09/15 10:26:31 mpeeters 00112 Cleaned out header and added CVS tails to files, removed superfuous 00113 @author comments, inserted dates 00114 00115 *********************************************************************/
More Info? Michael Peeters. Also, check our research website: www.alna.vub.ac.be
Last update: June 2002.