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