]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.exp/eval.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / numerics / rand / rand.dis / rand.dist.pois / rand.dist.pois.exp / eval.pass.cpp
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 // REQUIRES: long_tests
11
12 // <random>
13
14 // template<class RealType = double>
15 // class exponential_distribution
16
17 // template<class _URNG> result_type operator()(_URNG& g);
18
19 #include <random>
20 #include <cassert>
21 #include <vector>
22 #include <numeric>
23 #include <cstddef>
24
25 template <class T>
26 inline
27 T
28 sqr(T x)
29 {
30     return x * x;
31 }
32
33 int main()
34 {
35     {
36         typedef std::exponential_distribution<> D;
37         typedef D::param_type P;
38         typedef std::mt19937 G;
39         G g;
40         D d(.75);
41         const int N = 1000000;
42         std::vector<D::result_type> u;
43         for (int i = 0; i < N; ++i)
44         {
45             D::result_type v = d(g);
46             assert(d.min() < v);
47             u.push_back(v);
48         }
49         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
50         double var = 0;
51         double skew = 0;
52         double kurtosis = 0;
53         for (std::size_t i = 0; i < u.size(); ++i)
54         {
55             double dbl = (u[i] - mean);
56             double d2 = sqr(dbl);
57             var += d2;
58             skew += dbl * d2;
59             kurtosis += d2 * d2;
60         }
61         var /= u.size();
62         double dev = std::sqrt(var);
63         skew /= u.size() * dev * var;
64         kurtosis /= u.size() * var * var;
65         kurtosis -= 3;
66         double x_mean = 1/d.lambda();
67         double x_var = 1/sqr(d.lambda());
68         double x_skew = 2;
69         double x_kurtosis = 6;
70         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
71         assert(std::abs((var - x_var) / x_var) < 0.01);
72         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
73         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
74     }
75     {
76         typedef std::exponential_distribution<> D;
77         typedef D::param_type P;
78         typedef std::mt19937 G;
79         G g;
80         D d(1);
81         const int N = 1000000;
82         std::vector<D::result_type> u;
83         for (int i = 0; i < N; ++i)
84         {
85             D::result_type v = d(g);
86             assert(d.min() < v);
87             u.push_back(v);
88         }
89         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
90         double var = 0;
91         double skew = 0;
92         double kurtosis = 0;
93         for (std::size_t i = 0; i < u.size(); ++i)
94         {
95             double dbl = (u[i] - mean);
96             double d2 = sqr(dbl);
97             var += d2;
98             skew += dbl * d2;
99             kurtosis += d2 * d2;
100         }
101         var /= u.size();
102         double dev = std::sqrt(var);
103         skew /= u.size() * dev * var;
104         kurtosis /= u.size() * var * var;
105         kurtosis -= 3;
106         double x_mean = 1/d.lambda();
107         double x_var = 1/sqr(d.lambda());
108         double x_skew = 2;
109         double x_kurtosis = 6;
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.01);
114     }
115     {
116         typedef std::exponential_distribution<> D;
117         typedef D::param_type P;
118         typedef std::mt19937 G;
119         G g;
120         D d(10);
121         const int N = 1000000;
122         std::vector<D::result_type> u;
123         for (int i = 0; i < N; ++i)
124         {
125             D::result_type v = d(g);
126             assert(d.min() < v);
127             u.push_back(v);
128         }
129         double mean = std::accumulate(u.begin(), u.end(), 0.0) / u.size();
130         double var = 0;
131         double skew = 0;
132         double kurtosis = 0;
133         for (std::size_t i = 0; i < u.size(); ++i)
134         {
135             double dbl = (u[i] - mean);
136             double d2 = sqr(dbl);
137             var += d2;
138             skew += dbl * d2;
139             kurtosis += d2 * d2;
140         }
141         var /= u.size();
142         double dev = std::sqrt(var);
143         skew /= u.size() * dev * var;
144         kurtosis /= u.size() * var * var;
145         kurtosis -= 3;
146         double x_mean = 1/d.lambda();
147         double x_var = 1/sqr(d.lambda());
148         double x_skew = 2;
149         double x_kurtosis = 6;
150         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
151         assert(std::abs((var - x_var) / x_var) < 0.01);
152         assert(std::abs((skew - x_skew) / x_skew) < 0.01);
153         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
154     }
155 }