# include <iostream>
# include <random>
# include <type_traits>
# include <ctime>
namespace detail {
template <typename tType>
struct Select_DistT {
typedef typename std::conditional<
std::is_integral<tType>::value,
std::uniform_int_distribution<tType>,
std::uniform_real_distribution<tType>
>::type type;
};
}
template<typename tType, class DistT = typename detail::Select_DistT<tType>::type>
class Random
{
std::default_random_engine mEngine;
DistT mDistribution;
public:
Random(tType iMin, tType iMax) :
mEngine(time(nullptr)),
mDistribution(iMin, iMax)
{ }
tType operator()()
{
return mDistribution(mEngine);
}
};
int main()
{
Random<int> aRandomInt(0, 4);
for(int i=0; i < 10; ++i)
{
std::cout << aRandomInt() << '\n';
}
Random<double> aRandomDouble(0, 4);
for(int i=0; i < 10; ++i)
{
std::cout << aRandomDouble() << '\n';
}
return 0;
}
IyBpbmNsdWRlIDxpb3N0cmVhbT4KIyBpbmNsdWRlIDxyYW5kb20+CiMgaW5jbHVkZSA8dHlwZV90cmFpdHM+CiMgaW5jbHVkZSA8Y3RpbWU+CgpuYW1lc3BhY2UgZGV0YWlsIHsKCXRlbXBsYXRlIDx0eXBlbmFtZSB0VHlwZT4KCXN0cnVjdCBTZWxlY3RfRGlzdFQgewoJCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKCQkJc3RkOjppc19pbnRlZ3JhbDx0VHlwZT46OnZhbHVlLAoJCQlzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjx0VHlwZT4sCgkJCXN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjx0VHlwZT4KCQkJPjo6dHlwZSB0eXBlOwoJfTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgdFR5cGUsIGNsYXNzIERpc3RUID0gdHlwZW5hbWUgZGV0YWlsOjpTZWxlY3RfRGlzdFQ8dFR5cGU+Ojp0eXBlPgpjbGFzcyBSYW5kb20KewogICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgICAgICAgICAgICAgIG1FbmdpbmU7CiAgICBEaXN0VAkJCQkJCQkJCW1EaXN0cmlidXRpb247CnB1YmxpYzoKICAgIFJhbmRvbSh0VHlwZSBpTWluLCB0VHlwZSBpTWF4KSA6CiAgICAgICAgbUVuZ2luZSh0aW1lKG51bGxwdHIpKSwKICAgICAgICBtRGlzdHJpYnV0aW9uKGlNaW4sIGlNYXgpCiAgICB7IH0KCiAgICB0VHlwZSBvcGVyYXRvcigpKCkKICAgIHsKICAgICAgICByZXR1cm4gbURpc3RyaWJ1dGlvbihtRW5naW5lKTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgUmFuZG9tPGludD4gYVJhbmRvbUludCgwLCA0KTsKICAgIGZvcihpbnQgaT0wOyBpIDwgMTA7ICsraSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgYVJhbmRvbUludCgpIDw8ICdcbic7CiAgICB9CgogICAgUmFuZG9tPGRvdWJsZT4gYVJhbmRvbURvdWJsZSgwLCA0KTsKICAgIGZvcihpbnQgaT0wOyBpIDwgMTA7ICsraSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgYVJhbmRvbURvdWJsZSgpIDw8ICdcbic7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K