Генератор псевдослучайных чисел заполняет вектор одинаковыми числами
Вот есть генератор псевдослучайных чисел:
template <typename Number>
class Uniform
{
mt19937 rng;
uniform_real_distribution<Number> vg;
public:
explicit Uniform(size_t seed = 5512943)
: rng(seed), vg(Number(-1), Number(+1)) {}
Number operator()() { return vg(rng); }
};
Мне нужно создать функцию, которая заполняла бы вектор через generate. Чуть ниже можно посмотреть, как я это пробовал реализовать. Ошибок нет, числа есть, проблема в том, что числа эти всегда одни и теже. Вопрос в том, как мне исправить данную ситуацию?
template <typename RanIT> // RanIT тип итератора
void vector_filling(RanIT from, RanIT to, size_t n)
{
Uniform <double> gen;
for (auto it = from; it < to; ++it)
{
it->resize(n);
generate(it->begin(), it->end(), gen);
}
}
Ответы (1 шт):
Инициализируйте свой генератор случайным значением так:
explicit Uniform(size_t seed = random_device()())
Только у меня встречный вопрос: как вы себе представляете работу
void vector_filling(RanIT from, RanIT to, size_t n)
Если у вас уже есть начальный и конечный итераторы - зачем вам n? Если конечного итератора нет - то что вы передаете? Какой смысл в каждой итерации делать resize? Да и сравнивать итераторы лучше на равенство. Еще - у вас итераторы идут как параметр шаблона, а генератор - строго double. Почему не получать этот тип из типа итератора, например? Или хотя бы дать его как параметр шаблона?
Есть и другие вопросы, но ограничусь пока этими. Вопросы не риторические, но ответьте на них самому себе - это как намеки, что код можно существенно улучшить.