#include <iostream>
#include <limits>
#include <random>
#include <type_traits>
template <typename TYPE>
std::uniform_int_distribution<TYPE> getDice(std::true_type)
{
return std::uniform_int_distribution<TYPE>(std::numeric_limits<TYPE>::min(), std::numeric_limits<TYPE>::max());
}
template <typename TYPE>
std::uniform_real_distribution<TYPE> getDice(std::false_type)
{
return std::uniform_real_distribution<TYPE>(std::numeric_limits<TYPE>::min(), std::numeric_limits<TYPE>::max());
}
template<typename TYPE>
TYPE generateRandom()
{
std::random_device randomDevice;
std::mt19937_64 generator(randomDevice());
auto dice = getDice<TYPE>(std::integral_constant<bool, std::numeric_limits<TYPE>::is_integer>());
return dice(generator);
}
int main()
{
float r1 = generateRandom<float>();
double r2 = generateRandom<double>();
int r3 = generateRandom<int>();
long r4 = generateRandom<long>();
std::cout << "r1: " << r1 << std::endl;
std::cout << "r2: " << r2 << std::endl;
std::cout << "r3: " << r3 << std::endl;
std::cout << "r4: " << r4 << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4Kc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248VFlQRT4gZ2V0RGljZShzdGQ6OnRydWVfdHlwZSkKewogICByZXR1cm4gc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248VFlQRT4oc3RkOjpudW1lcmljX2xpbWl0czxUWVBFPjo6bWluKCksIHN0ZDo6bnVtZXJpY19saW1pdHM8VFlQRT46Om1heCgpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CnN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxUWVBFPiBnZXREaWNlKHN0ZDo6ZmFsc2VfdHlwZSkKewogICByZXR1cm4gc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPFRZUEU+KHN0ZDo6bnVtZXJpY19saW1pdHM8VFlQRT46Om1pbigpLCBzdGQ6Om51bWVyaWNfbGltaXRzPFRZUEU+OjptYXgoKSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+ClRZUEUgZ2VuZXJhdGVSYW5kb20oKQp7CiAgIHN0ZDo6cmFuZG9tX2RldmljZSByYW5kb21EZXZpY2U7CiAgIHN0ZDo6bXQxOTkzN182NCBnZW5lcmF0b3IocmFuZG9tRGV2aWNlKCkpOwogICBhdXRvIGRpY2UgPSBnZXREaWNlPFRZUEU+KHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjpudW1lcmljX2xpbWl0czxUWVBFPjo6aXNfaW50ZWdlcj4oKSk7CiAgIHJldHVybiBkaWNlKGdlbmVyYXRvcik7Cn0KCmludCBtYWluKCkKewogICBmbG9hdCByMSA9IGdlbmVyYXRlUmFuZG9tPGZsb2F0PigpOwogICBkb3VibGUgcjIgPSBnZW5lcmF0ZVJhbmRvbTxkb3VibGU+KCk7CiAgIGludCByMyA9IGdlbmVyYXRlUmFuZG9tPGludD4oKTsKICAgbG9uZyByNCA9IGdlbmVyYXRlUmFuZG9tPGxvbmc+KCk7CgogICBzdGQ6OmNvdXQgPDwgInIxOiAiIDw8IHIxIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJyMjogIiA8PCByMiA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAicjM6ICIgPDwgcjMgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgInI0OiAiIDw8IHI0IDw8IHN0ZDo6ZW5kbDsKfQoK