使用具有取自数据结构的权重的 C++ 离散分布

Using C++ discrete distribution with weights taken from a data structure

我正在尝试使用 discrete distribution (here too。然而,正如您在示例中看到的那样,您可以通过以下方式做到这一点:

std::discrete_distribution<int> distribution {2,2,1,1,2,2,1,1,2,2};

 std::discrete_distribution<> d({40, 10, 10, 40});

如果您有 10 个或 4 个带权重的元素,这很好。 (也不知道要不要加括号)

但我想将其用于 1000 个元素。 我将这些元素放在一个结构向量中,例如:

struct Particle{
   double weight;
};

std::vector<Particle> particles;

如您所见,此向量的每个元素都有一个权重。我想用那个权重来初始化离散分布。

我可以在一个很长的句子中一个一个地写,但我不认为那样做。 如何将向量的权重放在离散分布的声明中?

您可以将所有权重放入 std::vector<double> weights;,然后您可以将离散分布初始化为 std::discrete_distribution<> distr(weights.begin(), weights.end());。代码:

std::vector<double> weights;
for (auto const & p: particles)
    weights.push_back(p.weight);
std::discrete_distribution<> distr(weights.begin(), weights.end());

完整的示例代码:

Try it online!

#include <random>
#include <vector>
#include <iostream>

int main() {
    struct Particle {
        double weight = 0;
    };
    std::vector<Particle> particles({{1}, {2}, {3}, {4}});
    std::vector<double> weights;
    for (auto const & p: particles)
        weights.push_back(p.weight);
    std::discrete_distribution<size_t> distr(weights.begin(), weights.end());
    std::random_device rd;
    for (size_t i = 0; i < 20; ++i)
        std::cout << distr(rd) << " ";
}

输出:

1 3 3 3 2 0 2 1 3 2 3 2 2 1 1 3 1 0 3 1