11.7. Инициализация контейнера случайными числами

11.7. Инициализация контейнера случайными числами

Проблема

Требуется заполнить произвольный контейнер случайными числами.

Решение

Можно использовать функции generate и generate_n из заголовочного файла <algorithm> совместно с функтором, возвращающим случайные числа. Пример 11.13 показывает, как это можно сделать.

Пример 11.13. Инициализация контейнеров случайными числами

#include <algorithm>

#include <vector>

#include <iterator>

#include <iostream>

#include <cstdlib>

using namespace std;

struct RndIntGen {

 RndIntGen(int l, int h) : low(l), high(h) {}

 int operator()() const {

  return low + (rand() % ((high - low) + 1));

 }

private:

 int low;

 int high;

};

int main() {

 srand(static_cast<unsigned int>(clock()));

 vector<mt> v(5);

 generate(v.begin(), v.end(), RndIntGen(1, 6));

 copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

}

Программа примера 11.13 должна выдать результат, подобный следующему.

3

1

2

6

4

Обсуждение

Стандартная библиотека C++ содержит функции generate и generate_n, специально предназначенные для заполнения контейнеров значениями, полученными функцией генератора случайных чисел. Эти функции принимают нуль-арный функтор (указатель на функцию или объект-функцию без аргументов), результат которого присваивается соседним элементам контейнера. Пример реализации функции generate и generate_n показан в примере 11.14.

Пример 11.14. Пример реализации функций generate и generate_n

template<class Iter_T, class Fxn_T>

void generate(Iter_T first, Iter_T last, Fxn_T f) {

 while (first != last) *first++ = f();

}

template<class Iter_T, class Fxn_T>

void generate_n(Iter_T first, int n, Fxn_T f) {

 for (int i=0; i < n; ++i) *first++ = f();

}