以下代码对加权随机分布进行抽样,作为模拟的一部分,代表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%的误差范围?
答案 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});
[...]