从列表创建 C++ 离散分布
Create C++ discrete distribution from list
我正在尝试创建 std::discrete_distribution:
http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution
我见过的所有例子都像上面link中那样定义它std::discrete_distribution<> d({40, 10, 10, 40});
但是我不想{40, 10, 10, 40}
而是以编程方式而不是硬编码来执行此操作。
您可以使用为 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 << " times\n";
}
}
std::discrete_distribution
有一个采用迭代器的 constructor overload,因此修改 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 << " times\n";
}
}
可以根据需要加载矢量。这里我使用相同的初始化列表来生成类似的结果。
我正在尝试创建 std::discrete_distribution:
http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution
我见过的所有例子都像上面link中那样定义它std::discrete_distribution<> d({40, 10, 10, 40});
但是我不想{40, 10, 10, 40}
而是以编程方式而不是硬编码来执行此操作。
您可以使用为 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 << " times\n";
}
}
std::discrete_distribution
有一个采用迭代器的 constructor overload,因此修改 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 << " times\n";
}
}
可以根据需要加载矢量。这里我使用相同的初始化列表来生成类似的结果。