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