• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 uniform_real_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 
22 template <class T>
23 inline
24 T
sqr(T x)25 sqr(T x)
26 {
27     return x * x;
28 }
29 
main()30 int main()
31 {
32     {
33         typedef std::uniform_real_distribution<> D;
34         typedef std::minstd_rand0 G;
35         G g;
36         D d;
37         const int N = 100000;
38         std::vector<D::result_type> u;
39         for (int i = 0; i < N; ++i)
40         {
41             D::result_type v = d(g);
42             assert(d.a() <= v && v < d.b());
43             u.push_back(v);
44         }
45         D::result_type mean = std::accumulate(u.begin(), u.end(),
46                                               D::result_type(0)) / u.size();
47         D::result_type var = 0;
48         D::result_type skew = 0;
49         D::result_type kurtosis = 0;
50         for (int i = 0; i < u.size(); ++i)
51         {
52             D::result_type d = (u[i] - mean);
53             D::result_type d2 = sqr(d);
54             var += d2;
55             skew += d * d2;
56             kurtosis += d2 * d2;
57         }
58         var /= u.size();
59         D::result_type dev = std::sqrt(var);
60         skew /= u.size() * dev * var;
61         kurtosis /= u.size() * var * var;
62         kurtosis -= 3;
63         D::result_type x_mean = (d.a() + d.b()) / 2;
64         D::result_type x_var = sqr(d.b() - d.a()) / 12;
65         D::result_type x_skew = 0;
66         D::result_type x_kurtosis = -6./5;
67         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
68         assert(std::abs((var - x_var) / x_var) < 0.01);
69         assert(std::abs(skew - x_skew) < 0.01);
70         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
71     }
72     {
73         typedef std::uniform_real_distribution<> D;
74         typedef std::minstd_rand G;
75         G g;
76         D d;
77         const int N = 100000;
78         std::vector<D::result_type> u;
79         for (int i = 0; i < N; ++i)
80         {
81             D::result_type v = d(g);
82             assert(d.a() <= v && v < d.b());
83             u.push_back(v);
84         }
85         D::result_type mean = std::accumulate(u.begin(), u.end(),
86                                               D::result_type(0)) / u.size();
87         D::result_type var = 0;
88         D::result_type skew = 0;
89         D::result_type kurtosis = 0;
90         for (int i = 0; i < u.size(); ++i)
91         {
92             D::result_type d = (u[i] - mean);
93             D::result_type d2 = sqr(d);
94             var += d2;
95             skew += d * d2;
96             kurtosis += d2 * d2;
97         }
98         var /= u.size();
99         D::result_type dev = std::sqrt(var);
100         skew /= u.size() * dev * var;
101         kurtosis /= u.size() * var * var;
102         kurtosis -= 3;
103         D::result_type x_mean = (d.a() + d.b()) / 2;
104         D::result_type x_var = sqr(d.b() - d.a()) / 12;
105         D::result_type x_skew = 0;
106         D::result_type x_kurtosis = -6./5;
107         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
108         assert(std::abs((var - x_var) / x_var) < 0.01);
109         assert(std::abs(skew - x_skew) < 0.01);
110         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
111     }
112     {
113         typedef std::uniform_real_distribution<> D;
114         typedef std::mt19937 G;
115         G g;
116         D d;
117         const int N = 100000;
118         std::vector<D::result_type> u;
119         for (int i = 0; i < N; ++i)
120         {
121             D::result_type v = d(g);
122             assert(d.a() <= v && v < d.b());
123             u.push_back(v);
124         }
125         D::result_type mean = std::accumulate(u.begin(), u.end(),
126                                               D::result_type(0)) / u.size();
127         D::result_type var = 0;
128         D::result_type skew = 0;
129         D::result_type kurtosis = 0;
130         for (int i = 0; i < u.size(); ++i)
131         {
132             D::result_type d = (u[i] - mean);
133             D::result_type d2 = sqr(d);
134             var += d2;
135             skew += d * d2;
136             kurtosis += d2 * d2;
137         }
138         var /= u.size();
139         D::result_type dev = std::sqrt(var);
140         skew /= u.size() * dev * var;
141         kurtosis /= u.size() * var * var;
142         kurtosis -= 3;
143         D::result_type x_mean = (d.a() + d.b()) / 2;
144         D::result_type x_var = sqr(d.b() - d.a()) / 12;
145         D::result_type x_skew = 0;
146         D::result_type x_kurtosis = -6./5;
147         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
148         assert(std::abs((var - x_var) / x_var) < 0.01);
149         assert(std::abs(skew - x_skew) < 0.01);
150         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
151     }
152     {
153         typedef std::uniform_real_distribution<> D;
154         typedef std::mt19937_64 G;
155         G g;
156         D d;
157         const int N = 100000;
158         std::vector<D::result_type> u;
159         for (int i = 0; i < N; ++i)
160         {
161             D::result_type v = d(g);
162             assert(d.a() <= v && v < d.b());
163             u.push_back(v);
164         }
165         D::result_type mean = std::accumulate(u.begin(), u.end(),
166                                               D::result_type(0)) / u.size();
167         D::result_type var = 0;
168         D::result_type skew = 0;
169         D::result_type kurtosis = 0;
170         for (int i = 0; i < u.size(); ++i)
171         {
172             D::result_type d = (u[i] - mean);
173             D::result_type d2 = sqr(d);
174             var += d2;
175             skew += d * d2;
176             kurtosis += d2 * d2;
177         }
178         var /= u.size();
179         D::result_type dev = std::sqrt(var);
180         skew /= u.size() * dev * var;
181         kurtosis /= u.size() * var * var;
182         kurtosis -= 3;
183         D::result_type x_mean = (d.a() + d.b()) / 2;
184         D::result_type x_var = sqr(d.b() - d.a()) / 12;
185         D::result_type x_skew = 0;
186         D::result_type x_kurtosis = -6./5;
187         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
188         assert(std::abs((var - x_var) / x_var) < 0.01);
189         assert(std::abs(skew - x_skew) < 0.01);
190         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
191     }
192     {
193         typedef std::uniform_real_distribution<> D;
194         typedef std::ranlux24_base G;
195         G g;
196         D d;
197         const int N = 100000;
198         std::vector<D::result_type> u;
199         for (int i = 0; i < N; ++i)
200         {
201             D::result_type v = d(g);
202             assert(d.a() <= v && v < d.b());
203             u.push_back(v);
204         }
205         D::result_type mean = std::accumulate(u.begin(), u.end(),
206                                               D::result_type(0)) / u.size();
207         D::result_type var = 0;
208         D::result_type skew = 0;
209         D::result_type kurtosis = 0;
210         for (int i = 0; i < u.size(); ++i)
211         {
212             D::result_type d = (u[i] - mean);
213             D::result_type d2 = sqr(d);
214             var += d2;
215             skew += d * d2;
216             kurtosis += d2 * d2;
217         }
218         var /= u.size();
219         D::result_type dev = std::sqrt(var);
220         skew /= u.size() * dev * var;
221         kurtosis /= u.size() * var * var;
222         kurtosis -= 3;
223         D::result_type x_mean = (d.a() + d.b()) / 2;
224         D::result_type x_var = sqr(d.b() - d.a()) / 12;
225         D::result_type x_skew = 0;
226         D::result_type x_kurtosis = -6./5;
227         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
228         assert(std::abs((var - x_var) / x_var) < 0.01);
229         assert(std::abs(skew - x_skew) < 0.02);
230         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
231     }
232     {
233         typedef std::uniform_real_distribution<> D;
234         typedef std::ranlux48_base G;
235         G g;
236         D d;
237         const int N = 100000;
238         std::vector<D::result_type> u;
239         for (int i = 0; i < N; ++i)
240         {
241             D::result_type v = d(g);
242             assert(d.a() <= v && v < d.b());
243             u.push_back(v);
244         }
245         D::result_type mean = std::accumulate(u.begin(), u.end(),
246                                               D::result_type(0)) / u.size();
247         D::result_type var = 0;
248         D::result_type skew = 0;
249         D::result_type kurtosis = 0;
250         for (int i = 0; i < u.size(); ++i)
251         {
252             D::result_type d = (u[i] - mean);
253             D::result_type d2 = sqr(d);
254             var += d2;
255             skew += d * d2;
256             kurtosis += d2 * d2;
257         }
258         var /= u.size();
259         D::result_type dev = std::sqrt(var);
260         skew /= u.size() * dev * var;
261         kurtosis /= u.size() * var * var;
262         kurtosis -= 3;
263         D::result_type x_mean = (d.a() + d.b()) / 2;
264         D::result_type x_var = sqr(d.b() - d.a()) / 12;
265         D::result_type x_skew = 0;
266         D::result_type x_kurtosis = -6./5;
267         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
268         assert(std::abs((var - x_var) / x_var) < 0.01);
269         assert(std::abs(skew - x_skew) < 0.01);
270         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
271     }
272     {
273         typedef std::uniform_real_distribution<> D;
274         typedef std::ranlux24 G;
275         G g;
276         D d;
277         const int N = 100000;
278         std::vector<D::result_type> u;
279         for (int i = 0; i < N; ++i)
280         {
281             D::result_type v = d(g);
282             assert(d.a() <= v && v < d.b());
283             u.push_back(v);
284         }
285         D::result_type mean = std::accumulate(u.begin(), u.end(),
286                                               D::result_type(0)) / u.size();
287         D::result_type var = 0;
288         D::result_type skew = 0;
289         D::result_type kurtosis = 0;
290         for (int i = 0; i < u.size(); ++i)
291         {
292             D::result_type d = (u[i] - mean);
293             D::result_type d2 = sqr(d);
294             var += d2;
295             skew += d * d2;
296             kurtosis += d2 * d2;
297         }
298         var /= u.size();
299         D::result_type dev = std::sqrt(var);
300         skew /= u.size() * dev * var;
301         kurtosis /= u.size() * var * var;
302         kurtosis -= 3;
303         D::result_type x_mean = (d.a() + d.b()) / 2;
304         D::result_type x_var = sqr(d.b() - d.a()) / 12;
305         D::result_type x_skew = 0;
306         D::result_type x_kurtosis = -6./5;
307         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
308         assert(std::abs((var - x_var) / x_var) < 0.01);
309         assert(std::abs(skew - x_skew) < 0.01);
310         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
311     }
312     {
313         typedef std::uniform_real_distribution<> D;
314         typedef std::ranlux48 G;
315         G g;
316         D d;
317         const int N = 100000;
318         std::vector<D::result_type> u;
319         for (int i = 0; i < N; ++i)
320         {
321             D::result_type v = d(g);
322             assert(d.a() <= v && v < d.b());
323             u.push_back(v);
324         }
325         D::result_type mean = std::accumulate(u.begin(), u.end(),
326                                               D::result_type(0)) / u.size();
327         D::result_type var = 0;
328         D::result_type skew = 0;
329         D::result_type kurtosis = 0;
330         for (int i = 0; i < u.size(); ++i)
331         {
332             D::result_type d = (u[i] - mean);
333             D::result_type d2 = sqr(d);
334             var += d2;
335             skew += d * d2;
336             kurtosis += d2 * d2;
337         }
338         var /= u.size();
339         D::result_type dev = std::sqrt(var);
340         skew /= u.size() * dev * var;
341         kurtosis /= u.size() * var * var;
342         kurtosis -= 3;
343         D::result_type x_mean = (d.a() + d.b()) / 2;
344         D::result_type x_var = sqr(d.b() - d.a()) / 12;
345         D::result_type x_skew = 0;
346         D::result_type x_kurtosis = -6./5;
347         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
348         assert(std::abs((var - x_var) / x_var) < 0.01);
349         assert(std::abs(skew - x_skew) < 0.01);
350         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
351     }
352     {
353         typedef std::uniform_real_distribution<> D;
354         typedef std::knuth_b G;
355         G g;
356         D d;
357         const int N = 100000;
358         std::vector<D::result_type> u;
359         for (int i = 0; i < N; ++i)
360         {
361             D::result_type v = d(g);
362             assert(d.a() <= v && v < d.b());
363             u.push_back(v);
364         }
365         D::result_type mean = std::accumulate(u.begin(), u.end(),
366                                               D::result_type(0)) / u.size();
367         D::result_type var = 0;
368         D::result_type skew = 0;
369         D::result_type kurtosis = 0;
370         for (int i = 0; i < u.size(); ++i)
371         {
372             D::result_type d = (u[i] - mean);
373             D::result_type d2 = sqr(d);
374             var += d2;
375             skew += d * d2;
376             kurtosis += d2 * d2;
377         }
378         var /= u.size();
379         D::result_type dev = std::sqrt(var);
380         skew /= u.size() * dev * var;
381         kurtosis /= u.size() * var * var;
382         kurtosis -= 3;
383         D::result_type x_mean = (d.a() + d.b()) / 2;
384         D::result_type x_var = sqr(d.b() - d.a()) / 12;
385         D::result_type x_skew = 0;
386         D::result_type x_kurtosis = -6./5;
387         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
388         assert(std::abs((var - x_var) / x_var) < 0.01);
389         assert(std::abs(skew - x_skew) < 0.01);
390         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
391     }
392     {
393         typedef std::uniform_real_distribution<> D;
394         typedef std::minstd_rand G;
395         G g;
396         D d(-1, 1);
397         const int N = 100000;
398         std::vector<D::result_type> u;
399         for (int i = 0; i < N; ++i)
400         {
401             D::result_type v = d(g);
402             assert(d.a() <= v && v < d.b());
403             u.push_back(v);
404         }
405         D::result_type mean = std::accumulate(u.begin(), u.end(),
406                                               D::result_type(0)) / u.size();
407         D::result_type var = 0;
408         D::result_type skew = 0;
409         D::result_type kurtosis = 0;
410         for (int i = 0; i < u.size(); ++i)
411         {
412             D::result_type d = (u[i] - mean);
413             D::result_type d2 = sqr(d);
414             var += d2;
415             skew += d * d2;
416             kurtosis += d2 * d2;
417         }
418         var /= u.size();
419         D::result_type dev = std::sqrt(var);
420         skew /= u.size() * dev * var;
421         kurtosis /= u.size() * var * var;
422         kurtosis -= 3;
423         D::result_type x_mean = (d.a() + d.b()) / 2;
424         D::result_type x_var = sqr(d.b() - d.a()) / 12;
425         D::result_type x_skew = 0;
426         D::result_type x_kurtosis = -6./5;
427         assert(std::abs(mean - x_mean) < 0.01);
428         assert(std::abs((var - x_var) / x_var) < 0.01);
429         assert(std::abs(skew - x_skew) < 0.01);
430         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
431     }
432     {
433         typedef std::uniform_real_distribution<> D;
434         typedef std::minstd_rand G;
435         G g;
436         D d(5.5, 25);
437         const int N = 100000;
438         std::vector<D::result_type> u;
439         for (int i = 0; i < N; ++i)
440         {
441             D::result_type v = d(g);
442             assert(d.a() <= v && v < d.b());
443             u.push_back(v);
444         }
445         D::result_type mean = std::accumulate(u.begin(), u.end(),
446                                               D::result_type(0)) / u.size();
447         D::result_type var = 0;
448         D::result_type skew = 0;
449         D::result_type kurtosis = 0;
450         for (int i = 0; i < u.size(); ++i)
451         {
452             D::result_type d = (u[i] - mean);
453             D::result_type d2 = sqr(d);
454             var += d2;
455             skew += d * d2;
456             kurtosis += d2 * d2;
457         }
458         var /= u.size();
459         D::result_type dev = std::sqrt(var);
460         skew /= u.size() * dev * var;
461         kurtosis /= u.size() * var * var;
462         kurtosis -= 3;
463         D::result_type x_mean = (d.a() + d.b()) / 2;
464         D::result_type x_var = sqr(d.b() - d.a()) / 12;
465         D::result_type x_skew = 0;
466         D::result_type x_kurtosis = -6./5;
467         assert(std::abs((mean - x_mean) / x_mean) < 0.01);
468         assert(std::abs((var - x_var) / x_var) < 0.01);
469         assert(std::abs(skew - x_skew) < 0.01);
470         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
471     }
472 }
473