00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __FASTJET_BASICRANDOM_HH__
00021 #define __FASTJET_BASICRANDOM_HH__ 1
00022
00023
00024 #include <iostream>
00025 #include <vector>
00026 #include <cassert>
00027 #include "fastjet/internal/base.hh"
00028
00029 FASTJET_BEGIN_NAMESPACE
00030
00031
00032
00033
00034
00035
00036 template<typename _Tp> class BasicRandom {
00037 public:
00038 typedef _Tp value_type;
00039 typedef unsigned int size_type;
00040 typedef value_type* pointer;
00041
00042
00043 value_type operator() ();
00044 void operator() (size_type, pointer);
00045
00046
00047 void randomize(void *);
00048
00049
00050 static value_type min();
00051 static value_type max();
00052
00053
00054 void print_info(std::ostream& __os = std::cout);
00055 };
00056
00057
00058 int __default_random_generator(int *__iseed);
00059
00060
00061
00062
00063
00064
00065
00066
00067 template<>
00068 class BasicRandom<int>
00069 {
00070 public:
00071 typedef int value_type;
00072 typedef unsigned int size_type;
00073 typedef value_type* pointer;
00074
00075
00076 explicit BasicRandom(int __s1 = 12345, int __s2 = 67890) {
00077 _M_iseed[0] = __s1;
00078 _M_iseed[1] = __s2;
00079 }
00080
00081
00082 value_type operator() () {
00083 return __default_random_generator(_M_iseed);
00084 }
00085
00086 void operator() (size_type __n, pointer __res) {
00087 for(size_type __i = 0; __i < __n; __i++)
00088 __res[__i] = __default_random_generator(_M_iseed);
00089 }
00090
00091
00092 void randomize(void *__iseed) {
00093 int *__new_seed = (int*) __iseed;
00094 _M_iseed[0] = __new_seed[0];
00095 _M_iseed[1] = __new_seed[1];
00096 }
00097
00098 void set_status(const std::vector<int> & __iseed) {
00099 assert(__iseed.size() >= 2);
00100 _M_iseed[0] = __iseed[0];
00101 _M_iseed[1] = __iseed[1];
00102 }
00103
00104 void get_status(std::vector<int> & __iseed) {
00105 __iseed.resize(2);
00106 __iseed[0] = _M_iseed[0];
00107 __iseed[1] = _M_iseed[1];
00108 }
00109
00110
00111 inline static value_type min() { return 0;}
00112 inline static value_type max() { return 2147483647;}
00113
00114
00115 void print_info(std::ostream& __os = std::cout) {
00116 __os<<"BasicRandom<int> : "<<_M_iseed[0]<<", "<<_M_iseed[1]<<std::endl;
00117 }
00118
00119 private:
00120 int _M_iseed[2];
00121 };
00122
00123
00124
00125
00126
00127
00128 template<> class BasicRandom<double> {
00129 public:
00130 typedef double value_type;
00131 typedef unsigned int size_type;
00132 typedef value_type* pointer;
00133
00134
00135 explicit BasicRandom(int __s1 = 12345, int __s2 = 67890) {
00136 _M_iseed[0] = __s1;
00137 _M_iseed[1] = __s2;
00138 }
00139
00140
00141
00142 value_type operator() () {
00143 return 4.6566128752457969241e-10*__default_random_generator(_M_iseed);
00144 }
00145
00146
00147
00148 void operator() (size_type __n, pointer __res) {
00149 for(size_type __i = 0; __i < __n; __i++)
00150 __res[__i] = this -> operator()();
00151 }
00152
00153
00154 void randomize(void *__iseed) {
00155 int *__new_seed = (int*) __iseed;
00156 _M_iseed[0] = __new_seed[0];
00157 _M_iseed[1] = __new_seed[1];
00158 }
00159
00160 void set_status(const std::vector<int> & __iseed) {
00161 assert(__iseed.size() >= 2);
00162 _M_iseed[0] = __iseed[0];
00163 _M_iseed[1] = __iseed[1];
00164 }
00165
00166 void get_status(std::vector<int> & __iseed) {
00167 __iseed.resize(2);
00168 __iseed[0] = _M_iseed[0];
00169 __iseed[1] = _M_iseed[1];
00170 }
00171
00172
00173 inline static value_type min() { return 0.0;}
00174
00175 inline static value_type max() { return 1.0;}
00176
00177
00178 void print_info(std::ostream& __os = std::cout) {
00179 __os<<"BasicRandom<double> : "<<_M_iseed[0]<<", "<<_M_iseed[1]<<std::endl;
00180 }
00181
00182 private:
00183 int _M_iseed[2];
00184 };
00185
00186
00187 extern BasicRandom<int> _G_random_int;
00188 extern BasicRandom<double> _G_random_double;
00189
00190
00191 FASTJET_END_NAMESPACE
00192
00193 #endif // __FASTJET_BASICRANDOM_HH__
00194