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 IntType = int>
14 // class negative_binomial_distribution
16 // template<class _URNG> result_type operator()(_URNG& g, const param_type& parm);
24 #include "test_macros.h"
37 typedef std::negative_binomial_distribution
<> D
;
38 typedef D::param_type P
;
39 typedef std::minstd_rand G
;
43 const int N
= 1000000;
44 std::vector
<D::result_type
> u
;
45 for (int i
= 0; i
< N
; ++i
)
47 D::result_type v
= d(g
, p
);
48 assert(d
.min() <= v
&& v
<= d
.max());
51 double mean
= std::accumulate(u
.begin(), u
.end(),
52 double(0)) / u
.size();
56 for (unsigned i
= 0; i
< u
.size(); ++i
)
58 double dbl
= (u
[i
] - mean
);
65 double dev
= std::sqrt(var
);
66 skew
/= u
.size() * dev
* var
;
67 kurtosis
/= u
.size() * var
* var
;
69 double x_mean
= p
.k() * (1 - p
.p()) / p
.p();
70 double x_var
= x_mean
/ p
.p();
71 double x_skew
= (2 - p
.p()) / std::sqrt(p
.k() * (1 - p
.p()));
72 double x_kurtosis
= 6. / p
.k() + sqr(p
.p()) / (p
.k() * (1 - p
.p()));
73 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
74 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
75 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.01);
76 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.03);
79 typedef std::negative_binomial_distribution
<> D
;
80 typedef D::param_type P
;
81 typedef std::mt19937 G
;
85 const int N
= 1000000;
86 std::vector
<D::result_type
> u
;
87 for (int i
= 0; i
< N
; ++i
)
89 D::result_type v
= d(g
, p
);
90 assert(d
.min() <= v
&& v
<= d
.max());
93 double mean
= std::accumulate(u
.begin(), u
.end(),
94 double(0)) / u
.size();
98 for (unsigned i
= 0; i
< u
.size(); ++i
)
100 double dbl
= (u
[i
] - mean
);
101 double d2
= sqr(dbl
);
107 double dev
= std::sqrt(var
);
108 skew
/= u
.size() * dev
* var
;
109 kurtosis
/= u
.size() * var
* var
;
111 double x_mean
= p
.k() * (1 - p
.p()) / p
.p();
112 double x_var
= x_mean
/ p
.p();
113 double x_skew
= (2 - p
.p()) / std::sqrt(p
.k() * (1 - p
.p()));
114 double x_kurtosis
= 6. / p
.k() + sqr(p
.p()) / (p
.k() * (1 - p
.p()));
115 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
116 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
117 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.02);
118 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.1);
121 typedef std::negative_binomial_distribution
<> D
;
122 typedef D::param_type P
;
123 typedef std::mt19937 G
;
127 const int N
= 1000000;
128 std::vector
<D::result_type
> u
;
129 for (int i
= 0; i
< N
; ++i
)
131 D::result_type v
= d(g
, p
);
132 assert(d
.min() <= v
&& v
<= d
.max());
135 double mean
= std::accumulate(u
.begin(), u
.end(),
136 double(0)) / u
.size();
140 for (unsigned i
= 0; i
< u
.size(); ++i
)
142 double dbl
= (u
[i
] - mean
);
143 double d2
= sqr(dbl
);
149 double dev
= std::sqrt(var
);
150 skew
/= u
.size() * dev
* var
;
151 kurtosis
/= u
.size() * var
* var
;
153 double x_mean
= p
.k() * (1 - p
.p()) / p
.p();
154 double x_var
= x_mean
/ p
.p();
155 double x_skew
= (2 - p
.p()) / std::sqrt(p
.k() * (1 - p
.p()));
156 double x_kurtosis
= 6. / p
.k() + sqr(p
.p()) / (p
.k() * (1 - p
.p()));
157 assert(std::abs((mean
- x_mean
) / x_mean
) < 0.01);
158 assert(std::abs((var
- x_var
) / x_var
) < 0.01);
159 assert(std::abs((skew
- x_skew
) / x_skew
) < 0.02);
160 assert(std::abs((kurtosis
- x_kurtosis
) / x_kurtosis
) < 0.08);