从列表创建 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";
    }
}

可以根据需要加载矢量。这里我使用相同的初始化列表来生成类似的结果。