#include <iostream>
#include <memory>
#include <numeric>
#include <random>
#include <unordered_map>

int main() {
  constexpr std::size_t min = 12345;
  constexpr std::size_t max = 87654321;
  constexpr std::size_t size = 8;

  std::random_device device;
  std::mt19937 engine{device()};
  std::unique_ptr<std::size_t[]> array{new std::size_t[size]};
  std::unordered_map<std::size_t, std::size_t> map;

  map.reserve(max - min - size + 1);
  std::iota(array.get(), array.get() + size, min);

  for (std::size_t i = 0; i != size; ++i) {
    std::uniform_int_distribution<std::size_t> dist{i, max - min};
    auto index = dist(engine);
    std::swap(array[i], index < size
                            ? array[index]
                            : map.insert({index, min + index}).first->second);
  }

  if (size != 0) {
    std::cout << array[0];
    for (size_t i = 1; i != size; ++i) std::cout << ", " << array[i];
    std::cout << "\n";
  }
}
