从具有误差范围的分布中采样

时间:2014-10-15 03:50:24

标签: math random statistics distribution

以下代码对加权随机分布进行抽样,作为模拟的一部分,代表100k个人可能采取的选项(例如:投票等)。

有两种可能的选项,权重分别为30%和70%。

#include <iostream>
#include <random>

int main()
{
   int option0 = 30; //30%
   int option1 = 70; //30%

   std::vector<int> option({0,0});

   std::random_device rd;
   std::mt19937 gen(rd());
   std::discrete_distribution<> d({option0,option1});

   for (int n=0; n < 100000; ++n)
   {
      ++option[d(gen)];
   }

   std::cout << "Option 0: " << option[0] << std::endl;
   std::cout << "Option 1: " << option[1] << std::endl;

   return 0;
}

问题:

如果通过使用抽样对人口进行调查得出上述百分比(权重),并且margin of error被确定为 5% 。< / p>

如何修改上述模拟以考虑(又名合并) 5%的误差范围?

1 个答案:

答案 0 :(得分:0)

因为您确切地知道误差范围,所以您可以使用修改权重 一个随机生成的double(介于-5.0和5.0之间),然后运行您提出的模拟。

此功能将模拟所需的误差范围:

void
simulating_margin_of_error(std::mt19937 gen, double marginOfError,
                           int* option0, int* option1)
{
    std::uniform_real_distribution<double>
        distribution(-marginOfError,marginOfError);
    double number = distribution(gen);

    *option0 += (int) number;
    *option1 += - (int) number;
}

你可以在这里加入:

[...]
std::mt19937 gen(rd());
simulating_margin_of_error(gen, 5.0, &option0, &option1);
std::discrete_distribution<> d({option0, option1});
[...]