这种方法,通过均匀分布,取到累计密度函数 F(x) 的分位点,实现对 x 按照 beta 函数作为概率密度函数进行采样的目的。
关于分位点,举个例子,比如 F(x) = 0.5,那么 x 就是 F(x)=0.5 的分位点。 其实就是 F(x) 的反函数 F − 1 ( y ) F^{-1}(y) F−1(y)。
下面写了个小程序试了一下:
#include <boost/math/distributions.hpp> #include <random> using namespace std; int main() { float alpha, beta, randFromUnif; alpha = 0.5; beta = 0.5; std::random_device rd; std::mt19937 gen(rd()); boost::math::beta_distribution<> dist(alpha, beta); std::uniform_real_distribution<> y_dis(0, 1.0); for (int n = 0; n < 10000; ++n) { randFromUnif = y_dis(gen); float randFromDist = boost::math::quantile(dist, randFromUnif); cout << randFromDist << "\t" << randFromUnif << endl; } return 0; }采样之后,做了个 100 等分的分桶,然后取每个分桶的样本出现个数:
其实还有一些其他的方法,如舍选法,有时间再介绍。
参考 https://stackoverflow.com/questions/4181403/generate-random-number-based-on-beta-distribution-using-boost
https://www.math.pku.edu.cn/teachers/lidf/docs/statcomp/html/_statcompbook/rng-nonuni.html