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