Генерация случайных чисел в шаблоне

Как можно сгенерировать случайные числа в шаблоне? По заданию нужно создать шаблон матрицы, для последующих операций с ней(например умножение). Так вот, как можно сгенерировать случайные числа в зависимости от того, какой тип данных передадим в шаблон(int, double, unsigned int...). То есть для интов будет генерировать целочисленные значения, для типа double с плавающей точкой. Как можно реализовать такую генерацию?


Ответы (1 шт):

Автор решения: Ariox

С точки зрения алгоритмов, использующих результат генерации, способ генерации не имеет значения - алгоритм просто должен получить случайный объект и вставить его, куда нужно. Поэтому стандартный способ - передавать в качестве аргумента функциональный объект, возвращающий случайное число.

Простейший генератор:

auto gen = []{ return 42; };

ПРимер использования со стандартной функцией:

std::vector<int> v(5);
std::generate(v.begin(), v.end(), gen );
assert(v == std::vector<int>{42, 42, 42, 42, 42});

Вам нужно поступать аналогичным образом: генератор - это то, что определяет пользователь, он сам знает, какой тип ему нужно генерировать - вы просто должны использовать переданный генератор.

Принцип такой:

template<class T>
class Matrix{
   std::vector<T> data;
public: 
   template<class Gen>
   Matrix(std::size_t rows, std::size_t cols, Gen gen){
       data.reserve(rows * cols);
       std::generate_n(std::back_inserter(data), data.size(), gen);
   }
}

Стандартная генерация случайных строится на основе универсального генератора (обычно std::mt19937 или std::mt19937_64) и функции распределения, например, uniform_int_distribution<int> или uniform_real_distribution<float>. Используются примерно так:

std::size_t seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 rand(seed);
std::uniform_real_distribution<double> dist(-5., 200.);

double randValue1 = dist(rand);

auto gen = [&rand, dist]{ return dist(rand); } 

double randValue2 = gen();

Matrix<double> m(42, 12, gen);

Если нужно получить, например, матрицу случайных string - нет проблем: пишем функцию, которая генерирует размер строки и случайные символы строки, передаем эту функцию в качестве генератора.

→ Ссылка