从列表中创建离散分布C++

Create C++ discrete distribution from list

本文关键字:分布 C++ 创建 列表      更新时间:2023-10-16

我正在尝试创建一个std::d iscrete_distribution:

http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution

我看到的所有示例都像上面的链接一样定义它std::discrete_distribution<> d({40, 10, 10, 40});

但与其{40, 10, 10, 40},我想以编程方式执行此操作,而不是硬编码。

std::discrete_distribution有一个接受迭代器的构造函数重载,因此修改 cppreference 的示例以使用std::vector

#include <iostream>
#include <map>
#include <random>
#include <vector>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::vector<int> list{40, 10, 10, 40};
std::discrete_distribution<> d(list.begin(), list.end());
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[d(gen)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " timesn";
}
}

矢量可以随心所欲地加载。在这里,我使用相同的初始值设定项列表来生成类似的结果。

您可以使用为discrete_distribution定义的另一个构造函数,该构造函数需要一对迭代器。我刚刚修改了 en.cppreference.com 的代码,以便discrete_distribution需要一对迭代器。

#include <iostream>
#include <map>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::array<int, 4> a{40, 10, 10, 40};
std::discrete_distribution<> d(a.begin(), a.end());
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[d(gen)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " timesn";
}
}