File indexing completed on 2025-11-04 10:26:13
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 #ifndef ROOT_Math_MersenneTwisterEngine
0014 #define ROOT_Math_MersenneTwisterEngine
0015 
0016 #include "Math/TRandomEngine.h"
0017 
0018 #include <cstdint>
0019 #include <vector>
0020 #include <string>
0021 
0022 namespace ROOT {
0023 
0024    namespace Math {
0025 
0026       
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 
0038 
0039 
0040 
0041 
0042 
0043 
0044 
0045 
0046 
0047 
0048 
0049 
0050       class MersenneTwisterEngine : public TRandomEngine {
0051 
0052 
0053       public:
0054 
0055          typedef  TRandomEngine BaseType;
0056          typedef  uint32_t Result_t;
0057          typedef  uint32_t StateInt_t;
0058 
0059 
0060          MersenneTwisterEngine(uint32_t seed=4357)  {
0061             SetSeed(seed);
0062          }
0063 
0064          ~MersenneTwisterEngine() override {}
0065 
0066          void SetSeed(Result_t seed);
0067 
0068          double Rndm() override {
0069             return Rndm_impl();
0070          }
0071          inline double operator() () { return Rndm_impl(); }
0072 
0073          uint32_t IntRndm() {
0074             return IntRndm_impl();
0075          }
0076 
0077          
0078          static unsigned int MinInt() { return 0; }
0079          
0080          static unsigned int MaxInt() { return 0xffffffff; }  
0081 
0082          static int Size() { return kSize; }
0083 
0084          static std::string Name() {
0085             return "MersenneTwisterEngine";
0086          }
0087 
0088       protected:
0089          
0090 
0091          void SetState(const std::vector<uint32_t> & state) {
0092             for (unsigned int i = 0; i < kSize; ++i)
0093                fMt[i] = state[i];
0094             fCount624 = kSize; 
0095          }
0096 
0097          void GetState(std::vector<uint32_t> & state) {
0098             state.resize(kSize);
0099             for (unsigned int i = 0; i < kSize; ++i)
0100                state[i] = fMt[i];
0101          }
0102 
0103          int Counter() const { return fCount624; }
0104 
0105 
0106       private:
0107 
0108          double Rndm_impl();
0109          uint32_t IntRndm_impl();
0110 
0111          enum {
0112             kSize=624
0113          };
0114          uint32_t  fMt[kSize];
0115          int fCount624;
0116       };
0117 
0118 
0119    } 
0120 
0121 } 
0122 
0123 
0124 #endif