#include<iostream>
#include<random>
#include<algorithm>
#include<vector>
#include<sstream>
#include<map>
#include<iomanip>
using namespace std;
void PrintEngineRandValue(default_random_engine& eg)
{
for (int i = 0; i < 6; ++i)
{
cout << eg() << " ";
}
cout << endl;
}
template<typename Distr,typename eng>
void PrintDistr(Distr dis,eng e,const string& name)
{
cout << name << endl;
map<long long, int> vc;
for (int i = 0; i < 2000000; ++i)
{
vc[dis(e)]++;
}
cout << "===" << endl;
for (auto& elem : vc)
{
cout << setw(3) << elem.first << ": " << elem.second << endl;
}
cout << "===" << endl;
}
int main()
{
default_random_engine dre;
uniform_int_distribution<int> di(10,20);
for (int i = 0; i < 20; ++i)
{
cout << di(dre) <<" ";
}
cout << endl;
uniform_real_distribution<double> dr(10, 20);
for (int i = 0; i < 8; ++i)
{
cout << dr(dre) << " ";
}
cout << endl;
vector<int> v{ 1,2,3,4,5,6,7,8,9 };
shuffle(v.begin(), v.end(), dre);
for (auto elem : v)
{
cout << elem << endl;
}
default_random_engine pl;
PrintEngineRandValue(pl);
default_random_engine pk;
PrintEngineRandValue(pk);
default_random_engine pg(54);
PrintEngineRandValue(pg);
stringstream egstatus;
egstatus << pl;
PrintEngineRandValue(pl);
egstatus >> pl;
PrintEngineRandValue(pl);
egstatus.clear();
egstatus.seekg(0);
egstatus >> pl;
pl.discard(2);
PrintEngineRandValue(pl);
knuth_b e;
uniform_real_distribution<> drr(0, 20);
PrintDistr(drr, e, "uniform_real_distribution");
normal_distribution<> zt;
PrintDistr(zt, e, "normal_distribution");
exponential_distribution<> ex;
PrintDistr(ex, e, "exponential_distribution");
gamma_distribution<> ga;
PrintDistr(ga, e, "gamma_distribution");
return 0;
}