/**
 * Sergey Kopeliovich (burunduk30@gmail.com)
 */

#include <random> // Всё полезное в нашем примере берётся именно отсюда.
#include <iostream> 
#include <chrono> 

using namespace std; 

// Рандому можно указывать сид (начальное значение).
mt19937 rng(239);
// В качестве начального значение можно использовать время (чтобы при каждом запуске получать новые случайные числа). 
// Никогда не делайте так при тестировании нетривиального кода.
mt19937 rng2(chrono::steady_clock::now().time_since_epoch().count());
// 64-битные числа.
mt19937_64 rng3(239);

int main(){
	cout << rng() << '\n'; // случайное 32-битное число, [0,2^{32})

	int a = 5, b = 7;
	// Кустарный способ получить целое число от a до b:
	cout << a + rng() % (b - a + 1) << '\n';
	// Способ из коробки получить целое число от a до b:
	uniform_int_distribution<> gen_int(a, b);
	cout << gen_int(rng) << '\n';

	// Кустарный способ получить вещественное число от a до b:
	cout << a + (double)rng() / mt19937::max() * (b - a) << '\n';
	// Способ из коробки получить вещественное число от a до b:
	uniform_real_distribution<> gen_real(a, b);
	cout << gen_real(rng) << '\n'; 

	vector<int> v{1, 2, 3};
	int a[] = {1, 2, 3};
	// random_shuffle использует rand() и удалён в C++17
	// Правильный способ перемешивать массив/вектор:
	shuffle(begin(v), end(v), rng); 
	shuffle(begin(a), end(a), rng); 
	for(int x: v)
		cout << x << ' ';
	cout << endl;

	// Для любителей всё делать в одну строку:
	shuffle(begin(a), end(), mt19937());

	// random_shuffle, rand : DEPRECATED
	// Пожалуйста, не пользуйтесь устаревшим функционалом.
}