使用具有取自数据结构的权重的 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());
完整的示例代码:
#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
我正在尝试使用 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());
完整的示例代码:
#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