00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "randomgenerator.h"
00021 #include <cmath>
00022
00023 #ifdef FARSA_USE_GSL
00024 #include "gsl/gsl_rng.h"
00025 #include "gsl/gsl_randist.h"
00026 #endif
00027
00028 namespace farsa {
00029
00030 class FARSA_UTIL_INTERNAL RandomGeneratorPrivate {
00031 public:
00032 #ifdef FARSA_USE_GSL
00033 gsl_rng* rng;
00034 RandomGeneratorPrivate() {
00035 rng = gsl_rng_alloc( gsl_rng_taus2 );
00036 };
00037 ~RandomGeneratorPrivate() {
00038 gsl_rng_free( rng );
00039 };
00040 #endif
00041 };
00042
00043 RandomGenerator::RandomGenerator( int seed ) {
00044 prive = new RandomGeneratorPrivate();
00045 #ifdef FARSA_USE_GSL
00046 gsl_rng_set( prive->rng, seed );
00047 #endif
00048 }
00049
00050 RandomGenerator::~RandomGenerator() {
00051 delete prive;
00052 }
00053
00054 void RandomGenerator::setSeed( int seed ) {
00055 this->seedv = seed;
00056 #ifdef FARSA_USE_GSL
00057 gsl_rng_set( prive->rng, seed );
00058 #endif
00059 }
00060
00061 int RandomGenerator::seed() {
00062 return seedv;
00063 }
00064
00065 bool RandomGenerator::getBool( double trueProbability ) {
00066 #ifdef FARSA_USE_GSL
00067 return ( gsl_rng_uniform( prive->rng ) < trueProbability );
00068 #endif
00069 }
00070
00071 int RandomGenerator::getInt( int min, int max ) {
00072 #ifdef FARSA_USE_GSL
00073 return ( gsl_rng_uniform_int( prive->rng, qAbs( max-min )+1 ) + min );
00074 #endif
00075 }
00076
00077 double RandomGenerator::getDouble( double min, double max ) {
00078 #ifdef FARSA_USE_GSL
00079
00080 return gsl_ran_flat( prive->rng, min, max );
00081 #endif
00082 }
00083
00084 double RandomGenerator::getGaussian( double var, double mean ) {
00085 #ifdef FARSA_USE_GSL
00086 return gsl_ran_gaussian( prive->rng, var ) + mean;
00087 #endif
00088 }
00089
00090 }