2010-11-15 25 views

risposta

13

Innanzitutto, è necessario disegnare un numero casuale uniforme nell'intervallo (0,1). Data qualsiasi distribuzione, è quindi possibile collegare quel numero nella "funzione quantile" della distribuzione e il risultato è come se un valore casuale fosse estratto dalla distribuzione. Da here:

Un metodo generale per generare numeri casuali da una distribuzione arbitraria che ha un CDF senza salti è quello di utilizzare la funzione inversa alla CDF: G (y) = F^{- 1} (y) . Se u (1), ..., u (n) sono numeri casuali dalla distribuzione uniforme su (0,1), allora G (u (1)), ..., G (u (n)) è casuale campione dalla distribuzione con cdf F (x).

Quindi, come si ottiene una funzione quantile per una distribuzione beta? La documentazione per beta.hpp è here. Dovresti essere in grado di utilizzare qualcosa del genere:

#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

Grazie! Funziona alla grande. –

+1

Apparentemente questa è una risposta popolare, quindi aggiungerò un avvertimento: per certe distribuzioni, potresti avere una funzione quantile quasi verticale in certi punti, e in questo caso potresti imbatterti in problemi numerici/di risoluzione in cui il Il numero in virgola mobile 'randFromUnif' che stai trasmettendo non ha una risoluzione sufficiente per generare numeri casuali quando viene passato attraverso il quantile: finirai per ottenere valori di output quantizzati. Quindi conosci il tuo dominio del problema e la tua funzione quantile per assicurarti di essere a conoscenza di questo! – btown

Problemi correlati