00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef QRANDOM_HPP
00044 #define QRANDOM_HPP 1
00045
00046
00047 #include <gsl/gsl_rng.h>
00048 #include <gsl/gsl_qrng.h>
00049 #include <gsl/gsl_roots.h>
00050
00051
00059 class Random {
00060
00061 gsl_function_fdf _fdf;
00062 gsl_root_fdfsolver *_solver;
00064 static double rgauss_f_func( double x, void *params );
00065 static double rgauss_df_func( double x, void *params );
00066 static void rgauss_fdf_func( double x, void *params, double *f, double *df );
00067
00068 protected:
00069
00072 Random( int n );
00073
00076 Random( const Random &rng ) {}
00077
00078 int _N;
00083 double transform_gaussian( double R );
00084
00085 public:
00086
00089 virtual ~Random();
00090
00096 virtual void get_gaussian( double *x ) = 0;
00097
00105 virtual void get_part_gaussian( bool *gaussian, double *x ) = 0;
00106
00111 virtual void get( double *x ) = 0;
00112
00113 };
00114
00115
00123 class QRandom : public Random {
00124 gsl_qrng *_qrng;
00128 QRandom( const QRandom &qrng ) : Random(qrng) {}
00129
00130 public:
00131
00134 QRandom( int n );
00135
00138 ~QRandom();
00139
00145 virtual void get_gaussian( double *x );
00146
00154 virtual void get_part_gaussian( bool *gaussian, double *x );
00155
00160 virtual void get( double *x );
00161 };
00162
00163
00171 class MTRandom : public Random {
00172 gsl_rng *_rng;
00176 MTRandom( const MTRandom &rng ) : Random(rng) {}
00177
00178 public:
00179
00182 MTRandom( int n );
00183
00186 ~MTRandom();
00187
00193 virtual void get_gaussian( double *x );
00194
00202 virtual void get_part_gaussian( bool *gaussian, double *x );
00203
00208 virtual void get( double *x );
00209 };
00210
00211
00212 #endif
00213
00214
00215
00216