He escrito una simulación en C++ que genera (1,000,000)^2 números de una distribución de probabilidad específica y luego hace algo con ellos. Hasta ahora he usado distribuciones Exponencial, Normal, Gamma, Uniforme y Poisson. Aquí está el código para uno de ellos:Números aleatorios de la distribución Beta, C++
#include <boost/random.hpp>
...main...
srand(time(NULL)) ;
seed = rand();
boost::random::mt19937 igen(seed) ;
boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> >
norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ;
Ahora necesito ejecutarlo para la distribución Beta. Todas las distribuciones que he hecho hasta ahora tomaron de 10 a 15 horas. La distribución Beta no está en el paquete boost/random así que tuve que usar el paquete boost/math/distributions. Encontré this page on StackOverflow que propuso una solución. Aquí está (copiado):
#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);
Lo repliqué y funcionó. Las estimaciones de tiempo de ejecución de mi simulación son lineales y predecibles con precisión. Dicen que esto durará 25 días. Veo dos posibilidades: 1. El método propuesto es inferior a la que estaba usando anteriormente para otras distribuciones 2. la distribución Beta es simplemente mucho más difícil de generar números aleatorios desde
Desnudo en cuenta que tengo debajo de un mínimo comprensión de la codificación C++, por lo que las preguntas que estoy haciendo pueden ser tontas. No puedo esperar un mes para completar esta simulación, entonces ¿hay algo que pueda hacer para mejorar eso? Tal vez use el método inicial que estaba usando y modifíquelo para trabajar con el paquete boost/math/distributions? Ni siquiera sé si eso es posible.
Otra información que puede ser útil es que los parámetros son los mismos para todos (1,000,000)^2 de los números que necesito generar. Estoy diciendo esto porque la distribución Beta tiene un PDF desagradable y quizás el conocimiento de que los parámetros están corregidos se puede usar de alguna manera para simplificar el proceso. Solo una suposición al azar.
Gracias, no estaba al tanto de esa propiedad. También he usado el hecho de que la distribución gamma es solo una suma de exponenciales. Su sugerencia cambió el tiempo de ejecución de 600 a 40 horas. ¡Gracias! – jaff
Usando la notación estándar, ¿no debería ser Gamma (α, 1) y Gamma (β, 1) en lugar de Gamma (1, α) y Gamma (1, β)? Es decir, los α y β deberían ser parámetros de forma, no parámetros de escala. – BenRI
@BenRI - Existen múltiples formas de parametrizar la distribución gamma. Uno de los más utilizados es 'gamma (shape_factor, scale_factor)', y con este uso, estás en lo cierto. Ese factor de escala también puede ser una tasa o una media. Otros especifican la forma como el segundo argumento (pero aparentemente no es tan ampliamente utilizado). Actualizaré mi respuesta para reflejar la notación más común e indicar que el argumento de forma es la clave. –