3

I am trying to use discrete distribution (here too. However as you see in the examples you do this by writing:

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

or

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

which is fine if you have 10 or four elements with weights. (also I don't know if the parenthesis are necessary)

But I want to use this for 1000 elements. I have these elements in a vector of structs such as:

struct Particle{
   double weight;
};

std::vector<Particle> particles;

as you can see each element of this vector has a weight. I want to use that weight to initialize the discrete distribution.

I could go writing one by one in a very long sentence, but I don't think that is the way. How can I put the weights of the vector in the declaration of the discrete distribution?

KansaiRobot
  • 7,564
  • 11
  • 71
  • 150
  • 1
    Hi! Take a look at the answer on this question: https://stackoverflow.com/questions/31153610/setting-up-a-discrete-distribution-in-c – Ayushya Dec 20 '20 at 05:21
  • 1
    If you have any container with weights, e.g. `vector weights;` you can just do `std::discrete_distribution<> distr(weights.begin(), weights.end());` – Arty Dec 20 '20 at 05:22

1 Answers1

2

You may put your all weights into std::vector<double> weights;, then you can initialize your discrete distribution as std::discrete_distribution<> distr(weights.begin(), weights.end());. Code:

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

Full working example code:

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) << " ";
}

Output:

1 3 3 3 2 0 2 1 3 2 3 2 2 1 1 3 1 0 3 1 
Arty
  • 14,883
  • 6
  • 36
  • 69