1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // REQUIRES: long_tests
13 // template<class RealType = double>
14 // class chi_squared_distribution
16 // template<class _URNG> result_type operator()(_URNG& g);
25 #include "test_macros.h"
38 typedef std::chi_squared_distribution
<> D
;
39 typedef std::minstd_rand G
;
42 const int N
= 1000000;
43 std::vector
<D::result_type
> u
;
44 for (int i
= 0; i
< N
; ++i
)
46 D::result_type v
= d(g
);
50 double mean
= std::accumulate(u
.begin(), u
.end(), 0.0) / u
.size();
54 for (std::size_t i
= 0; i
< u
.size(); ++i
)
56 double dbl
= (u
[i
] - mean
);
63 double dev
= std::sqrt(var
);
64 skew
/= u
.size() * dev
* var
;
65 kurtosis
/= u
.size() * var
* var
;
67 double x_mean
= d
.n();
68 double x_var
= 2 * d
.n();
69 double x_skew
= std::sqrt(8 / d
.n());
70 double x_kurtosis
= 12 / d
.n();
71 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
72 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
73 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
74 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.04);
77 typedef std::chi_squared_distribution
<> D
;
78 typedef std::minstd_rand G
;
81 const int N
= 1000000;
82 std::vector
<D::result_type
> u
;
83 for (int i
= 0; i
< N
; ++i
)
85 D::result_type v
= d(g
);
89 double mean
= std::accumulate(u
.begin(), u
.end(), 0.0) / u
.size();
93 for (std::size_t i
= 0; i
< u
.size(); ++i
)
95 double dbl
= (u
[i
] - mean
);
102 double dev
= std::sqrt(var
);
103 skew
/= u
.size() * dev
* var
;
104 kurtosis
/= u
.size() * var
* var
;
106 double x_mean
= d
.n();
107 double x_var
= 2 * d
.n();
108 double x_skew
= std::sqrt(8 / d
.n());
109 double x_kurtosis
= 12 / d
.n();
110 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
111 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
112 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
113 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.03);
116 typedef std::chi_squared_distribution
<> D
;
117 typedef std::mt19937 G
;
120 const int N
= 1000000;
121 std::vector
<D::result_type
> u
;
122 for (int i
= 0; i
< N
; ++i
)
124 D::result_type v
= d(g
);
128 double mean
= std::accumulate(u
.begin(), u
.end(), 0.0) / u
.size();
132 for (std::size_t i
= 0; i
< u
.size(); ++i
)
134 double dbl
= (u
[i
] - mean
);
135 double d2
= sqr(dbl
);
141 double dev
= std::sqrt(var
);
142 skew
/= u
.size() * dev
* var
;
143 kurtosis
/= u
.size() * var
* var
;
145 double x_mean
= d
.n();
146 double x_var
= 2 * d
.n();
147 double x_skew
= std::sqrt(8 / d
.n());
148 double x_kurtosis
= 12 / d
.n();
149 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
150 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
151 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
152 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.03);