#include <iostream>
#include <random>
#include <ctime>
#include <algorithm>
#include <cstdint>
#include <vector>
#include <memory>

const int N = 100;
const int NSEEDS = 10;

typedef std::vector<std::unique_ptr<int>> Vui;

int main()
{
  std::uint32_t seeds[NSEEDS];
  auto t = std::time(nullptr);

  for (std::size_t i = 0; i < NSEEDS; i++)
    if (seeds[i] == 0)
      seeds[i] = t * (i + 3) ;

  std::seed_seq seed_seq(seeds, seeds + NSEEDS);
  std::mt19937 twister(seed_seq);
  std::uniform_int_distribution<int> distribution(0, INT32_MAX);

  Vui v;

  for (int i = 0; i < N; i++)
    v.push_back(std::unique_ptr<int>(new int(distribution(twister))));

  for (auto i = 0U; i < v.size(); i++)
    std::cout << *v[i].get() << ' ';
  std::cout << std::endl;

  std::sort(std::begin(v), std::end(v), [](const std::unique_ptr<int>& u, const std::unique_ptr<int>& v) { return *u.get() < *v.get(); });

  for (auto i = 0U; i < v.size(); i++)
    std::cout << *v[i].get() << ' ';
  std::cout << std::endl;
}
