【问题标题】:Accuracy: C++11's binomial_distribution<int> not coincide with the what R returns准确性:C++11 的 binomial_distribution<int> 与 R 返回的不一致
【发布时间】: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


    【解决方案1】:

    这确实应该是一条评论。

    我看不出你的数字有什么问题。你正在做 10**9 次重复。因此,根据中心极限定理,您应该看到大约 10**(-4.5) 的精度。这确实是你所看到的。 dP(0) 和 dP(2) 的符号波动是另一个好兆头。如果你多次运行你的程序,最后一行的符号是否总是显示相同的模式。如果没有,那是另一个好兆头。

    在我看来,Btw R 给你的数字太多了。对于双打,你只有大约 15 位数的准确度。

    【讨论】:

    • 您说 R 在证据不足的基础上给出了“过于准确”。提问者设置了非标准显示选项,因为我只看到显示 8 位数字,而且我认为我的设置目前是沼泽标准。
    猜你喜欢
    • 2012-10-21
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多