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