File indexing completed on 2025-03-13 09:25:06
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