1321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant//===----------------------------------------------------------------------===//
2321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant//
3321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant//                     The LLVM Compiler Infrastructure
4321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward 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.
7321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant//
8321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant//===----------------------------------------------------------------------===//
9d9144e8d1783617b279146f397a6ab3defefefc4Jonathan Roelofs//
10d9144e8d1783617b279146f397a6ab3defefefc4Jonathan Roelofs// REQUIRES: long_tests
11321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
12321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant// <random>
13321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
14321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant// template<class RealType = double>
15321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant// class student_t_distribution
16321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
17321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant// template<class _URNG> result_type operator()(_URNG& g);
18321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
19321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant#include <random>
20321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant#include <cassert>
21321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant#include <vector>
22321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant#include <numeric>
23321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
24321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnanttemplate <class T>
25321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnantinline
26321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward HinnantT
27321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnantsqr(T x)
28321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant{
29321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    return x * x;
30321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant}
31321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant
32321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnantint main()
33321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant{
34321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    {
35321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::student_t_distribution<> D;
36321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::minstd_rand G;
37321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        G g;
38321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        D d(5.5);
39321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        const int N = 1000000;
40321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        std::vector<D::result_type> u;
41321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        for (int i = 0; i < N; ++i)
42321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            u.push_back(d(g));
43321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
44321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double var = 0;
45321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double skew = 0;
46321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double kurtosis = 0;
47a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier        for (unsigned i = 0; i < u.size(); ++i)
48321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        {
49d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double dbl = (u[i] - mean);
50d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double d2 = sqr(dbl);
51321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            var += d2;
52d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            skew += dbl * d2;
53321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            kurtosis += d2 * d2;
54321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        }
55321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        var /= u.size();
56321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double dev = std::sqrt(var);
57321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        skew /= u.size() * dev * var;
58321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis /= u.size() * var * var;
59321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis -= 3;
60321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_mean = 0;
61321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_var = d.n() / (d.n() - 2);
62321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_skew = 0;
63321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_kurtosis = 6 / (d.n() - 4);
64321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(mean - x_mean) < 0.01);
65d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
66321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(skew - x_skew) < 0.01);
67d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.2);
68321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    }
69321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    {
70321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::student_t_distribution<> D;
71321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::minstd_rand G;
72321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        G g;
73321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        D d(10);
74321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        const int N = 1000000;
75321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        std::vector<D::result_type> u;
76321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        for (int i = 0; i < N; ++i)
77321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            u.push_back(d(g));
78321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
79321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double var = 0;
80321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double skew = 0;
81321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double kurtosis = 0;
82a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier        for (unsigned i = 0; i < u.size(); ++i)
83321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        {
84d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double dbl = (u[i] - mean);
85d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double d2 = sqr(dbl);
86321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            var += d2;
87d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            skew += dbl * d2;
88321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            kurtosis += d2 * d2;
89321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        }
90321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        var /= u.size();
91321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double dev = std::sqrt(var);
92321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        skew /= u.size() * dev * var;
93321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis /= u.size() * var * var;
94321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis -= 3;
95321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_mean = 0;
96321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_var = d.n() / (d.n() - 2);
97321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_skew = 0;
98321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_kurtosis = 6 / (d.n() - 4);
99321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(mean - x_mean) < 0.01);
100d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
101321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(skew - x_skew) < 0.01);
102d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.04);
103321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    }
104321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    {
105321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::student_t_distribution<> D;
106321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        typedef std::minstd_rand G;
107321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        G g;
108321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        D d(100);
109321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        const int N = 1000000;
110321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        std::vector<D::result_type> u;
111321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        for (int i = 0; i < N; ++i)
112321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            u.push_back(d(g));
113321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
114321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double var = 0;
115321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double skew = 0;
116321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double kurtosis = 0;
117a2cd27094316a83e188727fe0478b5f0dfd0a055Eric Fiselier        for (unsigned i = 0; i < u.size(); ++i)
118321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        {
119d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double dbl = (u[i] - mean);
120d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            double d2 = sqr(dbl);
121321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            var += d2;
122d6c0cf0ebdfd1d237fe7e07ab3732467dbd14c91Eric Fiselier            skew += dbl * d2;
123321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant            kurtosis += d2 * d2;
124321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        }
125321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        var /= u.size();
126321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double dev = std::sqrt(var);
127321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        skew /= u.size() * dev * var;
128321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis /= u.size() * var * var;
129321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        kurtosis -= 3;
130321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_mean = 0;
131321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_var = d.n() / (d.n() - 2);
132321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_skew = 0;
133321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        double x_kurtosis = 6 / (d.n() - 4);
134321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(mean - x_mean) < 0.01);
135d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((var - x_var) / x_var) < 0.01);
136321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant        assert(std::abs(skew - x_skew) < 0.01);
137d6d1171f2c3f254582ae1d5b9e14cea0ea8e701bHoward Hinnant        assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.02);
138321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant    }
139321b4bb7ae50ef318c51ec58db550d7846c3edaeHoward Hinnant}
140