In this article we will discuss how to fill a std::vector with random numbers using std::generate.

For this task we will use a STL algorithm std::generate i.e.

template<typename _FIter, typename _Generator> void generate(_FIter start, _FIter end, _Generator gen);

It will update all the elements from range **start** to **end -1** with values generated by **gen** function object.Â Suppose size of vector is n thenÂ std::generateÂ will call the **gen()** n number of times and copyÂ each value to vector from start to end -1 i.e **(start, end]**.

But import point is std::generate() copies the elements i.e. it does not push elements. So, it expects that vector is already has the capacityÂ i.e. vector’s size is already n.

**Advertisements**

## Fill random Numbers in std::vector using Lambda functions

Let’s fill a std::vector of size 10 with random numbers from 0 to 100.Â First of all, initialize a vector with 10 ints of value 0 i.e.

// Initialize a vector with 10 ints of value 0 std::vector<int> vecOfRandomNums(10);

Now fill vector by generating 10 random numbers using lambda function,

// Generate 10 random numbers by lambda func and fill it in vector std::generate(vecOfRandomNums.begin(), vecOfRandomNums.end(), []() { return rand() % 100; });

Here, std::generate iterates the vector from begin to end. During each iteration calls theÂ lambda function and assigns each returned value to corresponding entry in vector.

## Fill Random Numbers in std::vector using a Functor

Define a Functor that will returnÂ a random numbe whenever called i.e.

struct RandomGenerator { int maxValue; RandomGenerator(int max) : maxValue(max) { } int operator()() { return rand() % maxValue; } };

Now fill vector by generating 10 random numbers using above functor i.e,

// Initialize a vector with 10 ints of value 0 std::vector<int> vecOfRandomNums(10); // Generate 10 random numbers by a Functor and fill it in vector std::generate(vecOfRandomNums.begin(), vecOfRandomNums.end(), RandomGenerator(500));

Here, std::generate iterates the vector from begin to end. During each iteration calls the RandomGenerator functorÂ and assigns each returned value to corresponding entry in vector.

[showads ad=inside_post]

Complete example is as follows,

#include <iostream> #include <stdlib.h> #include <vector> #include <algorithm> struct RandomGenerator { int maxValue; RandomGenerator(int max) : maxValue(max) { } int operator()() { return rand() % maxValue; } }; int main() { // Initialize a vector with 10 ints of value 0 std::vector<int> vecOfRandomNums(10); // Generate 10 random numbers by lambda func and fill it in vector std::generate(vecOfRandomNums.begin(), vecOfRandomNums.end(), []() { return rand() % 100; }); std::cout << "Random Number Generated by Lambda Function" << std::endl; for (int val : vecOfRandomNums) std::cout << val << std::endl; // Generate 10 random numbers by a Functor and fill it in vector std::generate(vecOfRandomNums.begin(), vecOfRandomNums.end(), RandomGenerator(500)); std::cout << "Random Number Generated by Functor" << std::endl; for (int val : vecOfRandomNums) std::cout << val << std::endl; return 0; }

To compile the above code use following command

g++ –std=c++11 sample.cpp

**Output:**

Random Number Generated by Lambda Function 83 86 77 15 93 35 86 92 49 21 Random Number Generated by Functor 362 27 190 59 263 426 40 426 172 236

**Advertisements**

Thanks for reading.