【发布时间】:2014-09-22 18:56:16
【问题描述】:
我需要在 C++ 中生成遵循超几何分布的样本。但是,就我而言,我可以毫无问题地用二项分布来近似它。
因此我想在 C++11 中使用 std 实现。如果我在计算概率时生成许多样本,我会从 R 告诉我的那个中得到不同的值。更重要的是,随着样本数量的增加,差异并没有变小。 R 和 C++ 的参数相同。
因此问题是:为什么我没有得到相同的结果,我可以做什么/我应该相信哪些?
见下文,R 和 C++ 代码。 C++ 程序计算 R 值的差值。即使我让程序运行很长一段时间,这个数字也不会变小,只会在 E-5、E-6、E-7 震级附近摆动。
R:
dbinom(0:2, 2, 0.48645948945615974379)
#0.26372385596962805154 0.49963330914842424280 0.23664283488194759464
C++:
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;
class Generator {
public:
Generator();
virtual ~Generator();
int binom();
private:
std::random_device randev;
std::mt19937_64 gen;
std::binomial_distribution<int> dist;
};
Generator::Generator() : randev(), gen(randev()), dist(2,0.48645948945615974379) { }
Generator::~Generator() {}
int Generator::binom() { return dist(gen); }
int main() {
Generator rd;
const double nrolls = 10000000; // number of experiments
double p[3]={};
for (int k=1; k<100; ++k) {
for (int i=0; i<nrolls; ++i) {
int number = rd.binom();
++p[number];
}
cout << "Samples=" << setw(8) << nrolls*k <<
" dP(0)="<<setw(13)<<p[0]/(nrolls*k)-0.26372385596962805154<<
" dP(1)="<<setw(13)<<p[1]/(nrolls*k)-0.49963330914842424280<<
" dP(2)="<<setw(13)<<p[2]/(nrolls*k)-0.23664283488194759464<<endl;
}
cout<<"end";
return 0;
}
选择性输出:
Samples= 1e+07 dP(0)= -2.0056e-05 dP(1)= 9.49909e-05 dP(2)= -7.49349e-05
Samples= 1e+08 dP(0)= 1.5064e-05 dP(1)= 3.43609e-05 dP(2)= -4.94249e-05
Samples= 9.9e+08 dP(0)= -2.06449e-05 dP(1)= 5.93429e-06 dP(2)= 1.47106e-05
【问题讨论】:
标签: r c++11 random distribution