2010-11-15 11 views

Respuesta

13

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); 
+0

¡Gracias! Funciona genial. –

+1

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

Cuestiones relacionadas