1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // REQUIRES: long_tests
14 // template<class _IntType = int>
15 // class uniform_int_distribution
17 // template<class _URNG> result_type operator()(_URNG& g);
36 typedef std::uniform_int_distribution<> D;
37 typedef std::minstd_rand0 G;
41 std::vector<D::result_type> u;
42 for (int i = 0; i < N; ++i)
44 D::result_type v = d(g);
45 assert(d.a() <= v && v <= d.b());
48 double mean = std::accumulate(u.begin(), u.end(),
49 double(0)) / u.size();
53 for (std::size_t i = 0; i < u.size(); ++i)
55 double dbl = (u[i] - mean);
62 double dev = std::sqrt(var);
63 skew /= u.size() * dev * var;
64 kurtosis /= u.size() * var * var;
66 double x_mean = ((double)d.a() + d.b()) / 2;
67 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
69 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
70 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
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) < 0.01);
74 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
77 typedef std::uniform_int_distribution<> D;
78 typedef std::minstd_rand G;
82 std::vector<D::result_type> u;
83 for (int i = 0; i < N; ++i)
85 D::result_type v = d(g);
86 assert(d.a() <= v && v <= d.b());
89 double mean = std::accumulate(u.begin(), u.end(),
90 double(0)) / u.size();
94 for (std::size_t i = 0; i < u.size(); ++i)
96 double dbl = (u[i] - mean);
103 double dev = std::sqrt(var);
104 skew /= u.size() * dev * var;
105 kurtosis /= u.size() * var * var;
107 double x_mean = ((double)d.a() + d.b()) / 2;
108 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
110 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
111 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
112 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
113 assert(std::abs((var - x_var) / x_var) < 0.01);
114 assert(std::abs(skew - x_skew) < 0.01);
115 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
118 typedef std::uniform_int_distribution<> D;
119 typedef std::mt19937 G;
122 const int N = 100000;
123 std::vector<D::result_type> u;
124 for (int i = 0; i < N; ++i)
126 D::result_type v = d(g);
127 assert(d.a() <= v && v <= d.b());
130 double mean = std::accumulate(u.begin(), u.end(),
131 double(0)) / u.size();
135 for (std::size_t i = 0; i < u.size(); ++i)
137 double dbl = (u[i] - mean);
138 double d2 = sqr(dbl);
144 double dev = std::sqrt(var);
145 skew /= u.size() * dev * var;
146 kurtosis /= u.size() * var * var;
148 double x_mean = ((double)d.a() + d.b()) / 2;
149 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
151 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
152 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
153 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
154 assert(std::abs((var - x_var) / x_var) < 0.01);
155 assert(std::abs(skew - x_skew) < 0.01);
156 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
159 typedef std::uniform_int_distribution<> D;
160 typedef std::mt19937_64 G;
163 const int N = 100000;
164 std::vector<D::result_type> u;
165 for (int i = 0; i < N; ++i)
167 D::result_type v = d(g);
168 assert(d.a() <= v && v <= d.b());
171 double mean = std::accumulate(u.begin(), u.end(),
172 double(0)) / u.size();
176 for (std::size_t i = 0; i < u.size(); ++i)
178 double dbl = (u[i] - mean);
179 double d2 = sqr(dbl);
185 double dev = std::sqrt(var);
186 skew /= u.size() * dev * var;
187 kurtosis /= u.size() * var * var;
189 double x_mean = ((double)d.a() + d.b()) / 2;
190 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
192 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
193 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
194 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
195 assert(std::abs((var - x_var) / x_var) < 0.01);
196 assert(std::abs(skew - x_skew) < 0.01);
197 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
200 typedef std::uniform_int_distribution<> D;
201 typedef std::ranlux24_base G;
204 const int N = 100000;
205 std::vector<D::result_type> u;
206 for (int i = 0; i < N; ++i)
208 D::result_type v = d(g);
209 assert(d.a() <= v && v <= d.b());
212 double mean = std::accumulate(u.begin(), u.end(),
213 double(0)) / u.size();
217 for (std::size_t i = 0; i < u.size(); ++i)
219 double dbl = (u[i] - mean);
220 double d2 = sqr(dbl);
226 double dev = std::sqrt(var);
227 skew /= u.size() * dev * var;
228 kurtosis /= u.size() * var * var;
230 double x_mean = ((double)d.a() + d.b()) / 2;
231 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
233 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
234 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
235 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
236 assert(std::abs((var - x_var) / x_var) < 0.01);
237 assert(std::abs(skew - x_skew) < 0.01);
238 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
241 typedef std::uniform_int_distribution<> D;
242 typedef std::ranlux48_base G;
245 const int N = 100000;
246 std::vector<D::result_type> u;
247 for (int i = 0; i < N; ++i)
249 D::result_type v = d(g);
250 assert(d.a() <= v && v <= d.b());
253 double mean = std::accumulate(u.begin(), u.end(),
254 double(0)) / u.size();
258 for (std::size_t i = 0; i < u.size(); ++i)
260 double dbl = (u[i] - mean);
261 double d2 = sqr(dbl);
267 double dev = std::sqrt(var);
268 skew /= u.size() * dev * var;
269 kurtosis /= u.size() * var * var;
271 double x_mean = ((double)d.a() + d.b()) / 2;
272 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
274 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
275 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
276 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
277 assert(std::abs((var - x_var) / x_var) < 0.01);
278 assert(std::abs(skew - x_skew) < 0.01);
279 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
282 typedef std::uniform_int_distribution<> D;
283 typedef std::ranlux24 G;
286 const int N = 100000;
287 std::vector<D::result_type> u;
288 for (int i = 0; i < N; ++i)
290 D::result_type v = d(g);
291 assert(d.a() <= v && v <= d.b());
294 double mean = std::accumulate(u.begin(), u.end(),
295 double(0)) / u.size();
299 for (std::size_t i = 0; i < u.size(); ++i)
301 double dbl = (u[i] - mean);
302 double d2 = sqr(dbl);
308 double dev = std::sqrt(var);
309 skew /= u.size() * dev * var;
310 kurtosis /= u.size() * var * var;
312 double x_mean = ((double)d.a() + d.b()) / 2;
313 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
315 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
316 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
317 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
318 assert(std::abs((var - x_var) / x_var) < 0.01);
319 assert(std::abs(skew - x_skew) < 0.01);
320 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
323 typedef std::uniform_int_distribution<> D;
324 typedef std::ranlux48 G;
327 const int N = 100000;
328 std::vector<D::result_type> u;
329 for (int i = 0; i < N; ++i)
331 D::result_type v = d(g);
332 assert(d.a() <= v && v <= d.b());
335 double mean = std::accumulate(u.begin(), u.end(),
336 double(0)) / u.size();
340 for (std::size_t i = 0; i < u.size(); ++i)
342 double dbl = (u[i] - mean);
343 double d2 = sqr(dbl);
349 double dev = std::sqrt(var);
350 skew /= u.size() * dev * var;
351 kurtosis /= u.size() * var * var;
353 double x_mean = ((double)d.a() + d.b()) / 2;
354 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
356 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
357 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
358 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
359 assert(std::abs((var - x_var) / x_var) < 0.01);
360 assert(std::abs(skew - x_skew) < 0.01);
361 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
364 typedef std::uniform_int_distribution<> D;
365 typedef std::knuth_b G;
368 const int N = 100000;
369 std::vector<D::result_type> u;
370 for (int i = 0; i < N; ++i)
372 D::result_type v = d(g);
373 assert(d.a() <= v && v <= d.b());
376 double mean = std::accumulate(u.begin(), u.end(),
377 double(0)) / u.size();
381 for (std::size_t i = 0; i < u.size(); ++i)
383 double dbl = (u[i] - mean);
384 double d2 = sqr(dbl);
390 double dev = std::sqrt(var);
391 skew /= u.size() * dev * var;
392 kurtosis /= u.size() * var * var;
394 double x_mean = ((double)d.a() + d.b()) / 2;
395 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
397 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
398 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
399 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
400 assert(std::abs((var - x_var) / x_var) < 0.01);
401 assert(std::abs(skew - x_skew) < 0.01);
402 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
405 typedef std::uniform_int_distribution<> D;
406 typedef std::minstd_rand0 G;
409 for (int i = 0; i < 10000; ++i)
412 assert(-6 <= u && u <= 106);
416 typedef std::uniform_int_distribution<> D;
417 typedef std::minstd_rand G;
420 const int N = 100000;
421 std::vector<D::result_type> u;
422 for (int i = 0; i < N; ++i)
424 D::result_type v = d(g);
425 assert(d.a() <= v && v <= d.b());
428 double mean = std::accumulate(u.begin(), u.end(),
429 double(0)) / u.size();
433 for (std::size_t i = 0; i < u.size(); ++i)
435 double dbl = (u[i] - mean);
436 double d2 = sqr(dbl);
442 double dev = std::sqrt(var);
443 skew /= u.size() * dev * var;
444 kurtosis /= u.size() * var * var;
446 double x_mean = ((double)d.a() + d.b()) / 2;
447 double x_var = (sqr((double)d.b() - d.a() + 1) - 1) / 12;
449 double x_kurtosis = -6. * (sqr((double)d.b() - d.a() + 1) + 1) /
450 (5. * (sqr((double)d.b() - d.a() + 1) - 1));
451 assert(std::abs((mean - x_mean) / x_mean) < 0.01);
452 assert(std::abs((var - x_var) / x_var) < 0.01);
453 assert(std::abs(skew - x_skew) < 0.01);
454 assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);