//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // <random> // template<class RealType, size_t bits, class URNG> // RealType generate_canonical(URNG& g); #include <random> #include <cassert> int main() { { typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, 0>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, 1>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef float F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, 0>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, 1>(r); assert(f == (16807 - E::min()) / (E::max() - E::min() + F(1))); } { typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits - 1>(r); assert(f == (16807 - E::min() + (282475249 - E::min()) * (E::max() - E::min() + F(1))) / ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); } { typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits>(r); assert(f == (16807 - E::min() + (282475249 - E::min()) * (E::max() - E::min() + F(1))) / ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); } { typedef std::minstd_rand0 E; typedef double F; E r; F f = std::generate_canonical<F, std::numeric_limits<F>::digits + 1>(r); assert(f == (16807 - E::min() + (282475249 - E::min()) * (E::max() - E::min() + F(1))) / ((E::max() - E::min() + F(1)) * (E::max() - E::min() + F(1)))); } }