/*@@@@@@@@@@@@@@@@@@@@@@@@@ GSL_RandomGen.cpp @@@@@@@@@@@@@@@@@@@@@@@@@
 Random Option Pricing
 Summer 2002
 Authors: A. Korobchevsky
          S. Ferrando
 Ryerson University ALL RIGHTS RESERVED
 
 Purpose: Implements wrapper class to GSL Random generator
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/




#include <iostream>
#include <cmath>
using namespace std;

#include "GSL_RandomGen.h"






GSL_RandomGen::GSL_RandomGen(string name, long seed, int prec)
{ name_ = name;
  seed_ = seed;
  if ("gfsr" == name_)
    r_ = gsl_rng_alloc(gsl_rng_gfsr4);
  else if ("mt" == name_)
    r_ = gsl_rng_alloc(gsl_rng_mt19937);  
  else if ("taus" == name_) 
    r_ = gsl_rng_alloc(gsl_rng_taus);
  else 
  { cerr << "Illegal generator name\n";
    exit(1);
  }
  setSeed(seed);
  cout.precision(prec);
}




void GSL_RandomGen::setSeed(long seed)
{ seed_ = seed;
  gsl_rng_set(r_, seed_);
}




double GSL_RandomGen::gauss(double sigma)
{ double u, v, x;

  do
  { v = gsl_rng_uniform (r_);
    do
	 { u = gsl_rng_uniform (r_);
	 }
    while (u == 0);
    /* Const 1.715... = sqrt(8/e) */
    x = 1.71552776992141359295 * (v - 0.5) / u;
  }
  while (x * x > -4.0 * log (u));

  return sigma * x;
}
