#include <algorithm>
#include <iostream>
#include <vector>

int random_number(int N) // random value in [0, N)
{
	static std::random_device seed;
	static std::mt19937 eng(seed());
	std::uniform_int_distribution<> dist(0, N - 1);
	return dist(eng);
}

std::vector<int> random_sample(int first, int last, int n)
{
	std::vector<int> numbers;
	int remaining = last - first + 1;
	int m = std::min(n, remaining);
	while (m > 0) {
		if (random_number(remaining) < m) {
			numbers.push_back(first);
			--m;
		}
		--remaining;
		++first;
	}
	return numbers;
}

int main()
{
	auto numbers = random_sample(1, 100, 20);
	for (int value : numbers) {
		std::cout << value << " ";
	}
	std::cout << '\n';
}
