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