我用 C++ 编写了一个模拟,它根据特定的概率分布生成 (1,000,000)^2 个数字,然后对它们进行处理。到目前为止,我使用了指数、正态、伽玛、均匀和泊松分布。这是其中之一的代码:
#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)) ;
现在我需要为 Beta 发行版运行它。到目前为止,我所做的所有分发都需要 10-15 个小时。Beta 发行版不在 boost/random 包中,所以我不得不使用 boost/math/distributions 包。我在 StackOverflow 上找到了这个页面,它提出了一个解决方案。这是(复制粘贴):
#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);
我复制了它并且它起作用了。我的模拟的运行时间估计是线性且可准确预测的。他们说这将运行 25 天。我看到了两种可能性: 1. 提出的方法不如我之前用于其他分布的方法 2. Beta 分布更难从中生成随机数
请记住,我对 C++ 编码的了解很少,所以我问的问题可能很愚蠢。我迫不及待地要等一个月才能完成这个模拟,所以我能做些什么来改进它吗?也许使用我使用的初始方法并修改它以使用 boost/math/distributions 包?我什至不知道这是否可能。
另一条可能有用的信息是,对于我需要生成的所有 (1,000,000)^2 数字,参数都是相同的。我这么说是因为 Beta 发行版确实有一个讨厌的 PDF,也许参数固定的知识可以以某种方式用于简化流程?只是一个随机的猜测。