source: Sophya/trunk/SophyaLib/BaseTools/stsrand.h@ 3403

Last change on this file since 3403 was 3389, checked in by cmv, 18 years ago

intro classe RandomGenerator , cmv+rz 22/11/2007

File size: 3.4 KB
RevLine 
[3389]1#ifndef STSRAND_H_SEEN
2#define STSRAND_H_SEEN
3
4// Classe RandomGenerator
5// Generateur aleatoire compatible multi-thread
6//
7// R. Ansari (C) UPS+LAL IN2P3/CNRS 2007
8// C. Magneville (C) DAPNIA/SPP CEA 2007
9
10
11#include "machdefs.h"
12#include "objfio.h" // Pour rendre la classe PPersist
13
14#include "ndatablock.h"
15
16namespace SOPHYA {
17
18class RandomGenerator : public AnyDataObj {
19
20 public:
21 RandomGenerator(size_t n = 1024, bool tsafe=true);
22 RandomGenerator(RandomGenerator const & rg);
23
24 virtual ~RandomGenerator();
25
26 /*! \brief Automatic initialization using the current time */
27 static void AutoInit(int lp=0);
28 /*! \brief Initialization using the specified seed */
29 static void Init(long seed_val, int lp=0);
30 /*! \brief Initialization using the specified seed */
31 static void Init(unsigned short seed_16v[3], int lp=0);
32 /*! \brief Getting the current seed state */
33 static void GetSeed(unsigned short seed_16v[3], int lp=0);
34
35 /*! \brief Return a random number \b r with a flat distribution 0<=r<1 */
36 inline r_8 Flat01() {return Next();}
37
38 /*! \brief Return a random number \b r with a flat distribution -1<=r<1 */
39 inline r_8 Flatpm1() {return 2.*Next()-1.;}
40
41 /*! \brief Return a random number following a gaussian distribution (sigma=1, mean=0*/
42 virtual r_8 Gaussian();
43
44 /*! \brief Return a random number following a gaussian distribution "sigma", (mean=0)*/
45 virtual r_8 Gaussian(double sigma)
46 { return sigma*Gaussian(); }
47 /*! \brief Return a random number following a gaussian distribution with mean=mu, and sigma */
48 virtual r_8 Gaussian(double sigma,double mu)
49 { return sigma*Gaussian()+mu; }
50
51 /*! \brief alias for Gaussian() */
52 inline r_8 NorRand()
53 { return Gaussian(); }
54
55 /*! \brief Return a random number following a poisson distribution with mean mu */
56 virtual uint_8 Poisson(double mu, double mumax);
57
58 /*! \brief Return a random number following a poisson distribution with mean mu */
59 inline uint_8 Poisson(double mu)
60 { return Poisson(mu, -1.); }
61
62 /*! \brief Return a random number following a poisson distribution with mean mu */
63 inline uint_8 PoissRandLimit(double mu,double mumax=10.)
64 { return Poisson(mu, mumax); }
65
66 // Pour la gestion de persistance PPF
67 friend class ObjFileIO<RandomGenerator> ;
68
69 protected:
70 // ---- protected data members
71 NDataBlock<r_8> rseq_;
72 size_t idx_;
73 bool fg_nothrsafe; // if true --> NOT thread-safe
74 // ---- protected methods
75 void GenSeq();
76 inline r_8 Next()
77 {
78 if (rseq_.Size() == 0) return drand48();
79 else {
80 if(idx_==rseq_.Size()) GenSeq();
81 return(rseq_(idx_++));
82 }
83 }
84 // Non thread-safe version of Init() and GetSeed()
85 static void Init_P(unsigned short seed_16v[3]);
86 static void GetSeed_P(unsigned short seed_16v[3]);
87
88}; // Fin de la classe RandomGenerator
89
90// Classe pour la gestion de persistance PPF : ObjFileIO<RandomGenerator>
91
92/*! Writes the random generator object state in the POutPersist stream \b os */
93inline POutPersist& operator << (POutPersist& os, RandomGenerator & obj)
94{ ObjFileIO<RandomGenerator> fio(&obj); fio.Write(os); return(os); }
95/*! Reads the random generator object state from the PInPersist stream \b is */
96inline PInPersist& operator >> (PInPersist& is, RandomGenerator & obj)
97{ ObjFileIO<RandomGenerator> fio(&obj); is.SkipToNextObject(); fio.Read(is); return(is); }
98
99} /* namespace SOPHYA */
100
101#endif
Note: See TracBrowser for help on using the repository browser.