1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <random> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template<class RealType, size_t bits, class URNG> 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// RealType generate_canonical(URNG& g); 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <random> 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef float F; 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, 0>(r); 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef float F; 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, 1>(r); 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef float F; 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef float F; 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef float F; 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef double F; 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, 0>(r); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef double F; 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, 1>(r); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef double F; 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (16807 - E::min() + 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (282475249 - E::min()) * (E::max() - E::min() + F(1))) / 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef double F; 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (16807 - E::min() + 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (282475249 - E::min()) * (E::max() - E::min() + F(1))) / 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::minstd_rand0 E; 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef double F; 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant E r; 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f == 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (16807 - E::min() + 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant (282475249 - E::min()) * (E::max() - E::min() + F(1))) / 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 101