1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// REQUIRES: long_tests
10
11// <random>
12
13// template<class RealType = double>
14// class student_t_distribution
15
16// template<class _URNG> result_type operator()(_URNG& g);
17
18#include <random>
19#include <cassert>
20#include <cmath>
21#include <numeric>
22#include <vector>
23
24#include "test_macros.h"
25
26template <class T>
27inline
28T
29sqr(T x)
30{
31 return x * x;
32}
33
34int main(int, char**)
35{
36 {
37 typedef std::student_t_distribution<> D;
38 typedef std::minstd_rand G;
39 G g;
40 D d(5.5);
41 const int N = 1000000;
42 std::vector<D::result_type> u;
43 for (int i = 0; i < N; ++i)
44 u.push_back(d(g));
45 double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
46 double var = 0;
47 double skew = 0;
48 double kurtosis = 0;
49 for (unsigned i = 0; i < u.size(); ++i)
50 {
51 double dbl = (u[i] - mean);
52 double d2 = sqr(dbl);
53 var += d2;
54 skew += dbl * d2;
55 kurtosis += d2 * d2;
56 }
57 var /= u.size();
58 double dev = std::sqrt(x: var);
59 skew /= u.size() * dev * var;
60 kurtosis /= u.size() * var * var;
61 kurtosis -= 3;
62 double x_mean = 0;
63 double x_var = d.n() / (d.n() - 2);
64 double x_skew = 0;
65 double x_kurtosis = 6 / (d.n() - 4);
66 assert(std::abs(mean - x_mean) < 0.01);
67 assert(std::abs((var - x_var) / x_var) < 0.01);
68 assert(std::abs(skew - x_skew) < 0.05);
69 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.2);
70 }
71 {
72 typedef std::student_t_distribution<> D;
73 typedef std::minstd_rand G;
74 G g;
75 D d(10);
76 const int N = 1000000;
77 std::vector<D::result_type> u;
78 for (int i = 0; i < N; ++i)
79 u.push_back(d(g));
80 double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
81 double var = 0;
82 double skew = 0;
83 double kurtosis = 0;
84 for (unsigned i = 0; i < u.size(); ++i)
85 {
86 double dbl = (u[i] - mean);
87 double d2 = sqr(dbl);
88 var += d2;
89 skew += dbl * d2;
90 kurtosis += d2 * d2;
91 }
92 var /= u.size();
93 double dev = std::sqrt(x: var);
94 skew /= u.size() * dev * var;
95 kurtosis /= u.size() * var * var;
96 kurtosis -= 3;
97 double x_mean = 0;
98 double x_var = d.n() / (d.n() - 2);
99 double x_skew = 0;
100 double x_kurtosis = 6 / (d.n() - 4);
101 assert(std::abs(mean - x_mean) < 0.01);
102 assert(std::abs((var - x_var) / x_var) < 0.01);
103 assert(std::abs(skew - x_skew) < 0.05);
104 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.04);
105 }
106 {
107 typedef std::student_t_distribution<> D;
108 typedef std::minstd_rand G;
109 G g;
110 D d(100);
111 const int N = 1000000;
112 std::vector<D::result_type> u;
113 for (int i = 0; i < N; ++i)
114 u.push_back(d(g));
115 double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
116 double var = 0;
117 double skew = 0;
118 double kurtosis = 0;
119 for (unsigned i = 0; i < u.size(); ++i)
120 {
121 double dbl = (u[i] - mean);
122 double d2 = sqr(dbl);
123 var += d2;
124 skew += dbl * d2;
125 kurtosis += d2 * d2;
126 }
127 var /= u.size();
128 double dev = std::sqrt(x: var);
129 skew /= u.size() * dev * var;
130 kurtosis /= u.size() * var * var;
131 kurtosis -= 3;
132 double x_mean = 0;
133 double x_var = d.n() / (d.n() - 2);
134 double x_skew = 0;
135 double x_kurtosis = 6 / (d.n() - 4);
136 assert(std::abs(mean - x_mean) < 0.01);
137 assert(std::abs((var - x_var) / x_var) < 0.01);
138 assert(std::abs(skew - x_skew) < 0.005);
139 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.2);
140 }
141
142 return 0;
143}
144

source code of libcxx/test/std/numerics/rand/rand.dist/rand.dist.norm/rand.dist.norm.t/eval.pass.cpp