En primer lugar, querrá dibujar un número aleatorio del rango (0,1). Dada cualquier distribución, puede conectar ese número en la "función de cuantiles" de la distribución, y el resultado es como si se extrajera un valor aleatorio de la distribución. De here:
Un método general para generar números aleatorios de una distribución arbitraria que tiene una cdf sin saltos es utilizar la función inversa a la cdf: G (y) = F^{- 1} (y) . Si u (1), ..., u (n) son números aleatorios de la distribución uniforme en (0,1), entonces G (u (1)), ..., G (u (n)) es un azar muestra de la distribución con cdf F (x).
Entonces, ¿cómo obtenemos una función cuantil para una distribución beta? La documentación para beta.hpp es here. Debería poder usar algo como esto:
#include <boost/math/distributions.hpp>
using namespace boost::math;
double alpha, beta, randFromUnif;
//parameters and the random value on (0,1) you drew
beta_distribution<> dist(alpha, beta);
double randFromDist = quantile(dist, randFromUnif);
¡Gracias! Funciona genial. –
Aparentemente esta es una respuesta popular, así que agregaré una advertencia: para ciertas distribuciones, puede tener una función de cuantil que sea casi vertical en ciertos puntos, y en este caso puede encontrarse con problemas numéricos/de resolución en los que el El número de coma flotante 'randFromUnif' al que está pasando no tiene la resolución suficiente para generar números aleatorios cuando pasa a través del cuantil: usted terminaría obteniendo valores de salida cuantizados. ¡Así que conoce tu dominio problemático y tu función cuantil para asegurarte de que eres consciente de esto! – btown