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