I have a class which has some data stored in a vector and a method that is supposed to select a random element and return it, but when I run it, it returns the same element every time.
Here is a simplified example based on my code:
#include <iostream> #include <random> #include <vector> class MyObj{ private: std::vector<int> set_data; public: MyObj(int num_elements){ for (int i = 0; i < num_elements; ++i){ set_data.push_back(i); // just so that there is some data in there } }; int getRandomElement(std::mt19937 rng){ std::uniform_int_distribution<int> uni(0,set_data.size()-1); int idx = uni(rng); return set_data[idx]; }; }; int main() { std::random_device r; std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; std::mt19937 rng = std::mt19937(seed); MyObj temp(50); for (int i = 0; i < 20; i++){ std::cout << "getting random element: " << temp.getRandomElement(rng) << std::endl; } } and the output is:
getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 getting random element: 19 Is there anything obvious that i have done wrong here?
std::mt19937has a lot of state AFAIK)std::endldoes?'\n'ends a line.std::cout << "hello\n";, that would make more sense thanstd::cout << "hello" << std::endl;, but as i would have to start a new string anyway, it isn't very far from"\n"tostd::endl.. also i find it helpful to flush the buffer when debugging stuff..