- #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