2010-11-15 110 views

回答

13

您首先需要從範圍(0,1)中統一繪製一個隨機數。給定任何分佈,然後可以將該數字插入分佈的「分位數函數」中,結果就好像從分佈中抽取一個隨機值。從here:{ - 1}(Y)G(Y)= F ^:

的一般方法,從具有不跳躍一個CDF是使用反函數的CDF任意分佈產生的隨機數。如果u(1),...,u(n)是(0,1)分佈上均勻隨機數,則G(u(1)),...,G(u(n))是一個隨機數用cdf F(x)分佈的樣本。

那麼我們如何獲得beta分佈的分位數函數呢? beta.hpp的文檔是here。你應該可以使用這樣的東西:

#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

謝謝!很棒。 – 2010-11-15 15:40:15

+1

顯然這是一個受歡迎的答案,所以我會添加一個警告:對於某些分佈,您可能在某些點處具有接近垂直的分位數函數,在這種情況下,您可能會遇到數值/分辨率問題,其中你傳入的'randFromUnif'浮點數沒有足夠的分辨率在通過分位數時產生隨機數:你最終會得到量化的輸出值。因此,請了解您的問題域和分位數功能,以確保您瞭解這一點! – btown 2014-06-30 22:26:51