1 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2    Copyright (c) 2012-2021 The plumed team
3    (see the PEOPLE file at the root of the distribution for a list of names)
4 
5    See http://www.plumed.org for more information.
6 
7    This file is part of plumed, version 2.
8 
9    plumed is free software: you can redistribute it and/or modify
10    it under the terms of the GNU Lesser General Public License as published by
11    the Free Software Foundation, either version 3 of the License, or
12    (at your option) any later version.
13 
14    plumed is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU Lesser General Public License for more details.
18 
19    You should have received a copy of the GNU Lesser General Public License
20    along with plumed.  If not, see <http://www.gnu.org/licenses/>.
21 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
22 #ifndef __PLUMED_tools_Random_h
23 #define __PLUMED_tools_Random_h
24 
25 #include <string>
26 #include <vector>
27 #include <iosfwd>
28 
29 namespace PLMD {
30 
31 /// \ingroup TOOLBOX
32 class Random {
33   static const int IA=16807,IM=2147483647,IQ=127773,IR=2836,NTAB=32;
34   static const int NDIV=(1+(IM-1)/NTAB);
35   static const double EPS;
36   static const double AM;
37   static const double RNMX;
38   static const double fact;
39   static const std::string noname;
40   bool incPrec;
41   bool switchGaussian;
42   double saveGaussian;
43   int iy;
44   int iv[NTAB];
45   int idum;
46   std::string name;
47 public:
48   explicit Random(const std::string & name=noname);
49   void setSeed(int idum);
50   double RandU01();
51   double U01();
52   double U01d();
53   int RandInt(int i);
54   void Shuffle(std::vector<unsigned>& vec);
55   void WriteStateFull(std::ostream &)const;
56   void ReadStateFull (std::istream &);
57   void fromString(const std::string & str);
58   void toString(std::string & str)const;
59   friend std::ostream & operator<<(std::ostream & out,const Random & rng) {
60     rng.WriteStateFull(out); return out;
61   }
62   friend std::istream & operator>>(std::istream & in,Random & rng) {
63     rng.ReadStateFull(in); return in;
64   }
65   double Gaussian();
IncreasedPrecis(bool i)66   void IncreasedPrecis(bool i) {incPrec=i;}
67 };
68 
69 }
70 
71 #endif
72 
73