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 = double>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class uniform_real_distribution
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template<class _URNG> result_type operator()(_URNG& g, const param_type& parm);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <random>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant#include <vector>
20df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant#include <numeric>
21df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant
22df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnanttemplate <class T>
23df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnantinline
24df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard HinnantT
25df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnantsqr(T x)
26df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant{
27df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant    return x * x;
28df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant}
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::uniform_real_distribution<> D;
34df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        typedef std::minstd_rand G;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef D::param_type P;
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        G g;
37df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D d(5.5, 25);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        P p(-10, 20);
39df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        const int N = 100000;
40df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        std::vector<D::result_type> u;
41df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        for (int i = 0; i < N; ++i)
42df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        {
43df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type v = d(g, p);
44df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            assert(p.a() <= v && v < p.b());
45df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            u.push_back(v);
46df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        }
47df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type mean = std::accumulate(u.begin(), u.end(),
48df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant                                              D::result_type(0)) / u.size();
49df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type var = 0;
50df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type skew = 0;
51df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type kurtosis = 0;
52df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        for (int i = 0; i < u.size(); ++i)
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
54df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type d = (u[i] - mean);
55df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            D::result_type d2 = sqr(d);
56df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            var += d2;
57df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            skew += d * d2;
58df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant            kurtosis += d2 * d2;
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
60df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        var /= u.size();
61df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type dev = std::sqrt(var);
62df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        skew /= u.size() * dev * var;
63df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis /= u.size() * var * var;
64df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        kurtosis -= 3;
65df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type x_mean = (p.a() + p.b()) / 2;
66df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type x_var = sqr(p.b() - p.a()) / 12;
67df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type x_skew = 0;
68df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        D::result_type x_kurtosis = -6./5;
69d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((mean - x_mean) / x_mean) < 0.01);
70d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
71df40dc6c1a8ca0bf00fb6aec030f69042f61d974Howard Hinnant        assert(std::abs(skew - x_skew) < 0.01);
72d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
75