Back to Beta-distributed random numbers
#ifndef PASTELSYS_RANDOM_BETA_HPP
#define PASTELSYS_RANDOM_BETA_HPP
#include "pastel/sys/random/random_beta.h"
#include "pastel/sys/random/random_gamma.h"
#include "pastel/sys/math_functions.h"
#include <cmath>
namespace Pastel
{
template <typename Real>
Real randomBeta(
const NoDeduction<Real>& a,
const NoDeduction<Real>& b)
{
PENSURE_OP(a, >, 0);
PENSURE_OP(b, >, 0);
Real u = randomGamma<Real>(a);
Real v = 0;
do
{
v = randomGamma<Real>(b);
}
while(u + v == 0);
return u / (u + v);
}
template <typename Real>
Real betaPdf(
const NoDeduction<Real>& x,
const NoDeduction<Real>& a,
const NoDeduction<Real>& b)
{
if (x < 0 || x > 1)
{
return 0;
}
return (std::pow(x, a - 1) * std::pow(1 - x, b - 1)) /
beta<Real>(a, b);
}
}
#endif