2010-11-15 114 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