示例#1
0
double
gsl_ran_gamma_mt (const gsl_rng * r, const double a, const double b)
{
  /* assume a > 0 */

  if (a < 1)
    {
      double u = gsl_rng_uniform_pos (r);
      return gsl_ran_gamma_mt (r, 1.0 + a, b) * pow (u, 1.0 / a);
    }

  {
    double x, v, u;
    double d = a - 1.0 / 3.0;
    double c = (1.0 / 3.0) / sqrt (d);

    while (1)
      {
        do
          {
            x = gsl_ran_gaussian_ziggurat (r, 1.0);
            v = 1.0 + c * x;
          }
        while (v <= 0);

        v = v * v * v;
        u = gsl_rng_uniform_pos (r);

        if (u < 1 - 0.0331 * x * x * x * x) 
          break;

        if (log (u) < 0.5 * x * x + d * (1 - v + log (v)))
          break;
      }
    
    return b * d * v;
  }
}
示例#2
0
文件: utils.cpp 项目: riteshkasat/hdp
double rgamma(double a, double b) {
    return gsl_ran_gamma_mt(RANDOM_NUMBER, a, b);
}
示例#3
0
double
test_gamma_mt_small (void)
{
  return gsl_ran_gamma_mt (r_global, 0.92, 2.17);
}
示例#4
0
double
test_gamma_mt_large (void)
{
  return gsl_ran_gamma_mt (r_global, 20.0, 2.17);
}
示例#5
0
double
test_gamma_mt_int (void)
{
  return gsl_ran_gamma_mt (r_global, 10.0, 2.17);
}
示例#6
0
double
test_gamma_mt (void)
{
  return gsl_ran_gamma_mt (r_global, 2.5, 2.17);
}
double poly_gamma_proposal_samp(gsl_rng * r, poly_gamma_proposal_param_t par) {
	double samp = par.theta+gsl_ran_gamma_mt(r, par.shape, par.scale);
	return samp;
}