1 // random number generation -*- C++ -*- 2 3 // Copyright (C) 2009-2022 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** 26 * @file bits/random.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{random} 29 */ 30 31 #ifndef _RANDOM_H 32 #define _RANDOM_H 1 33 34 #include <vector> 35 #include <bits/uniform_int_dist.h> 36 37 namespace std _GLIBCXX_VISIBILITY(default) 38 { 39 _GLIBCXX_BEGIN_NAMESPACE_VERSION 40 41 // [26.4] Random number generation 42 43 /** 44 * @defgroup random Random Number Generation 45 * @ingroup numerics 46 * 47 * A facility for generating random numbers on selected distributions. 48 * @{ 49 */ 50 51 // std::uniform_random_bit_generator is defined in <bits/uniform_int_dist.h> 52 53 /** 54 * @brief A function template for converting the output of a (integral) 55 * uniform random number generator to a floatng point result in the range 56 * [0-1). 57 */ 58 template<typename _RealType, size_t __bits, 59 typename _UniformRandomNumberGenerator> 60 _RealType 61 generate_canonical(_UniformRandomNumberGenerator& __g); 62 63 /// @cond undocumented 64 // Implementation-space details. 65 namespace __detail 66 { 67 template<typename _UIntType, size_t __w, 68 bool = __w < static_cast<size_t> 69 (std::numeric_limits<_UIntType>::digits)> 70 struct _Shift 71 { static constexpr _UIntType __value = 0; }; 72 73 template<typename _UIntType, size_t __w> 74 struct _Shift<_UIntType, __w, true> 75 { static constexpr _UIntType __value = _UIntType(1) << __w; }; 76 77 template<int __s, 78 int __which = ((__s <= __CHAR_BIT__ * sizeof (int)) 79 + (__s <= __CHAR_BIT__ * sizeof (long)) 80 + (__s <= __CHAR_BIT__ * sizeof (long long)) 81 /* assume long long no bigger than __int128 */ 82 + (__s <= 128))> 83 struct _Select_uint_least_t 84 { 85 static_assert(__which < 0, /* needs to be dependent */ 86 "sorry, would be too much trouble for a slow result"); 87 }; 88 89 template<int __s> 90 struct _Select_uint_least_t<__s, 4> 91 { using type = unsigned int; }; 92 93 template<int __s> 94 struct _Select_uint_least_t<__s, 3> 95 { using type = unsigned long; }; 96 97 template<int __s> 98 struct _Select_uint_least_t<__s, 2> 99 { using type = unsigned long long; }; 100 101 #if __SIZEOF_INT128__ > __SIZEOF_LONG_LONG__ 102 template<int __s> 103 struct _Select_uint_least_t<__s, 1> 104 { __extension__ using type = unsigned __int128; }; 105 #endif 106 107 // Assume a != 0, a < m, c < m, x < m. 108 template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, 109 bool __big_enough = (!(__m & (__m - 1)) 110 || (_Tp(-1) - __c) / __a >= __m - 1), 111 bool __schrage_ok = __m % __a < __m / __a> 112 struct _Mod 113 { 114 static _Tp 115 __calc(_Tp __x) 116 { 117 using _Tp2 118 = typename _Select_uint_least_t<std::__lg(__a) 119 + std::__lg(__m) + 2>::type; 120 return static_cast<_Tp>((_Tp2(__a) * __x + __c) % __m); 121 } 122 }; 123 124 // Schrage. 125 template<typename _Tp, _Tp __m, _Tp __a, _Tp __c> 126 struct _Mod<_Tp, __m, __a, __c, false, true> 127 { 128 static _Tp 129 __calc(_Tp __x); 130 }; 131 132 // Special cases: 133 // - for m == 2^n or m == 0, unsigned integer overflow is safe. 134 // - a * (m - 1) + c fits in _Tp, there is no overflow. 135 template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool __s> 136 struct _Mod<_Tp, __m, __a, __c, true, __s> 137 { 138 static _Tp 139 __calc(_Tp __x) 140 { 141 _Tp __res = __a * __x + __c; 142 if (__m) 143 __res %= __m; 144 return __res; 145 } 146 }; 147 148 template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0> 149 inline _Tp 150 __mod(_Tp __x) 151 { 152 if _GLIBCXX17_CONSTEXPR (__a == 0) 153 return __c; 154 else 155 { 156 // _Mod must not be instantiated with a == 0 157 constexpr _Tp __a1 = __a ? __a : 1; 158 return _Mod<_Tp, __m, __a1, __c>::__calc(__x); 159 } 160 } 161 162 /* 163 * An adaptor class for converting the output of any Generator into 164 * the input for a specific Distribution. 165 */ 166 template<typename _Engine, typename _DInputType> 167 struct _Adaptor 168 { 169 static_assert(std::is_floating_point<_DInputType>::value, 170 "template argument must be a floating point type"); 171 172 public: 173 _Adaptor(_Engine& __g) 174 : _M_g(__g) { } 175 176 _DInputType 177 min() const 178 { return _DInputType(0); } 179 180 _DInputType 181 max() const 182 { return _DInputType(1); } 183 184 /* 185 * Converts a value generated by the adapted random number generator 186 * into a value in the input domain for the dependent random number 187 * distribution. 188 */ 189 _DInputType 190 operator()() 191 { 192 return std::generate_canonical<_DInputType, 193 std::numeric_limits<_DInputType>::digits, 194 _Engine>(_M_g); 195 } 196 197 private: 198 _Engine& _M_g; 199 }; 200 201 template<typename _Sseq> 202 using __seed_seq_generate_t = decltype( 203 std::declval<_Sseq&>().generate(std::declval<uint_least32_t*>(), 204 std::declval<uint_least32_t*>())); 205 206 // Detect whether _Sseq is a valid seed sequence for 207 // a random number engine _Engine with result type _Res. 208 template<typename _Sseq, typename _Engine, typename _Res, 209 typename _GenerateCheck = __seed_seq_generate_t<_Sseq>> 210 using __is_seed_seq = __and_< 211 __not_<is_same<__remove_cvref_t<_Sseq>, _Engine>>, 212 is_unsigned<typename _Sseq::result_type>, 213 __not_<is_convertible<_Sseq, _Res>> 214 >; 215 216 } // namespace __detail 217 /// @endcond 218 219 /** 220 * @addtogroup random_generators Random Number Generators 221 * @ingroup random 222 * 223 * These classes define objects which provide random or pseudorandom 224 * numbers, either from a discrete or a continuous interval. The 225 * random number generator supplied as a part of this library are 226 * all uniform random number generators which provide a sequence of 227 * random number uniformly distributed over their range. 228 * 229 * A number generator is a function object with an operator() that 230 * takes zero arguments and returns a number. 231 * 232 * A compliant random number generator must satisfy the following 233 * requirements. <table border=1 cellpadding=10 cellspacing=0> 234 * <caption align=top>Random Number Generator Requirements</caption> 235 * <tr><td>To be documented.</td></tr> </table> 236 * 237 * @{ 238 */ 239 240 /** 241 * @brief A model of a linear congruential random number generator. 242 * 243 * A random number generator that produces pseudorandom numbers via 244 * linear function: 245 * @f[ 246 * x_{i+1}\leftarrow(ax_{i} + c) \bmod m 247 * @f] 248 * 249 * The template parameter @p _UIntType must be an unsigned integral type 250 * large enough to store values up to (__m-1). If the template parameter 251 * @p __m is 0, the modulus @p __m used is 252 * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template 253 * parameters @p __a and @p __c must be less than @p __m. 254 * 255 * The size of the state is @f$1@f$. 256 */ 257 template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 258 class linear_congruential_engine 259 { 260 static_assert(std::is_unsigned<_UIntType>::value, 261 "result_type must be an unsigned integral type"); 262 static_assert(__m == 0u || (__a < __m && __c < __m), 263 "template argument substituting __m out of bounds"); 264 265 template<typename _Sseq> 266 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 267 _Sseq, linear_congruential_engine, _UIntType>::value>::type; 268 269 public: 270 /** The type of the generated random value. */ 271 typedef _UIntType result_type; 272 273 /** The multiplier. */ 274 static constexpr result_type multiplier = __a; 275 /** An increment. */ 276 static constexpr result_type increment = __c; 277 /** The modulus. */ 278 static constexpr result_type modulus = __m; 279 static constexpr result_type default_seed = 1u; 280 281 /** 282 * @brief Constructs a %linear_congruential_engine random number 283 * generator engine with seed 1. 284 */ 285 linear_congruential_engine() : linear_congruential_engine(default_seed) 286 { } 287 288 /** 289 * @brief Constructs a %linear_congruential_engine random number 290 * generator engine with seed @p __s. The default seed value 291 * is 1. 292 * 293 * @param __s The initial seed value. 294 */ 295 explicit 296 linear_congruential_engine(result_type __s) 297 { seed(__s); } 298 299 /** 300 * @brief Constructs a %linear_congruential_engine random number 301 * generator engine seeded from the seed sequence @p __q. 302 * 303 * @param __q the seed sequence. 304 */ 305 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 306 explicit 307 linear_congruential_engine(_Sseq& __q) 308 { seed(__q); } 309 310 /** 311 * @brief Reseeds the %linear_congruential_engine random number generator 312 * engine sequence to the seed @p __s. 313 * 314 * @param __s The new seed. 315 */ 316 void 317 seed(result_type __s = default_seed); 318 319 /** 320 * @brief Reseeds the %linear_congruential_engine random number generator 321 * engine 322 * sequence using values from the seed sequence @p __q. 323 * 324 * @param __q the seed sequence. 325 */ 326 template<typename _Sseq> 327 _If_seed_seq<_Sseq> 328 seed(_Sseq& __q); 329 330 /** 331 * @brief Gets the smallest possible value in the output range. 332 * 333 * The minimum depends on the @p __c parameter: if it is zero, the 334 * minimum generated must be > 0, otherwise 0 is allowed. 335 */ 336 static constexpr result_type 337 min() 338 { return __c == 0u ? 1u : 0u; } 339 340 /** 341 * @brief Gets the largest possible value in the output range. 342 */ 343 static constexpr result_type 344 max() 345 { return __m - 1u; } 346 347 /** 348 * @brief Discard a sequence of random numbers. 349 */ 350 void 351 discard(unsigned long long __z) 352 { 353 for (; __z != 0ULL; --__z) 354 (*this)(); 355 } 356 357 /** 358 * @brief Gets the next random number in the sequence. 359 */ 360 result_type 361 operator()() 362 { 363 _M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x); 364 return _M_x; 365 } 366 367 /** 368 * @brief Compares two linear congruential random number generator 369 * objects of the same type for equality. 370 * 371 * @param __lhs A linear congruential random number generator object. 372 * @param __rhs Another linear congruential random number generator 373 * object. 374 * 375 * @returns true if the infinite sequences of generated values 376 * would be equal, false otherwise. 377 */ 378 friend bool 379 operator==(const linear_congruential_engine& __lhs, 380 const linear_congruential_engine& __rhs) 381 { return __lhs._M_x == __rhs._M_x; } 382 383 /** 384 * @brief Writes the textual representation of the state x(i) of x to 385 * @p __os. 386 * 387 * @param __os The output stream. 388 * @param __lcr A % linear_congruential_engine random number generator. 389 * @returns __os. 390 */ 391 template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 392 _UIntType1 __m1, typename _CharT, typename _Traits> 393 friend std::basic_ostream<_CharT, _Traits>& 394 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 395 const std::linear_congruential_engine<_UIntType1, 396 __a1, __c1, __m1>& __lcr); 397 398 /** 399 * @brief Sets the state of the engine by reading its textual 400 * representation from @p __is. 401 * 402 * The textual representation must have been previously written using 403 * an output stream whose imbued locale and whose type's template 404 * specialization arguments _CharT and _Traits were the same as those 405 * of @p __is. 406 * 407 * @param __is The input stream. 408 * @param __lcr A % linear_congruential_engine random number generator. 409 * @returns __is. 410 */ 411 template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 412 _UIntType1 __m1, typename _CharT, typename _Traits> 413 friend std::basic_istream<_CharT, _Traits>& 414 operator>>(std::basic_istream<_CharT, _Traits>& __is, 415 std::linear_congruential_engine<_UIntType1, __a1, 416 __c1, __m1>& __lcr); 417 418 private: 419 _UIntType _M_x; 420 }; 421 422 /** 423 * @brief Compares two linear congruential random number generator 424 * objects of the same type for inequality. 425 * 426 * @param __lhs A linear congruential random number generator object. 427 * @param __rhs Another linear congruential random number generator 428 * object. 429 * 430 * @returns true if the infinite sequences of generated values 431 * would be different, false otherwise. 432 */ 433 template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 434 inline bool 435 operator!=(const std::linear_congruential_engine<_UIntType, __a, 436 __c, __m>& __lhs, 437 const std::linear_congruential_engine<_UIntType, __a, 438 __c, __m>& __rhs) 439 { return !(__lhs == __rhs); } 440 441 442 /** 443 * A generalized feedback shift register discrete random number generator. 444 * 445 * This algorithm avoids multiplication and division and is designed to be 446 * friendly to a pipelined architecture. If the parameters are chosen 447 * correctly, this generator will produce numbers with a very long period and 448 * fairly good apparent entropy, although still not cryptographically strong. 449 * 450 * The best way to use this generator is with the predefined mt19937 class. 451 * 452 * This algorithm was originally invented by Makoto Matsumoto and 453 * Takuji Nishimura. 454 * 455 * @tparam __w Word size, the number of bits in each element of 456 * the state vector. 457 * @tparam __n The degree of recursion. 458 * @tparam __m The period parameter. 459 * @tparam __r The separation point bit index. 460 * @tparam __a The last row of the twist matrix. 461 * @tparam __u The first right-shift tempering matrix parameter. 462 * @tparam __d The first right-shift tempering matrix mask. 463 * @tparam __s The first left-shift tempering matrix parameter. 464 * @tparam __b The first left-shift tempering matrix mask. 465 * @tparam __t The second left-shift tempering matrix parameter. 466 * @tparam __c The second left-shift tempering matrix mask. 467 * @tparam __l The second right-shift tempering matrix parameter. 468 * @tparam __f Initialization multiplier. 469 */ 470 template<typename _UIntType, size_t __w, 471 size_t __n, size_t __m, size_t __r, 472 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 473 _UIntType __b, size_t __t, 474 _UIntType __c, size_t __l, _UIntType __f> 475 class mersenne_twister_engine 476 { 477 static_assert(std::is_unsigned<_UIntType>::value, 478 "result_type must be an unsigned integral type"); 479 static_assert(1u <= __m && __m <= __n, 480 "template argument substituting __m out of bounds"); 481 static_assert(__r <= __w, "template argument substituting " 482 "__r out of bound"); 483 static_assert(__u <= __w, "template argument substituting " 484 "__u out of bound"); 485 static_assert(__s <= __w, "template argument substituting " 486 "__s out of bound"); 487 static_assert(__t <= __w, "template argument substituting " 488 "__t out of bound"); 489 static_assert(__l <= __w, "template argument substituting " 490 "__l out of bound"); 491 static_assert(__w <= std::numeric_limits<_UIntType>::digits, 492 "template argument substituting __w out of bound"); 493 static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1), 494 "template argument substituting __a out of bound"); 495 static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1), 496 "template argument substituting __b out of bound"); 497 static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1), 498 "template argument substituting __c out of bound"); 499 static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1), 500 "template argument substituting __d out of bound"); 501 static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1), 502 "template argument substituting __f out of bound"); 503 504 template<typename _Sseq> 505 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 506 _Sseq, mersenne_twister_engine, _UIntType>::value>::type; 507 508 public: 509 /** The type of the generated random value. */ 510 typedef _UIntType result_type; 511 512 // parameter values 513 static constexpr size_t word_size = __w; 514 static constexpr size_t state_size = __n; 515 static constexpr size_t shift_size = __m; 516 static constexpr size_t mask_bits = __r; 517 static constexpr result_type xor_mask = __a; 518 static constexpr size_t tempering_u = __u; 519 static constexpr result_type tempering_d = __d; 520 static constexpr size_t tempering_s = __s; 521 static constexpr result_type tempering_b = __b; 522 static constexpr size_t tempering_t = __t; 523 static constexpr result_type tempering_c = __c; 524 static constexpr size_t tempering_l = __l; 525 static constexpr result_type initialization_multiplier = __f; 526 static constexpr result_type default_seed = 5489u; 527 528 // constructors and member functions 529 530 mersenne_twister_engine() : mersenne_twister_engine(default_seed) { } 531 532 explicit 533 mersenne_twister_engine(result_type __sd) 534 { seed(__sd); } 535 536 /** 537 * @brief Constructs a %mersenne_twister_engine random number generator 538 * engine seeded from the seed sequence @p __q. 539 * 540 * @param __q the seed sequence. 541 */ 542 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 543 explicit 544 mersenne_twister_engine(_Sseq& __q) 545 { seed(__q); } 546 547 void 548 seed(result_type __sd = default_seed); 549 550 template<typename _Sseq> 551 _If_seed_seq<_Sseq> 552 seed(_Sseq& __q); 553 554 /** 555 * @brief Gets the smallest possible value in the output range. 556 */ 557 static constexpr result_type 558 min() 559 { return 0; } 560 561 /** 562 * @brief Gets the largest possible value in the output range. 563 */ 564 static constexpr result_type 565 max() 566 { return __detail::_Shift<_UIntType, __w>::__value - 1; } 567 568 /** 569 * @brief Discard a sequence of random numbers. 570 */ 571 void 572 discard(unsigned long long __z); 573 574 result_type 575 operator()(); 576 577 /** 578 * @brief Compares two % mersenne_twister_engine random number generator 579 * objects of the same type for equality. 580 * 581 * @param __lhs A % mersenne_twister_engine random number generator 582 * object. 583 * @param __rhs Another % mersenne_twister_engine random number 584 * generator object. 585 * 586 * @returns true if the infinite sequences of generated values 587 * would be equal, false otherwise. 588 */ 589 friend bool 590 operator==(const mersenne_twister_engine& __lhs, 591 const mersenne_twister_engine& __rhs) 592 { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x) 593 && __lhs._M_p == __rhs._M_p); } 594 595 /** 596 * @brief Inserts the current state of a % mersenne_twister_engine 597 * random number generator engine @p __x into the output stream 598 * @p __os. 599 * 600 * @param __os An output stream. 601 * @param __x A % mersenne_twister_engine random number generator 602 * engine. 603 * 604 * @returns The output stream with the state of @p __x inserted or in 605 * an error state. 606 */ 607 template<typename _UIntType1, 608 size_t __w1, size_t __n1, 609 size_t __m1, size_t __r1, 610 _UIntType1 __a1, size_t __u1, 611 _UIntType1 __d1, size_t __s1, 612 _UIntType1 __b1, size_t __t1, 613 _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 614 typename _CharT, typename _Traits> 615 friend std::basic_ostream<_CharT, _Traits>& 616 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 617 const std::mersenne_twister_engine<_UIntType1, __w1, __n1, 618 __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 619 __l1, __f1>& __x); 620 621 /** 622 * @brief Extracts the current state of a % mersenne_twister_engine 623 * random number generator engine @p __x from the input stream 624 * @p __is. 625 * 626 * @param __is An input stream. 627 * @param __x A % mersenne_twister_engine random number generator 628 * engine. 629 * 630 * @returns The input stream with the state of @p __x extracted or in 631 * an error state. 632 */ 633 template<typename _UIntType1, 634 size_t __w1, size_t __n1, 635 size_t __m1, size_t __r1, 636 _UIntType1 __a1, size_t __u1, 637 _UIntType1 __d1, size_t __s1, 638 _UIntType1 __b1, size_t __t1, 639 _UIntType1 __c1, size_t __l1, _UIntType1 __f1, 640 typename _CharT, typename _Traits> 641 friend std::basic_istream<_CharT, _Traits>& 642 operator>>(std::basic_istream<_CharT, _Traits>& __is, 643 std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1, 644 __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1, 645 __l1, __f1>& __x); 646 647 private: 648 void _M_gen_rand(); 649 650 _UIntType _M_x[state_size]; 651 size_t _M_p; 652 }; 653 654 /** 655 * @brief Compares two % mersenne_twister_engine random number generator 656 * objects of the same type for inequality. 657 * 658 * @param __lhs A % mersenne_twister_engine random number generator 659 * object. 660 * @param __rhs Another % mersenne_twister_engine random number 661 * generator object. 662 * 663 * @returns true if the infinite sequences of generated values 664 * would be different, false otherwise. 665 */ 666 template<typename _UIntType, size_t __w, 667 size_t __n, size_t __m, size_t __r, 668 _UIntType __a, size_t __u, _UIntType __d, size_t __s, 669 _UIntType __b, size_t __t, 670 _UIntType __c, size_t __l, _UIntType __f> 671 inline bool 672 operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 673 __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs, 674 const std::mersenne_twister_engine<_UIntType, __w, __n, __m, 675 __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs) 676 { return !(__lhs == __rhs); } 677 678 679 /** 680 * @brief The Marsaglia-Zaman generator. 681 * 682 * This is a model of a Generalized Fibonacci discrete random number 683 * generator, sometimes referred to as the SWC generator. 684 * 685 * A discrete random number generator that produces pseudorandom 686 * numbers using: 687 * @f[ 688 * x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m 689 * @f] 690 * 691 * The size of the state is @f$r@f$ 692 * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$. 693 */ 694 template<typename _UIntType, size_t __w, size_t __s, size_t __r> 695 class subtract_with_carry_engine 696 { 697 static_assert(std::is_unsigned<_UIntType>::value, 698 "result_type must be an unsigned integral type"); 699 static_assert(0u < __s && __s < __r, 700 "0 < s < r"); 701 static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 702 "template argument substituting __w out of bounds"); 703 704 template<typename _Sseq> 705 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 706 _Sseq, subtract_with_carry_engine, _UIntType>::value>::type; 707 708 public: 709 /** The type of the generated random value. */ 710 typedef _UIntType result_type; 711 712 // parameter values 713 static constexpr size_t word_size = __w; 714 static constexpr size_t short_lag = __s; 715 static constexpr size_t long_lag = __r; 716 static constexpr uint_least32_t default_seed = 19780503u; 717 718 subtract_with_carry_engine() : subtract_with_carry_engine(0u) 719 { } 720 721 /** 722 * @brief Constructs an explicitly seeded %subtract_with_carry_engine 723 * random number generator. 724 */ 725 explicit 726 subtract_with_carry_engine(result_type __sd) 727 { seed(__sd); } 728 729 /** 730 * @brief Constructs a %subtract_with_carry_engine random number engine 731 * seeded from the seed sequence @p __q. 732 * 733 * @param __q the seed sequence. 734 */ 735 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 736 explicit 737 subtract_with_carry_engine(_Sseq& __q) 738 { seed(__q); } 739 740 /** 741 * @brief Seeds the initial state @f$x_0@f$ of the random number 742 * generator. 743 * 744 * N1688[4.19] modifies this as follows. If @p __value == 0, 745 * sets value to 19780503. In any case, with a linear 746 * congruential generator lcg(i) having parameters @f$ m_{lcg} = 747 * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value 748 * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m 749 * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$ 750 * set carry to 1, otherwise sets carry to 0. 751 */ 752 void 753 seed(result_type __sd = 0u); 754 755 /** 756 * @brief Seeds the initial state @f$x_0@f$ of the 757 * % subtract_with_carry_engine random number generator. 758 */ 759 template<typename _Sseq> 760 _If_seed_seq<_Sseq> 761 seed(_Sseq& __q); 762 763 /** 764 * @brief Gets the inclusive minimum value of the range of random 765 * integers returned by this generator. 766 */ 767 static constexpr result_type 768 min() 769 { return 0; } 770 771 /** 772 * @brief Gets the inclusive maximum value of the range of random 773 * integers returned by this generator. 774 */ 775 static constexpr result_type 776 max() 777 { return __detail::_Shift<_UIntType, __w>::__value - 1; } 778 779 /** 780 * @brief Discard a sequence of random numbers. 781 */ 782 void 783 discard(unsigned long long __z) 784 { 785 for (; __z != 0ULL; --__z) 786 (*this)(); 787 } 788 789 /** 790 * @brief Gets the next random number in the sequence. 791 */ 792 result_type 793 operator()(); 794 795 /** 796 * @brief Compares two % subtract_with_carry_engine random number 797 * generator objects of the same type for equality. 798 * 799 * @param __lhs A % subtract_with_carry_engine random number generator 800 * object. 801 * @param __rhs Another % subtract_with_carry_engine random number 802 * generator object. 803 * 804 * @returns true if the infinite sequences of generated values 805 * would be equal, false otherwise. 806 */ 807 friend bool 808 operator==(const subtract_with_carry_engine& __lhs, 809 const subtract_with_carry_engine& __rhs) 810 { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x) 811 && __lhs._M_carry == __rhs._M_carry 812 && __lhs._M_p == __rhs._M_p); } 813 814 /** 815 * @brief Inserts the current state of a % subtract_with_carry_engine 816 * random number generator engine @p __x into the output stream 817 * @p __os. 818 * 819 * @param __os An output stream. 820 * @param __x A % subtract_with_carry_engine random number generator 821 * engine. 822 * 823 * @returns The output stream with the state of @p __x inserted or in 824 * an error state. 825 */ 826 template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 827 typename _CharT, typename _Traits> 828 friend std::basic_ostream<_CharT, _Traits>& 829 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 830 const std::subtract_with_carry_engine<_UIntType1, __w1, 831 __s1, __r1>& __x); 832 833 /** 834 * @brief Extracts the current state of a % subtract_with_carry_engine 835 * random number generator engine @p __x from the input stream 836 * @p __is. 837 * 838 * @param __is An input stream. 839 * @param __x A % subtract_with_carry_engine random number generator 840 * engine. 841 * 842 * @returns The input stream with the state of @p __x extracted or in 843 * an error state. 844 */ 845 template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1, 846 typename _CharT, typename _Traits> 847 friend std::basic_istream<_CharT, _Traits>& 848 operator>>(std::basic_istream<_CharT, _Traits>& __is, 849 std::subtract_with_carry_engine<_UIntType1, __w1, 850 __s1, __r1>& __x); 851 852 private: 853 /// The state of the generator. This is a ring buffer. 854 _UIntType _M_x[long_lag]; 855 _UIntType _M_carry; ///< The carry 856 size_t _M_p; ///< Current index of x(i - r). 857 }; 858 859 /** 860 * @brief Compares two % subtract_with_carry_engine random number 861 * generator objects of the same type for inequality. 862 * 863 * @param __lhs A % subtract_with_carry_engine random number generator 864 * object. 865 * @param __rhs Another % subtract_with_carry_engine random number 866 * generator object. 867 * 868 * @returns true if the infinite sequences of generated values 869 * would be different, false otherwise. 870 */ 871 template<typename _UIntType, size_t __w, size_t __s, size_t __r> 872 inline bool 873 operator!=(const std::subtract_with_carry_engine<_UIntType, __w, 874 __s, __r>& __lhs, 875 const std::subtract_with_carry_engine<_UIntType, __w, 876 __s, __r>& __rhs) 877 { return !(__lhs == __rhs); } 878 879 880 /** 881 * Produces random numbers from some base engine by discarding blocks of 882 * data. 883 * 884 * 0 <= @p __r <= @p __p 885 */ 886 template<typename _RandomNumberEngine, size_t __p, size_t __r> 887 class discard_block_engine 888 { 889 static_assert(1 <= __r && __r <= __p, 890 "template argument substituting __r out of bounds"); 891 892 public: 893 /** The type of the generated random value. */ 894 typedef typename _RandomNumberEngine::result_type result_type; 895 896 template<typename _Sseq> 897 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 898 _Sseq, discard_block_engine, result_type>::value>::type; 899 900 // parameter values 901 static constexpr size_t block_size = __p; 902 static constexpr size_t used_block = __r; 903 904 /** 905 * @brief Constructs a default %discard_block_engine engine. 906 * 907 * The underlying engine is default constructed as well. 908 */ 909 discard_block_engine() 910 : _M_b(), _M_n(0) { } 911 912 /** 913 * @brief Copy constructs a %discard_block_engine engine. 914 * 915 * Copies an existing base class random number generator. 916 * @param __rng An existing (base class) engine object. 917 */ 918 explicit 919 discard_block_engine(const _RandomNumberEngine& __rng) 920 : _M_b(__rng), _M_n(0) { } 921 922 /** 923 * @brief Move constructs a %discard_block_engine engine. 924 * 925 * Copies an existing base class random number generator. 926 * @param __rng An existing (base class) engine object. 927 */ 928 explicit 929 discard_block_engine(_RandomNumberEngine&& __rng) 930 : _M_b(std::move(__rng)), _M_n(0) { } 931 932 /** 933 * @brief Seed constructs a %discard_block_engine engine. 934 * 935 * Constructs the underlying generator engine seeded with @p __s. 936 * @param __s A seed value for the base class engine. 937 */ 938 explicit 939 discard_block_engine(result_type __s) 940 : _M_b(__s), _M_n(0) { } 941 942 /** 943 * @brief Generator construct a %discard_block_engine engine. 944 * 945 * @param __q A seed sequence. 946 */ 947 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 948 explicit 949 discard_block_engine(_Sseq& __q) 950 : _M_b(__q), _M_n(0) 951 { } 952 953 /** 954 * @brief Reseeds the %discard_block_engine object with the default 955 * seed for the underlying base class generator engine. 956 */ 957 void 958 seed() 959 { 960 _M_b.seed(); 961 _M_n = 0; 962 } 963 964 /** 965 * @brief Reseeds the %discard_block_engine object with the default 966 * seed for the underlying base class generator engine. 967 */ 968 void 969 seed(result_type __s) 970 { 971 _M_b.seed(__s); 972 _M_n = 0; 973 } 974 975 /** 976 * @brief Reseeds the %discard_block_engine object with the given seed 977 * sequence. 978 * @param __q A seed generator function. 979 */ 980 template<typename _Sseq> 981 _If_seed_seq<_Sseq> 982 seed(_Sseq& __q) 983 { 984 _M_b.seed(__q); 985 _M_n = 0; 986 } 987 988 /** 989 * @brief Gets a const reference to the underlying generator engine 990 * object. 991 */ 992 const _RandomNumberEngine& 993 base() const noexcept 994 { return _M_b; } 995 996 /** 997 * @brief Gets the minimum value in the generated random number range. 998 */ 999 static constexpr result_type 1000 min() 1001 { return _RandomNumberEngine::min(); } 1002 1003 /** 1004 * @brief Gets the maximum value in the generated random number range. 1005 */ 1006 static constexpr result_type 1007 max() 1008 { return _RandomNumberEngine::max(); } 1009 1010 /** 1011 * @brief Discard a sequence of random numbers. 1012 */ 1013 void 1014 discard(unsigned long long __z) 1015 { 1016 for (; __z != 0ULL; --__z) 1017 (*this)(); 1018 } 1019 1020 /** 1021 * @brief Gets the next value in the generated random number sequence. 1022 */ 1023 result_type 1024 operator()(); 1025 1026 /** 1027 * @brief Compares two %discard_block_engine random number generator 1028 * objects of the same type for equality. 1029 * 1030 * @param __lhs A %discard_block_engine random number generator object. 1031 * @param __rhs Another %discard_block_engine random number generator 1032 * object. 1033 * 1034 * @returns true if the infinite sequences of generated values 1035 * would be equal, false otherwise. 1036 */ 1037 friend bool 1038 operator==(const discard_block_engine& __lhs, 1039 const discard_block_engine& __rhs) 1040 { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; } 1041 1042 /** 1043 * @brief Inserts the current state of a %discard_block_engine random 1044 * number generator engine @p __x into the output stream 1045 * @p __os. 1046 * 1047 * @param __os An output stream. 1048 * @param __x A %discard_block_engine random number generator engine. 1049 * 1050 * @returns The output stream with the state of @p __x inserted or in 1051 * an error state. 1052 */ 1053 template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 1054 typename _CharT, typename _Traits> 1055 friend std::basic_ostream<_CharT, _Traits>& 1056 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1057 const std::discard_block_engine<_RandomNumberEngine1, 1058 __p1, __r1>& __x); 1059 1060 /** 1061 * @brief Extracts the current state of a % subtract_with_carry_engine 1062 * random number generator engine @p __x from the input stream 1063 * @p __is. 1064 * 1065 * @param __is An input stream. 1066 * @param __x A %discard_block_engine random number generator engine. 1067 * 1068 * @returns The input stream with the state of @p __x extracted or in 1069 * an error state. 1070 */ 1071 template<typename _RandomNumberEngine1, size_t __p1, size_t __r1, 1072 typename _CharT, typename _Traits> 1073 friend std::basic_istream<_CharT, _Traits>& 1074 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1075 std::discard_block_engine<_RandomNumberEngine1, 1076 __p1, __r1>& __x); 1077 1078 private: 1079 _RandomNumberEngine _M_b; 1080 size_t _M_n; 1081 }; 1082 1083 /** 1084 * @brief Compares two %discard_block_engine random number generator 1085 * objects of the same type for inequality. 1086 * 1087 * @param __lhs A %discard_block_engine random number generator object. 1088 * @param __rhs Another %discard_block_engine random number generator 1089 * object. 1090 * 1091 * @returns true if the infinite sequences of generated values 1092 * would be different, false otherwise. 1093 */ 1094 template<typename _RandomNumberEngine, size_t __p, size_t __r> 1095 inline bool 1096 operator!=(const std::discard_block_engine<_RandomNumberEngine, __p, 1097 __r>& __lhs, 1098 const std::discard_block_engine<_RandomNumberEngine, __p, 1099 __r>& __rhs) 1100 { return !(__lhs == __rhs); } 1101 1102 1103 /** 1104 * Produces random numbers by combining random numbers from some base 1105 * engine to produce random numbers with a specified number of bits @p __w. 1106 */ 1107 template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 1108 class independent_bits_engine 1109 { 1110 static_assert(std::is_unsigned<_UIntType>::value, 1111 "result_type must be an unsigned integral type"); 1112 static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits, 1113 "template argument substituting __w out of bounds"); 1114 1115 template<typename _Sseq> 1116 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 1117 _Sseq, independent_bits_engine, _UIntType>::value>::type; 1118 1119 public: 1120 /** The type of the generated random value. */ 1121 typedef _UIntType result_type; 1122 1123 /** 1124 * @brief Constructs a default %independent_bits_engine engine. 1125 * 1126 * The underlying engine is default constructed as well. 1127 */ 1128 independent_bits_engine() 1129 : _M_b() { } 1130 1131 /** 1132 * @brief Copy constructs a %independent_bits_engine engine. 1133 * 1134 * Copies an existing base class random number generator. 1135 * @param __rng An existing (base class) engine object. 1136 */ 1137 explicit 1138 independent_bits_engine(const _RandomNumberEngine& __rng) 1139 : _M_b(__rng) { } 1140 1141 /** 1142 * @brief Move constructs a %independent_bits_engine engine. 1143 * 1144 * Copies an existing base class random number generator. 1145 * @param __rng An existing (base class) engine object. 1146 */ 1147 explicit 1148 independent_bits_engine(_RandomNumberEngine&& __rng) 1149 : _M_b(std::move(__rng)) { } 1150 1151 /** 1152 * @brief Seed constructs a %independent_bits_engine engine. 1153 * 1154 * Constructs the underlying generator engine seeded with @p __s. 1155 * @param __s A seed value for the base class engine. 1156 */ 1157 explicit 1158 independent_bits_engine(result_type __s) 1159 : _M_b(__s) { } 1160 1161 /** 1162 * @brief Generator construct a %independent_bits_engine engine. 1163 * 1164 * @param __q A seed sequence. 1165 */ 1166 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 1167 explicit 1168 independent_bits_engine(_Sseq& __q) 1169 : _M_b(__q) 1170 { } 1171 1172 /** 1173 * @brief Reseeds the %independent_bits_engine object with the default 1174 * seed for the underlying base class generator engine. 1175 */ 1176 void 1177 seed() 1178 { _M_b.seed(); } 1179 1180 /** 1181 * @brief Reseeds the %independent_bits_engine object with the default 1182 * seed for the underlying base class generator engine. 1183 */ 1184 void 1185 seed(result_type __s) 1186 { _M_b.seed(__s); } 1187 1188 /** 1189 * @brief Reseeds the %independent_bits_engine object with the given 1190 * seed sequence. 1191 * @param __q A seed generator function. 1192 */ 1193 template<typename _Sseq> 1194 _If_seed_seq<_Sseq> 1195 seed(_Sseq& __q) 1196 { _M_b.seed(__q); } 1197 1198 /** 1199 * @brief Gets a const reference to the underlying generator engine 1200 * object. 1201 */ 1202 const _RandomNumberEngine& 1203 base() const noexcept 1204 { return _M_b; } 1205 1206 /** 1207 * @brief Gets the minimum value in the generated random number range. 1208 */ 1209 static constexpr result_type 1210 min() 1211 { return 0U; } 1212 1213 /** 1214 * @brief Gets the maximum value in the generated random number range. 1215 */ 1216 static constexpr result_type 1217 max() 1218 { return __detail::_Shift<_UIntType, __w>::__value - 1; } 1219 1220 /** 1221 * @brief Discard a sequence of random numbers. 1222 */ 1223 void 1224 discard(unsigned long long __z) 1225 { 1226 for (; __z != 0ULL; --__z) 1227 (*this)(); 1228 } 1229 1230 /** 1231 * @brief Gets the next value in the generated random number sequence. 1232 */ 1233 result_type 1234 operator()(); 1235 1236 /** 1237 * @brief Compares two %independent_bits_engine random number generator 1238 * objects of the same type for equality. 1239 * 1240 * @param __lhs A %independent_bits_engine random number generator 1241 * object. 1242 * @param __rhs Another %independent_bits_engine random number generator 1243 * object. 1244 * 1245 * @returns true if the infinite sequences of generated values 1246 * would be equal, false otherwise. 1247 */ 1248 friend bool 1249 operator==(const independent_bits_engine& __lhs, 1250 const independent_bits_engine& __rhs) 1251 { return __lhs._M_b == __rhs._M_b; } 1252 1253 /** 1254 * @brief Extracts the current state of a % subtract_with_carry_engine 1255 * random number generator engine @p __x from the input stream 1256 * @p __is. 1257 * 1258 * @param __is An input stream. 1259 * @param __x A %independent_bits_engine random number generator 1260 * engine. 1261 * 1262 * @returns The input stream with the state of @p __x extracted or in 1263 * an error state. 1264 */ 1265 template<typename _CharT, typename _Traits> 1266 friend std::basic_istream<_CharT, _Traits>& 1267 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1268 std::independent_bits_engine<_RandomNumberEngine, 1269 __w, _UIntType>& __x) 1270 { 1271 __is >> __x._M_b; 1272 return __is; 1273 } 1274 1275 private: 1276 _RandomNumberEngine _M_b; 1277 }; 1278 1279 /** 1280 * @brief Compares two %independent_bits_engine random number generator 1281 * objects of the same type for inequality. 1282 * 1283 * @param __lhs A %independent_bits_engine random number generator 1284 * object. 1285 * @param __rhs Another %independent_bits_engine random number generator 1286 * object. 1287 * 1288 * @returns true if the infinite sequences of generated values 1289 * would be different, false otherwise. 1290 */ 1291 template<typename _RandomNumberEngine, size_t __w, typename _UIntType> 1292 inline bool 1293 operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w, 1294 _UIntType>& __lhs, 1295 const std::independent_bits_engine<_RandomNumberEngine, __w, 1296 _UIntType>& __rhs) 1297 { return !(__lhs == __rhs); } 1298 1299 /** 1300 * @brief Inserts the current state of a %independent_bits_engine random 1301 * number generator engine @p __x into the output stream @p __os. 1302 * 1303 * @param __os An output stream. 1304 * @param __x A %independent_bits_engine random number generator engine. 1305 * 1306 * @returns The output stream with the state of @p __x inserted or in 1307 * an error state. 1308 */ 1309 template<typename _RandomNumberEngine, size_t __w, typename _UIntType, 1310 typename _CharT, typename _Traits> 1311 std::basic_ostream<_CharT, _Traits>& 1312 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1313 const std::independent_bits_engine<_RandomNumberEngine, 1314 __w, _UIntType>& __x) 1315 { 1316 __os << __x.base(); 1317 return __os; 1318 } 1319 1320 1321 /** 1322 * @brief Produces random numbers by reordering random numbers from some 1323 * base engine. 1324 * 1325 * The values from the base engine are stored in a sequence of size @p __k 1326 * and shuffled by an algorithm that depends on those values. 1327 */ 1328 template<typename _RandomNumberEngine, size_t __k> 1329 class shuffle_order_engine 1330 { 1331 static_assert(1u <= __k, "template argument substituting " 1332 "__k out of bound"); 1333 1334 public: 1335 /** The type of the generated random value. */ 1336 typedef typename _RandomNumberEngine::result_type result_type; 1337 1338 template<typename _Sseq> 1339 using _If_seed_seq = typename enable_if<__detail::__is_seed_seq< 1340 _Sseq, shuffle_order_engine, result_type>::value>::type; 1341 1342 static constexpr size_t table_size = __k; 1343 1344 /** 1345 * @brief Constructs a default %shuffle_order_engine engine. 1346 * 1347 * The underlying engine is default constructed as well. 1348 */ 1349 shuffle_order_engine() 1350 : _M_b() 1351 { _M_initialize(); } 1352 1353 /** 1354 * @brief Copy constructs a %shuffle_order_engine engine. 1355 * 1356 * Copies an existing base class random number generator. 1357 * @param __rng An existing (base class) engine object. 1358 */ 1359 explicit 1360 shuffle_order_engine(const _RandomNumberEngine& __rng) 1361 : _M_b(__rng) 1362 { _M_initialize(); } 1363 1364 /** 1365 * @brief Move constructs a %shuffle_order_engine engine. 1366 * 1367 * Copies an existing base class random number generator. 1368 * @param __rng An existing (base class) engine object. 1369 */ 1370 explicit 1371 shuffle_order_engine(_RandomNumberEngine&& __rng) 1372 : _M_b(std::move(__rng)) 1373 { _M_initialize(); } 1374 1375 /** 1376 * @brief Seed constructs a %shuffle_order_engine engine. 1377 * 1378 * Constructs the underlying generator engine seeded with @p __s. 1379 * @param __s A seed value for the base class engine. 1380 */ 1381 explicit 1382 shuffle_order_engine(result_type __s) 1383 : _M_b(__s) 1384 { _M_initialize(); } 1385 1386 /** 1387 * @brief Generator construct a %shuffle_order_engine engine. 1388 * 1389 * @param __q A seed sequence. 1390 */ 1391 template<typename _Sseq, typename = _If_seed_seq<_Sseq>> 1392 explicit 1393 shuffle_order_engine(_Sseq& __q) 1394 : _M_b(__q) 1395 { _M_initialize(); } 1396 1397 /** 1398 * @brief Reseeds the %shuffle_order_engine object with the default seed 1399 for the underlying base class generator engine. 1400 */ 1401 void 1402 seed() 1403 { 1404 _M_b.seed(); 1405 _M_initialize(); 1406 } 1407 1408 /** 1409 * @brief Reseeds the %shuffle_order_engine object with the default seed 1410 * for the underlying base class generator engine. 1411 */ 1412 void 1413 seed(result_type __s) 1414 { 1415 _M_b.seed(__s); 1416 _M_initialize(); 1417 } 1418 1419 /** 1420 * @brief Reseeds the %shuffle_order_engine object with the given seed 1421 * sequence. 1422 * @param __q A seed generator function. 1423 */ 1424 template<typename _Sseq> 1425 _If_seed_seq<_Sseq> 1426 seed(_Sseq& __q) 1427 { 1428 _M_b.seed(__q); 1429 _M_initialize(); 1430 } 1431 1432 /** 1433 * Gets a const reference to the underlying generator engine object. 1434 */ 1435 const _RandomNumberEngine& 1436 base() const noexcept 1437 { return _M_b; } 1438 1439 /** 1440 * Gets the minimum value in the generated random number range. 1441 */ 1442 static constexpr result_type 1443 min() 1444 { return _RandomNumberEngine::min(); } 1445 1446 /** 1447 * Gets the maximum value in the generated random number range. 1448 */ 1449 static constexpr result_type 1450 max() 1451 { return _RandomNumberEngine::max(); } 1452 1453 /** 1454 * Discard a sequence of random numbers. 1455 */ 1456 void 1457 discard(unsigned long long __z) 1458 { 1459 for (; __z != 0ULL; --__z) 1460 (*this)(); 1461 } 1462 1463 /** 1464 * Gets the next value in the generated random number sequence. 1465 */ 1466 result_type 1467 operator()(); 1468 1469 /** 1470 * Compares two %shuffle_order_engine random number generator objects 1471 * of the same type for equality. 1472 * 1473 * @param __lhs A %shuffle_order_engine random number generator object. 1474 * @param __rhs Another %shuffle_order_engine random number generator 1475 * object. 1476 * 1477 * @returns true if the infinite sequences of generated values 1478 * would be equal, false otherwise. 1479 */ 1480 friend bool 1481 operator==(const shuffle_order_engine& __lhs, 1482 const shuffle_order_engine& __rhs) 1483 { return (__lhs._M_b == __rhs._M_b 1484 && std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v) 1485 && __lhs._M_y == __rhs._M_y); } 1486 1487 /** 1488 * @brief Inserts the current state of a %shuffle_order_engine random 1489 * number generator engine @p __x into the output stream 1490 @p __os. 1491 * 1492 * @param __os An output stream. 1493 * @param __x A %shuffle_order_engine random number generator engine. 1494 * 1495 * @returns The output stream with the state of @p __x inserted or in 1496 * an error state. 1497 */ 1498 template<typename _RandomNumberEngine1, size_t __k1, 1499 typename _CharT, typename _Traits> 1500 friend std::basic_ostream<_CharT, _Traits>& 1501 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1502 const std::shuffle_order_engine<_RandomNumberEngine1, 1503 __k1>& __x); 1504 1505 /** 1506 * @brief Extracts the current state of a % subtract_with_carry_engine 1507 * random number generator engine @p __x from the input stream 1508 * @p __is. 1509 * 1510 * @param __is An input stream. 1511 * @param __x A %shuffle_order_engine random number generator engine. 1512 * 1513 * @returns The input stream with the state of @p __x extracted or in 1514 * an error state. 1515 */ 1516 template<typename _RandomNumberEngine1, size_t __k1, 1517 typename _CharT, typename _Traits> 1518 friend std::basic_istream<_CharT, _Traits>& 1519 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1520 std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x); 1521 1522 private: 1523 void _M_initialize() 1524 { 1525 for (size_t __i = 0; __i < __k; ++__i) 1526 _M_v[__i] = _M_b(); 1527 _M_y = _M_b(); 1528 } 1529 1530 _RandomNumberEngine _M_b; 1531 result_type _M_v[__k]; 1532 result_type _M_y; 1533 }; 1534 1535 /** 1536 * Compares two %shuffle_order_engine random number generator objects 1537 * of the same type for inequality. 1538 * 1539 * @param __lhs A %shuffle_order_engine random number generator object. 1540 * @param __rhs Another %shuffle_order_engine random number generator 1541 * object. 1542 * 1543 * @returns true if the infinite sequences of generated values 1544 * would be different, false otherwise. 1545 */ 1546 template<typename _RandomNumberEngine, size_t __k> 1547 inline bool 1548 operator!=(const std::shuffle_order_engine<_RandomNumberEngine, 1549 __k>& __lhs, 1550 const std::shuffle_order_engine<_RandomNumberEngine, 1551 __k>& __rhs) 1552 { return !(__lhs == __rhs); } 1553 1554 1555 /** 1556 * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller. 1557 */ 1558 typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL> 1559 minstd_rand0; 1560 1561 /** 1562 * An alternative LCR (Lehmer Generator function). 1563 */ 1564 typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL> 1565 minstd_rand; 1566 1567 /** 1568 * The classic Mersenne Twister. 1569 * 1570 * Reference: 1571 * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally 1572 * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions 1573 * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. 1574 */ 1575 typedef mersenne_twister_engine< 1576 uint_fast32_t, 1577 32, 624, 397, 31, 1578 0x9908b0dfUL, 11, 1579 0xffffffffUL, 7, 1580 0x9d2c5680UL, 15, 1581 0xefc60000UL, 18, 1812433253UL> mt19937; 1582 1583 /** 1584 * An alternative Mersenne Twister. 1585 */ 1586 typedef mersenne_twister_engine< 1587 uint_fast64_t, 1588 64, 312, 156, 31, 1589 0xb5026f5aa96619e9ULL, 29, 1590 0x5555555555555555ULL, 17, 1591 0x71d67fffeda60000ULL, 37, 1592 0xfff7eee000000000ULL, 43, 1593 6364136223846793005ULL> mt19937_64; 1594 1595 typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> 1596 ranlux24_base; 1597 1598 typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> 1599 ranlux48_base; 1600 1601 typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; 1602 1603 typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; 1604 1605 typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; 1606 1607 typedef minstd_rand0 default_random_engine; 1608 1609 /** 1610 * A standard interface to a platform-specific non-deterministic 1611 * random number generator (if any are available). 1612 */ 1613 class random_device 1614 { 1615 public: 1616 /** The type of the generated random value. */ 1617 typedef unsigned int result_type; 1618 1619 // constructors, destructors and member functions 1620 1621 random_device() { _M_init("default"); } 1622 1623 explicit 1624 random_device(const std::string& __token) { _M_init(__token); } 1625 1626 #if defined _GLIBCXX_USE_DEV_RANDOM 1627 ~random_device() 1628 { _M_fini(); } 1629 #endif 1630 1631 static constexpr result_type 1632 min() 1633 { return std::numeric_limits<result_type>::min(); } 1634 1635 static constexpr result_type 1636 max() 1637 { return std::numeric_limits<result_type>::max(); } 1638 1639 double 1640 entropy() const noexcept 1641 { 1642 #ifdef _GLIBCXX_USE_DEV_RANDOM 1643 return this->_M_getentropy(); 1644 #else 1645 return 0.0; 1646 #endif 1647 } 1648 1649 result_type 1650 operator()() 1651 { return this->_M_getval(); } 1652 1653 // No copy functions. 1654 random_device(const random_device&) = delete; 1655 void operator=(const random_device&) = delete; 1656 1657 private: 1658 1659 void _M_init(const std::string& __token); 1660 void _M_init_pretr1(const std::string& __token); 1661 void _M_fini(); 1662 1663 result_type _M_getval(); 1664 result_type _M_getval_pretr1(); 1665 double _M_getentropy() const noexcept; 1666 1667 void _M_init(const char*, size_t); // not exported from the shared library 1668 1669 __extension__ union 1670 { 1671 struct 1672 { 1673 void* _M_file; 1674 result_type (*_M_func)(void*); 1675 int _M_fd; 1676 }; 1677 mt19937 _M_mt; 1678 }; 1679 }; 1680 1681 /// @} group random_generators 1682 1683 /** 1684 * @addtogroup random_distributions Random Number Distributions 1685 * @ingroup random 1686 * @{ 1687 */ 1688 1689 /** 1690 * @addtogroup random_distributions_uniform Uniform Distributions 1691 * @ingroup random_distributions 1692 * @{ 1693 */ 1694 1695 // std::uniform_int_distribution is defined in <bits/uniform_int_dist.h> 1696 1697 /** 1698 * @brief Return true if two uniform integer distributions have 1699 * different parameters. 1700 */ 1701 template<typename _IntType> 1702 inline bool 1703 operator!=(const std::uniform_int_distribution<_IntType>& __d1, 1704 const std::uniform_int_distribution<_IntType>& __d2) 1705 { return !(__d1 == __d2); } 1706 1707 /** 1708 * @brief Inserts a %uniform_int_distribution random number 1709 * distribution @p __x into the output stream @p os. 1710 * 1711 * @param __os An output stream. 1712 * @param __x A %uniform_int_distribution random number distribution. 1713 * 1714 * @returns The output stream with the state of @p __x inserted or in 1715 * an error state. 1716 */ 1717 template<typename _IntType, typename _CharT, typename _Traits> 1718 std::basic_ostream<_CharT, _Traits>& 1719 operator<<(std::basic_ostream<_CharT, _Traits>&, 1720 const std::uniform_int_distribution<_IntType>&); 1721 1722 /** 1723 * @brief Extracts a %uniform_int_distribution random number distribution 1724 * @p __x from the input stream @p __is. 1725 * 1726 * @param __is An input stream. 1727 * @param __x A %uniform_int_distribution random number generator engine. 1728 * 1729 * @returns The input stream with @p __x extracted or in an error state. 1730 */ 1731 template<typename _IntType, typename _CharT, typename _Traits> 1732 std::basic_istream<_CharT, _Traits>& 1733 operator>>(std::basic_istream<_CharT, _Traits>&, 1734 std::uniform_int_distribution<_IntType>&); 1735 1736 1737 /** 1738 * @brief Uniform continuous distribution for random numbers. 1739 * 1740 * A continuous random distribution on the range [min, max) with equal 1741 * probability throughout the range. The URNG should be real-valued and 1742 * deliver number in the range [0, 1). 1743 */ 1744 template<typename _RealType = double> 1745 class uniform_real_distribution 1746 { 1747 static_assert(std::is_floating_point<_RealType>::value, 1748 "result_type must be a floating point type"); 1749 1750 public: 1751 /** The type of the range of the distribution. */ 1752 typedef _RealType result_type; 1753 1754 /** Parameter type. */ 1755 struct param_type 1756 { 1757 typedef uniform_real_distribution<_RealType> distribution_type; 1758 1759 param_type() : param_type(0) { } 1760 1761 explicit 1762 param_type(_RealType __a, _RealType __b = _RealType(1)) 1763 : _M_a(__a), _M_b(__b) 1764 { 1765 __glibcxx_assert(_M_a <= _M_b); 1766 } 1767 1768 result_type 1769 a() const 1770 { return _M_a; } 1771 1772 result_type 1773 b() const 1774 { return _M_b; } 1775 1776 friend bool 1777 operator==(const param_type& __p1, const param_type& __p2) 1778 { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 1779 1780 friend bool 1781 operator!=(const param_type& __p1, const param_type& __p2) 1782 { return !(__p1 == __p2); } 1783 1784 private: 1785 _RealType _M_a; 1786 _RealType _M_b; 1787 }; 1788 1789 public: 1790 /** 1791 * @brief Constructs a uniform_real_distribution object. 1792 * 1793 * The lower bound is set to 0.0 and the upper bound to 1.0 1794 */ 1795 uniform_real_distribution() : uniform_real_distribution(0.0) { } 1796 1797 /** 1798 * @brief Constructs a uniform_real_distribution object. 1799 * 1800 * @param __a [IN] The lower bound of the distribution. 1801 * @param __b [IN] The upper bound of the distribution. 1802 */ 1803 explicit 1804 uniform_real_distribution(_RealType __a, _RealType __b = _RealType(1)) 1805 : _M_param(__a, __b) 1806 { } 1807 1808 explicit 1809 uniform_real_distribution(const param_type& __p) 1810 : _M_param(__p) 1811 { } 1812 1813 /** 1814 * @brief Resets the distribution state. 1815 * 1816 * Does nothing for the uniform real distribution. 1817 */ 1818 void 1819 reset() { } 1820 1821 result_type 1822 a() const 1823 { return _M_param.a(); } 1824 1825 result_type 1826 b() const 1827 { return _M_param.b(); } 1828 1829 /** 1830 * @brief Returns the parameter set of the distribution. 1831 */ 1832 param_type 1833 param() const 1834 { return _M_param; } 1835 1836 /** 1837 * @brief Sets the parameter set of the distribution. 1838 * @param __param The new parameter set of the distribution. 1839 */ 1840 void 1841 param(const param_type& __param) 1842 { _M_param = __param; } 1843 1844 /** 1845 * @brief Returns the inclusive lower bound of the distribution range. 1846 */ 1847 result_type 1848 min() const 1849 { return this->a(); } 1850 1851 /** 1852 * @brief Returns the inclusive upper bound of the distribution range. 1853 */ 1854 result_type 1855 max() const 1856 { return this->b(); } 1857 1858 /** 1859 * @brief Generating functions. 1860 */ 1861 template<typename _UniformRandomNumberGenerator> 1862 result_type 1863 operator()(_UniformRandomNumberGenerator& __urng) 1864 { return this->operator()(__urng, _M_param); } 1865 1866 template<typename _UniformRandomNumberGenerator> 1867 result_type 1868 operator()(_UniformRandomNumberGenerator& __urng, 1869 const param_type& __p) 1870 { 1871 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 1872 __aurng(__urng); 1873 return (__aurng() * (__p.b() - __p.a())) + __p.a(); 1874 } 1875 1876 template<typename _ForwardIterator, 1877 typename _UniformRandomNumberGenerator> 1878 void 1879 __generate(_ForwardIterator __f, _ForwardIterator __t, 1880 _UniformRandomNumberGenerator& __urng) 1881 { this->__generate(__f, __t, __urng, _M_param); } 1882 1883 template<typename _ForwardIterator, 1884 typename _UniformRandomNumberGenerator> 1885 void 1886 __generate(_ForwardIterator __f, _ForwardIterator __t, 1887 _UniformRandomNumberGenerator& __urng, 1888 const param_type& __p) 1889 { this->__generate_impl(__f, __t, __urng, __p); } 1890 1891 template<typename _UniformRandomNumberGenerator> 1892 void 1893 __generate(result_type* __f, result_type* __t, 1894 _UniformRandomNumberGenerator& __urng, 1895 const param_type& __p) 1896 { this->__generate_impl(__f, __t, __urng, __p); } 1897 1898 /** 1899 * @brief Return true if two uniform real distributions have 1900 * the same parameters. 1901 */ 1902 friend bool 1903 operator==(const uniform_real_distribution& __d1, 1904 const uniform_real_distribution& __d2) 1905 { return __d1._M_param == __d2._M_param; } 1906 1907 private: 1908 template<typename _ForwardIterator, 1909 typename _UniformRandomNumberGenerator> 1910 void 1911 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 1912 _UniformRandomNumberGenerator& __urng, 1913 const param_type& __p); 1914 1915 param_type _M_param; 1916 }; 1917 1918 /** 1919 * @brief Return true if two uniform real distributions have 1920 * different parameters. 1921 */ 1922 template<typename _IntType> 1923 inline bool 1924 operator!=(const std::uniform_real_distribution<_IntType>& __d1, 1925 const std::uniform_real_distribution<_IntType>& __d2) 1926 { return !(__d1 == __d2); } 1927 1928 /** 1929 * @brief Inserts a %uniform_real_distribution random number 1930 * distribution @p __x into the output stream @p __os. 1931 * 1932 * @param __os An output stream. 1933 * @param __x A %uniform_real_distribution random number distribution. 1934 * 1935 * @returns The output stream with the state of @p __x inserted or in 1936 * an error state. 1937 */ 1938 template<typename _RealType, typename _CharT, typename _Traits> 1939 std::basic_ostream<_CharT, _Traits>& 1940 operator<<(std::basic_ostream<_CharT, _Traits>&, 1941 const std::uniform_real_distribution<_RealType>&); 1942 1943 /** 1944 * @brief Extracts a %uniform_real_distribution random number distribution 1945 * @p __x from the input stream @p __is. 1946 * 1947 * @param __is An input stream. 1948 * @param __x A %uniform_real_distribution random number generator engine. 1949 * 1950 * @returns The input stream with @p __x extracted or in an error state. 1951 */ 1952 template<typename _RealType, typename _CharT, typename _Traits> 1953 std::basic_istream<_CharT, _Traits>& 1954 operator>>(std::basic_istream<_CharT, _Traits>&, 1955 std::uniform_real_distribution<_RealType>&); 1956 1957 /// @} group random_distributions_uniform 1958 1959 /** 1960 * @addtogroup random_distributions_normal Normal Distributions 1961 * @ingroup random_distributions 1962 * @{ 1963 */ 1964 1965 /** 1966 * @brief A normal continuous distribution for random numbers. 1967 * 1968 * The formula for the normal probability density function is 1969 * @f[ 1970 * p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}} 1971 * e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} } 1972 * @f] 1973 */ 1974 template<typename _RealType = double> 1975 class normal_distribution 1976 { 1977 static_assert(std::is_floating_point<_RealType>::value, 1978 "result_type must be a floating point type"); 1979 1980 public: 1981 /** The type of the range of the distribution. */ 1982 typedef _RealType result_type; 1983 1984 /** Parameter type. */ 1985 struct param_type 1986 { 1987 typedef normal_distribution<_RealType> distribution_type; 1988 1989 param_type() : param_type(0.0) { } 1990 1991 explicit 1992 param_type(_RealType __mean, _RealType __stddev = _RealType(1)) 1993 : _M_mean(__mean), _M_stddev(__stddev) 1994 { 1995 __glibcxx_assert(_M_stddev > _RealType(0)); 1996 } 1997 1998 _RealType 1999 mean() const 2000 { return _M_mean; } 2001 2002 _RealType 2003 stddev() const 2004 { return _M_stddev; } 2005 2006 friend bool 2007 operator==(const param_type& __p1, const param_type& __p2) 2008 { return (__p1._M_mean == __p2._M_mean 2009 && __p1._M_stddev == __p2._M_stddev); } 2010 2011 friend bool 2012 operator!=(const param_type& __p1, const param_type& __p2) 2013 { return !(__p1 == __p2); } 2014 2015 private: 2016 _RealType _M_mean; 2017 _RealType _M_stddev; 2018 }; 2019 2020 public: 2021 normal_distribution() : normal_distribution(0.0) { } 2022 2023 /** 2024 * Constructs a normal distribution with parameters @f$mean@f$ and 2025 * standard deviation. 2026 */ 2027 explicit 2028 normal_distribution(result_type __mean, 2029 result_type __stddev = result_type(1)) 2030 : _M_param(__mean, __stddev) 2031 { } 2032 2033 explicit 2034 normal_distribution(const param_type& __p) 2035 : _M_param(__p) 2036 { } 2037 2038 /** 2039 * @brief Resets the distribution state. 2040 */ 2041 void 2042 reset() 2043 { _M_saved_available = false; } 2044 2045 /** 2046 * @brief Returns the mean of the distribution. 2047 */ 2048 _RealType 2049 mean() const 2050 { return _M_param.mean(); } 2051 2052 /** 2053 * @brief Returns the standard deviation of the distribution. 2054 */ 2055 _RealType 2056 stddev() const 2057 { return _M_param.stddev(); } 2058 2059 /** 2060 * @brief Returns the parameter set of the distribution. 2061 */ 2062 param_type 2063 param() const 2064 { return _M_param; } 2065 2066 /** 2067 * @brief Sets the parameter set of the distribution. 2068 * @param __param The new parameter set of the distribution. 2069 */ 2070 void 2071 param(const param_type& __param) 2072 { _M_param = __param; } 2073 2074 /** 2075 * @brief Returns the greatest lower bound value of the distribution. 2076 */ 2077 result_type 2078 min() const 2079 { return std::numeric_limits<result_type>::lowest(); } 2080 2081 /** 2082 * @brief Returns the least upper bound value of the distribution. 2083 */ 2084 result_type 2085 max() const 2086 { return std::numeric_limits<result_type>::max(); } 2087 2088 /** 2089 * @brief Generating functions. 2090 */ 2091 template<typename _UniformRandomNumberGenerator> 2092 result_type 2093 operator()(_UniformRandomNumberGenerator& __urng) 2094 { return this->operator()(__urng, _M_param); } 2095 2096 template<typename _UniformRandomNumberGenerator> 2097 result_type 2098 operator()(_UniformRandomNumberGenerator& __urng, 2099 const param_type& __p); 2100 2101 template<typename _ForwardIterator, 2102 typename _UniformRandomNumberGenerator> 2103 void 2104 __generate(_ForwardIterator __f, _ForwardIterator __t, 2105 _UniformRandomNumberGenerator& __urng) 2106 { this->__generate(__f, __t, __urng, _M_param); } 2107 2108 template<typename _ForwardIterator, 2109 typename _UniformRandomNumberGenerator> 2110 void 2111 __generate(_ForwardIterator __f, _ForwardIterator __t, 2112 _UniformRandomNumberGenerator& __urng, 2113 const param_type& __p) 2114 { this->__generate_impl(__f, __t, __urng, __p); } 2115 2116 template<typename _UniformRandomNumberGenerator> 2117 void 2118 __generate(result_type* __f, result_type* __t, 2119 _UniformRandomNumberGenerator& __urng, 2120 const param_type& __p) 2121 { this->__generate_impl(__f, __t, __urng, __p); } 2122 2123 /** 2124 * @brief Return true if two normal distributions have 2125 * the same parameters and the sequences that would 2126 * be generated are equal. 2127 */ 2128 template<typename _RealType1> 2129 friend bool 2130 operator==(const std::normal_distribution<_RealType1>& __d1, 2131 const std::normal_distribution<_RealType1>& __d2); 2132 2133 /** 2134 * @brief Inserts a %normal_distribution random number distribution 2135 * @p __x into the output stream @p __os. 2136 * 2137 * @param __os An output stream. 2138 * @param __x A %normal_distribution random number distribution. 2139 * 2140 * @returns The output stream with the state of @p __x inserted or in 2141 * an error state. 2142 */ 2143 template<typename _RealType1, typename _CharT, typename _Traits> 2144 friend std::basic_ostream<_CharT, _Traits>& 2145 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2146 const std::normal_distribution<_RealType1>& __x); 2147 2148 /** 2149 * @brief Extracts a %normal_distribution random number distribution 2150 * @p __x from the input stream @p __is. 2151 * 2152 * @param __is An input stream. 2153 * @param __x A %normal_distribution random number generator engine. 2154 * 2155 * @returns The input stream with @p __x extracted or in an error 2156 * state. 2157 */ 2158 template<typename _RealType1, typename _CharT, typename _Traits> 2159 friend std::basic_istream<_CharT, _Traits>& 2160 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2161 std::normal_distribution<_RealType1>& __x); 2162 2163 private: 2164 template<typename _ForwardIterator, 2165 typename _UniformRandomNumberGenerator> 2166 void 2167 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 2168 _UniformRandomNumberGenerator& __urng, 2169 const param_type& __p); 2170 2171 param_type _M_param; 2172 result_type _M_saved = 0; 2173 bool _M_saved_available = false; 2174 }; 2175 2176 /** 2177 * @brief Return true if two normal distributions are different. 2178 */ 2179 template<typename _RealType> 2180 inline bool 2181 operator!=(const std::normal_distribution<_RealType>& __d1, 2182 const std::normal_distribution<_RealType>& __d2) 2183 { return !(__d1 == __d2); } 2184 2185 2186 /** 2187 * @brief A lognormal_distribution random number distribution. 2188 * 2189 * The formula for the normal probability mass function is 2190 * @f[ 2191 * p(x|m,s) = \frac{1}{sx\sqrt{2\pi}} 2192 * \exp{-\frac{(\ln{x} - m)^2}{2s^2}} 2193 * @f] 2194 */ 2195 template<typename _RealType = double> 2196 class lognormal_distribution 2197 { 2198 static_assert(std::is_floating_point<_RealType>::value, 2199 "result_type must be a floating point type"); 2200 2201 public: 2202 /** The type of the range of the distribution. */ 2203 typedef _RealType result_type; 2204 2205 /** Parameter type. */ 2206 struct param_type 2207 { 2208 typedef lognormal_distribution<_RealType> distribution_type; 2209 2210 param_type() : param_type(0.0) { } 2211 2212 explicit 2213 param_type(_RealType __m, _RealType __s = _RealType(1)) 2214 : _M_m(__m), _M_s(__s) 2215 { } 2216 2217 _RealType 2218 m() const 2219 { return _M_m; } 2220 2221 _RealType 2222 s() const 2223 { return _M_s; } 2224 2225 friend bool 2226 operator==(const param_type& __p1, const param_type& __p2) 2227 { return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; } 2228 2229 friend bool 2230 operator!=(const param_type& __p1, const param_type& __p2) 2231 { return !(__p1 == __p2); } 2232 2233 private: 2234 _RealType _M_m; 2235 _RealType _M_s; 2236 }; 2237 2238 lognormal_distribution() : lognormal_distribution(0.0) { } 2239 2240 explicit 2241 lognormal_distribution(_RealType __m, _RealType __s = _RealType(1)) 2242 : _M_param(__m, __s), _M_nd() 2243 { } 2244 2245 explicit 2246 lognormal_distribution(const param_type& __p) 2247 : _M_param(__p), _M_nd() 2248 { } 2249 2250 /** 2251 * Resets the distribution state. 2252 */ 2253 void 2254 reset() 2255 { _M_nd.reset(); } 2256 2257 /** 2258 * 2259 */ 2260 _RealType 2261 m() const 2262 { return _M_param.m(); } 2263 2264 _RealType 2265 s() const 2266 { return _M_param.s(); } 2267 2268 /** 2269 * @brief Returns the parameter set of the distribution. 2270 */ 2271 param_type 2272 param() const 2273 { return _M_param; } 2274 2275 /** 2276 * @brief Sets the parameter set of the distribution. 2277 * @param __param The new parameter set of the distribution. 2278 */ 2279 void 2280 param(const param_type& __param) 2281 { _M_param = __param; } 2282 2283 /** 2284 * @brief Returns the greatest lower bound value of the distribution. 2285 */ 2286 result_type 2287 min() const 2288 { return result_type(0); } 2289 2290 /** 2291 * @brief Returns the least upper bound value of the distribution. 2292 */ 2293 result_type 2294 max() const 2295 { return std::numeric_limits<result_type>::max(); } 2296 2297 /** 2298 * @brief Generating functions. 2299 */ 2300 template<typename _UniformRandomNumberGenerator> 2301 result_type 2302 operator()(_UniformRandomNumberGenerator& __urng) 2303 { return this->operator()(__urng, _M_param); } 2304 2305 template<typename _UniformRandomNumberGenerator> 2306 result_type 2307 operator()(_UniformRandomNumberGenerator& __urng, 2308 const param_type& __p) 2309 { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); } 2310 2311 template<typename _ForwardIterator, 2312 typename _UniformRandomNumberGenerator> 2313 void 2314 __generate(_ForwardIterator __f, _ForwardIterator __t, 2315 _UniformRandomNumberGenerator& __urng) 2316 { this->__generate(__f, __t, __urng, _M_param); } 2317 2318 template<typename _ForwardIterator, 2319 typename _UniformRandomNumberGenerator> 2320 void 2321 __generate(_ForwardIterator __f, _ForwardIterator __t, 2322 _UniformRandomNumberGenerator& __urng, 2323 const param_type& __p) 2324 { this->__generate_impl(__f, __t, __urng, __p); } 2325 2326 template<typename _UniformRandomNumberGenerator> 2327 void 2328 __generate(result_type* __f, result_type* __t, 2329 _UniformRandomNumberGenerator& __urng, 2330 const param_type& __p) 2331 { this->__generate_impl(__f, __t, __urng, __p); } 2332 2333 /** 2334 * @brief Return true if two lognormal distributions have 2335 * the same parameters and the sequences that would 2336 * be generated are equal. 2337 */ 2338 friend bool 2339 operator==(const lognormal_distribution& __d1, 2340 const lognormal_distribution& __d2) 2341 { return (__d1._M_param == __d2._M_param 2342 && __d1._M_nd == __d2._M_nd); } 2343 2344 /** 2345 * @brief Inserts a %lognormal_distribution random number distribution 2346 * @p __x into the output stream @p __os. 2347 * 2348 * @param __os An output stream. 2349 * @param __x A %lognormal_distribution random number distribution. 2350 * 2351 * @returns The output stream with the state of @p __x inserted or in 2352 * an error state. 2353 */ 2354 template<typename _RealType1, typename _CharT, typename _Traits> 2355 friend std::basic_ostream<_CharT, _Traits>& 2356 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2357 const std::lognormal_distribution<_RealType1>& __x); 2358 2359 /** 2360 * @brief Extracts a %lognormal_distribution random number distribution 2361 * @p __x from the input stream @p __is. 2362 * 2363 * @param __is An input stream. 2364 * @param __x A %lognormal_distribution random number 2365 * generator engine. 2366 * 2367 * @returns The input stream with @p __x extracted or in an error state. 2368 */ 2369 template<typename _RealType1, typename _CharT, typename _Traits> 2370 friend std::basic_istream<_CharT, _Traits>& 2371 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2372 std::lognormal_distribution<_RealType1>& __x); 2373 2374 private: 2375 template<typename _ForwardIterator, 2376 typename _UniformRandomNumberGenerator> 2377 void 2378 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 2379 _UniformRandomNumberGenerator& __urng, 2380 const param_type& __p); 2381 2382 param_type _M_param; 2383 2384 std::normal_distribution<result_type> _M_nd; 2385 }; 2386 2387 /** 2388 * @brief Return true if two lognormal distributions are different. 2389 */ 2390 template<typename _RealType> 2391 inline bool 2392 operator!=(const std::lognormal_distribution<_RealType>& __d1, 2393 const std::lognormal_distribution<_RealType>& __d2) 2394 { return !(__d1 == __d2); } 2395 2396 2397 /** 2398 * @brief A gamma continuous distribution for random numbers. 2399 * 2400 * The formula for the gamma probability density function is: 2401 * @f[ 2402 * p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)} 2403 * (x/\beta)^{\alpha - 1} e^{-x/\beta} 2404 * @f] 2405 */ 2406 template<typename _RealType = double> 2407 class gamma_distribution 2408 { 2409 static_assert(std::is_floating_point<_RealType>::value, 2410 "result_type must be a floating point type"); 2411 2412 public: 2413 /** The type of the range of the distribution. */ 2414 typedef _RealType result_type; 2415 2416 /** Parameter type. */ 2417 struct param_type 2418 { 2419 typedef gamma_distribution<_RealType> distribution_type; 2420 friend class gamma_distribution<_RealType>; 2421 2422 param_type() : param_type(1.0) { } 2423 2424 explicit 2425 param_type(_RealType __alpha_val, _RealType __beta_val = _RealType(1)) 2426 : _M_alpha(__alpha_val), _M_beta(__beta_val) 2427 { 2428 __glibcxx_assert(_M_alpha > _RealType(0)); 2429 _M_initialize(); 2430 } 2431 2432 _RealType 2433 alpha() const 2434 { return _M_alpha; } 2435 2436 _RealType 2437 beta() const 2438 { return _M_beta; } 2439 2440 friend bool 2441 operator==(const param_type& __p1, const param_type& __p2) 2442 { return (__p1._M_alpha == __p2._M_alpha 2443 && __p1._M_beta == __p2._M_beta); } 2444 2445 friend bool 2446 operator!=(const param_type& __p1, const param_type& __p2) 2447 { return !(__p1 == __p2); } 2448 2449 private: 2450 void 2451 _M_initialize(); 2452 2453 _RealType _M_alpha; 2454 _RealType _M_beta; 2455 2456 _RealType _M_malpha, _M_a2; 2457 }; 2458 2459 public: 2460 /** 2461 * @brief Constructs a gamma distribution with parameters 1 and 1. 2462 */ 2463 gamma_distribution() : gamma_distribution(1.0) { } 2464 2465 /** 2466 * @brief Constructs a gamma distribution with parameters 2467 * @f$\alpha@f$ and @f$\beta@f$. 2468 */ 2469 explicit 2470 gamma_distribution(_RealType __alpha_val, 2471 _RealType __beta_val = _RealType(1)) 2472 : _M_param(__alpha_val, __beta_val), _M_nd() 2473 { } 2474 2475 explicit 2476 gamma_distribution(const param_type& __p) 2477 : _M_param(__p), _M_nd() 2478 { } 2479 2480 /** 2481 * @brief Resets the distribution state. 2482 */ 2483 void 2484 reset() 2485 { _M_nd.reset(); } 2486 2487 /** 2488 * @brief Returns the @f$\alpha@f$ of the distribution. 2489 */ 2490 _RealType 2491 alpha() const 2492 { return _M_param.alpha(); } 2493 2494 /** 2495 * @brief Returns the @f$\beta@f$ of the distribution. 2496 */ 2497 _RealType 2498 beta() const 2499 { return _M_param.beta(); } 2500 2501 /** 2502 * @brief Returns the parameter set of the distribution. 2503 */ 2504 param_type 2505 param() const 2506 { return _M_param; } 2507 2508 /** 2509 * @brief Sets the parameter set of the distribution. 2510 * @param __param The new parameter set of the distribution. 2511 */ 2512 void 2513 param(const param_type& __param) 2514 { _M_param = __param; } 2515 2516 /** 2517 * @brief Returns the greatest lower bound value of the distribution. 2518 */ 2519 result_type 2520 min() const 2521 { return result_type(0); } 2522 2523 /** 2524 * @brief Returns the least upper bound value of the distribution. 2525 */ 2526 result_type 2527 max() const 2528 { return std::numeric_limits<result_type>::max(); } 2529 2530 /** 2531 * @brief Generating functions. 2532 */ 2533 template<typename _UniformRandomNumberGenerator> 2534 result_type 2535 operator()(_UniformRandomNumberGenerator& __urng) 2536 { return this->operator()(__urng, _M_param); } 2537 2538 template<typename _UniformRandomNumberGenerator> 2539 result_type 2540 operator()(_UniformRandomNumberGenerator& __urng, 2541 const param_type& __p); 2542 2543 template<typename _ForwardIterator, 2544 typename _UniformRandomNumberGenerator> 2545 void 2546 __generate(_ForwardIterator __f, _ForwardIterator __t, 2547 _UniformRandomNumberGenerator& __urng) 2548 { this->__generate(__f, __t, __urng, _M_param); } 2549 2550 template<typename _ForwardIterator, 2551 typename _UniformRandomNumberGenerator> 2552 void 2553 __generate(_ForwardIterator __f, _ForwardIterator __t, 2554 _UniformRandomNumberGenerator& __urng, 2555 const param_type& __p) 2556 { this->__generate_impl(__f, __t, __urng, __p); } 2557 2558 template<typename _UniformRandomNumberGenerator> 2559 void 2560 __generate(result_type* __f, result_type* __t, 2561 _UniformRandomNumberGenerator& __urng, 2562 const param_type& __p) 2563 { this->__generate_impl(__f, __t, __urng, __p); } 2564 2565 /** 2566 * @brief Return true if two gamma distributions have the same 2567 * parameters and the sequences that would be generated 2568 * are equal. 2569 */ 2570 friend bool 2571 operator==(const gamma_distribution& __d1, 2572 const gamma_distribution& __d2) 2573 { return (__d1._M_param == __d2._M_param 2574 && __d1._M_nd == __d2._M_nd); } 2575 2576 /** 2577 * @brief Inserts a %gamma_distribution random number distribution 2578 * @p __x into the output stream @p __os. 2579 * 2580 * @param __os An output stream. 2581 * @param __x A %gamma_distribution random number distribution. 2582 * 2583 * @returns The output stream with the state of @p __x inserted or in 2584 * an error state. 2585 */ 2586 template<typename _RealType1, typename _CharT, typename _Traits> 2587 friend std::basic_ostream<_CharT, _Traits>& 2588 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2589 const std::gamma_distribution<_RealType1>& __x); 2590 2591 /** 2592 * @brief Extracts a %gamma_distribution random number distribution 2593 * @p __x from the input stream @p __is. 2594 * 2595 * @param __is An input stream. 2596 * @param __x A %gamma_distribution random number generator engine. 2597 * 2598 * @returns The input stream with @p __x extracted or in an error state. 2599 */ 2600 template<typename _RealType1, typename _CharT, typename _Traits> 2601 friend std::basic_istream<_CharT, _Traits>& 2602 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2603 std::gamma_distribution<_RealType1>& __x); 2604 2605 private: 2606 template<typename _ForwardIterator, 2607 typename _UniformRandomNumberGenerator> 2608 void 2609 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 2610 _UniformRandomNumberGenerator& __urng, 2611 const param_type& __p); 2612 2613 param_type _M_param; 2614 2615 std::normal_distribution<result_type> _M_nd; 2616 }; 2617 2618 /** 2619 * @brief Return true if two gamma distributions are different. 2620 */ 2621 template<typename _RealType> 2622 inline bool 2623 operator!=(const std::gamma_distribution<_RealType>& __d1, 2624 const std::gamma_distribution<_RealType>& __d2) 2625 { return !(__d1 == __d2); } 2626 2627 2628 /** 2629 * @brief A chi_squared_distribution random number distribution. 2630 * 2631 * The formula for the normal probability mass function is 2632 * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$ 2633 */ 2634 template<typename _RealType = double> 2635 class chi_squared_distribution 2636 { 2637 static_assert(std::is_floating_point<_RealType>::value, 2638 "result_type must be a floating point type"); 2639 2640 public: 2641 /** The type of the range of the distribution. */ 2642 typedef _RealType result_type; 2643 2644 /** Parameter type. */ 2645 struct param_type 2646 { 2647 typedef chi_squared_distribution<_RealType> distribution_type; 2648 2649 param_type() : param_type(1) { } 2650 2651 explicit 2652 param_type(_RealType __n) 2653 : _M_n(__n) 2654 { } 2655 2656 _RealType 2657 n() const 2658 { return _M_n; } 2659 2660 friend bool 2661 operator==(const param_type& __p1, const param_type& __p2) 2662 { return __p1._M_n == __p2._M_n; } 2663 2664 friend bool 2665 operator!=(const param_type& __p1, const param_type& __p2) 2666 { return !(__p1 == __p2); } 2667 2668 private: 2669 _RealType _M_n; 2670 }; 2671 2672 chi_squared_distribution() : chi_squared_distribution(1) { } 2673 2674 explicit 2675 chi_squared_distribution(_RealType __n) 2676 : _M_param(__n), _M_gd(__n / 2) 2677 { } 2678 2679 explicit 2680 chi_squared_distribution(const param_type& __p) 2681 : _M_param(__p), _M_gd(__p.n() / 2) 2682 { } 2683 2684 /** 2685 * @brief Resets the distribution state. 2686 */ 2687 void 2688 reset() 2689 { _M_gd.reset(); } 2690 2691 /** 2692 * 2693 */ 2694 _RealType 2695 n() const 2696 { return _M_param.n(); } 2697 2698 /** 2699 * @brief Returns the parameter set of the distribution. 2700 */ 2701 param_type 2702 param() const 2703 { return _M_param; } 2704 2705 /** 2706 * @brief Sets the parameter set of the distribution. 2707 * @param __param The new parameter set of the distribution. 2708 */ 2709 void 2710 param(const param_type& __param) 2711 { 2712 _M_param = __param; 2713 typedef typename std::gamma_distribution<result_type>::param_type 2714 param_type; 2715 _M_gd.param(param_type{__param.n() / 2}); 2716 } 2717 2718 /** 2719 * @brief Returns the greatest lower bound value of the distribution. 2720 */ 2721 result_type 2722 min() const 2723 { return result_type(0); } 2724 2725 /** 2726 * @brief Returns the least upper bound value of the distribution. 2727 */ 2728 result_type 2729 max() const 2730 { return std::numeric_limits<result_type>::max(); } 2731 2732 /** 2733 * @brief Generating functions. 2734 */ 2735 template<typename _UniformRandomNumberGenerator> 2736 result_type 2737 operator()(_UniformRandomNumberGenerator& __urng) 2738 { return 2 * _M_gd(__urng); } 2739 2740 template<typename _UniformRandomNumberGenerator> 2741 result_type 2742 operator()(_UniformRandomNumberGenerator& __urng, 2743 const param_type& __p) 2744 { 2745 typedef typename std::gamma_distribution<result_type>::param_type 2746 param_type; 2747 return 2 * _M_gd(__urng, param_type(__p.n() / 2)); 2748 } 2749 2750 template<typename _ForwardIterator, 2751 typename _UniformRandomNumberGenerator> 2752 void 2753 __generate(_ForwardIterator __f, _ForwardIterator __t, 2754 _UniformRandomNumberGenerator& __urng) 2755 { this->__generate_impl(__f, __t, __urng); } 2756 2757 template<typename _ForwardIterator, 2758 typename _UniformRandomNumberGenerator> 2759 void 2760 __generate(_ForwardIterator __f, _ForwardIterator __t, 2761 _UniformRandomNumberGenerator& __urng, 2762 const param_type& __p) 2763 { typename std::gamma_distribution<result_type>::param_type 2764 __p2(__p.n() / 2); 2765 this->__generate_impl(__f, __t, __urng, __p2); } 2766 2767 template<typename _UniformRandomNumberGenerator> 2768 void 2769 __generate(result_type* __f, result_type* __t, 2770 _UniformRandomNumberGenerator& __urng) 2771 { this->__generate_impl(__f, __t, __urng); } 2772 2773 template<typename _UniformRandomNumberGenerator> 2774 void 2775 __generate(result_type* __f, result_type* __t, 2776 _UniformRandomNumberGenerator& __urng, 2777 const param_type& __p) 2778 { typename std::gamma_distribution<result_type>::param_type 2779 __p2(__p.n() / 2); 2780 this->__generate_impl(__f, __t, __urng, __p2); } 2781 2782 /** 2783 * @brief Return true if two Chi-squared distributions have 2784 * the same parameters and the sequences that would be 2785 * generated are equal. 2786 */ 2787 friend bool 2788 operator==(const chi_squared_distribution& __d1, 2789 const chi_squared_distribution& __d2) 2790 { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; } 2791 2792 /** 2793 * @brief Inserts a %chi_squared_distribution random number distribution 2794 * @p __x into the output stream @p __os. 2795 * 2796 * @param __os An output stream. 2797 * @param __x A %chi_squared_distribution random number distribution. 2798 * 2799 * @returns The output stream with the state of @p __x inserted or in 2800 * an error state. 2801 */ 2802 template<typename _RealType1, typename _CharT, typename _Traits> 2803 friend std::basic_ostream<_CharT, _Traits>& 2804 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2805 const std::chi_squared_distribution<_RealType1>& __x); 2806 2807 /** 2808 * @brief Extracts a %chi_squared_distribution random number distribution 2809 * @p __x from the input stream @p __is. 2810 * 2811 * @param __is An input stream. 2812 * @param __x A %chi_squared_distribution random number 2813 * generator engine. 2814 * 2815 * @returns The input stream with @p __x extracted or in an error state. 2816 */ 2817 template<typename _RealType1, typename _CharT, typename _Traits> 2818 friend std::basic_istream<_CharT, _Traits>& 2819 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2820 std::chi_squared_distribution<_RealType1>& __x); 2821 2822 private: 2823 template<typename _ForwardIterator, 2824 typename _UniformRandomNumberGenerator> 2825 void 2826 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 2827 _UniformRandomNumberGenerator& __urng); 2828 2829 template<typename _ForwardIterator, 2830 typename _UniformRandomNumberGenerator> 2831 void 2832 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 2833 _UniformRandomNumberGenerator& __urng, 2834 const typename 2835 std::gamma_distribution<result_type>::param_type& __p); 2836 2837 param_type _M_param; 2838 2839 std::gamma_distribution<result_type> _M_gd; 2840 }; 2841 2842 /** 2843 * @brief Return true if two Chi-squared distributions are different. 2844 */ 2845 template<typename _RealType> 2846 inline bool 2847 operator!=(const std::chi_squared_distribution<_RealType>& __d1, 2848 const std::chi_squared_distribution<_RealType>& __d2) 2849 { return !(__d1 == __d2); } 2850 2851 2852 /** 2853 * @brief A cauchy_distribution random number distribution. 2854 * 2855 * The formula for the normal probability mass function is 2856 * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$ 2857 */ 2858 template<typename _RealType = double> 2859 class cauchy_distribution 2860 { 2861 static_assert(std::is_floating_point<_RealType>::value, 2862 "result_type must be a floating point type"); 2863 2864 public: 2865 /** The type of the range of the distribution. */ 2866 typedef _RealType result_type; 2867 2868 /** Parameter type. */ 2869 struct param_type 2870 { 2871 typedef cauchy_distribution<_RealType> distribution_type; 2872 2873 param_type() : param_type(0) { } 2874 2875 explicit 2876 param_type(_RealType __a, _RealType __b = _RealType(1)) 2877 : _M_a(__a), _M_b(__b) 2878 { } 2879 2880 _RealType 2881 a() const 2882 { return _M_a; } 2883 2884 _RealType 2885 b() const 2886 { return _M_b; } 2887 2888 friend bool 2889 operator==(const param_type& __p1, const param_type& __p2) 2890 { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 2891 2892 friend bool 2893 operator!=(const param_type& __p1, const param_type& __p2) 2894 { return !(__p1 == __p2); } 2895 2896 private: 2897 _RealType _M_a; 2898 _RealType _M_b; 2899 }; 2900 2901 cauchy_distribution() : cauchy_distribution(0.0) { } 2902 2903 explicit 2904 cauchy_distribution(_RealType __a, _RealType __b = 1.0) 2905 : _M_param(__a, __b) 2906 { } 2907 2908 explicit 2909 cauchy_distribution(const param_type& __p) 2910 : _M_param(__p) 2911 { } 2912 2913 /** 2914 * @brief Resets the distribution state. 2915 */ 2916 void 2917 reset() 2918 { } 2919 2920 /** 2921 * 2922 */ 2923 _RealType 2924 a() const 2925 { return _M_param.a(); } 2926 2927 _RealType 2928 b() const 2929 { return _M_param.b(); } 2930 2931 /** 2932 * @brief Returns the parameter set of the distribution. 2933 */ 2934 param_type 2935 param() const 2936 { return _M_param; } 2937 2938 /** 2939 * @brief Sets the parameter set of the distribution. 2940 * @param __param The new parameter set of the distribution. 2941 */ 2942 void 2943 param(const param_type& __param) 2944 { _M_param = __param; } 2945 2946 /** 2947 * @brief Returns the greatest lower bound value of the distribution. 2948 */ 2949 result_type 2950 min() const 2951 { return std::numeric_limits<result_type>::lowest(); } 2952 2953 /** 2954 * @brief Returns the least upper bound value of the distribution. 2955 */ 2956 result_type 2957 max() const 2958 { return std::numeric_limits<result_type>::max(); } 2959 2960 /** 2961 * @brief Generating functions. 2962 */ 2963 template<typename _UniformRandomNumberGenerator> 2964 result_type 2965 operator()(_UniformRandomNumberGenerator& __urng) 2966 { return this->operator()(__urng, _M_param); } 2967 2968 template<typename _UniformRandomNumberGenerator> 2969 result_type 2970 operator()(_UniformRandomNumberGenerator& __urng, 2971 const param_type& __p); 2972 2973 template<typename _ForwardIterator, 2974 typename _UniformRandomNumberGenerator> 2975 void 2976 __generate(_ForwardIterator __f, _ForwardIterator __t, 2977 _UniformRandomNumberGenerator& __urng) 2978 { this->__generate(__f, __t, __urng, _M_param); } 2979 2980 template<typename _ForwardIterator, 2981 typename _UniformRandomNumberGenerator> 2982 void 2983 __generate(_ForwardIterator __f, _ForwardIterator __t, 2984 _UniformRandomNumberGenerator& __urng, 2985 const param_type& __p) 2986 { this->__generate_impl(__f, __t, __urng, __p); } 2987 2988 template<typename _UniformRandomNumberGenerator> 2989 void 2990 __generate(result_type* __f, result_type* __t, 2991 _UniformRandomNumberGenerator& __urng, 2992 const param_type& __p) 2993 { this->__generate_impl(__f, __t, __urng, __p); } 2994 2995 /** 2996 * @brief Return true if two Cauchy distributions have 2997 * the same parameters. 2998 */ 2999 friend bool 3000 operator==(const cauchy_distribution& __d1, 3001 const cauchy_distribution& __d2) 3002 { return __d1._M_param == __d2._M_param; } 3003 3004 private: 3005 template<typename _ForwardIterator, 3006 typename _UniformRandomNumberGenerator> 3007 void 3008 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3009 _UniformRandomNumberGenerator& __urng, 3010 const param_type& __p); 3011 3012 param_type _M_param; 3013 }; 3014 3015 /** 3016 * @brief Return true if two Cauchy distributions have 3017 * different parameters. 3018 */ 3019 template<typename _RealType> 3020 inline bool 3021 operator!=(const std::cauchy_distribution<_RealType>& __d1, 3022 const std::cauchy_distribution<_RealType>& __d2) 3023 { return !(__d1 == __d2); } 3024 3025 /** 3026 * @brief Inserts a %cauchy_distribution random number distribution 3027 * @p __x into the output stream @p __os. 3028 * 3029 * @param __os An output stream. 3030 * @param __x A %cauchy_distribution random number distribution. 3031 * 3032 * @returns The output stream with the state of @p __x inserted or in 3033 * an error state. 3034 */ 3035 template<typename _RealType, typename _CharT, typename _Traits> 3036 std::basic_ostream<_CharT, _Traits>& 3037 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3038 const std::cauchy_distribution<_RealType>& __x); 3039 3040 /** 3041 * @brief Extracts a %cauchy_distribution random number distribution 3042 * @p __x from the input stream @p __is. 3043 * 3044 * @param __is An input stream. 3045 * @param __x A %cauchy_distribution random number 3046 * generator engine. 3047 * 3048 * @returns The input stream with @p __x extracted or in an error state. 3049 */ 3050 template<typename _RealType, typename _CharT, typename _Traits> 3051 std::basic_istream<_CharT, _Traits>& 3052 operator>>(std::basic_istream<_CharT, _Traits>& __is, 3053 std::cauchy_distribution<_RealType>& __x); 3054 3055 3056 /** 3057 * @brief A fisher_f_distribution random number distribution. 3058 * 3059 * The formula for the normal probability mass function is 3060 * @f[ 3061 * p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)} 3062 * (\frac{m}{n})^{m/2} x^{(m/2)-1} 3063 * (1 + \frac{mx}{n})^{-(m+n)/2} 3064 * @f] 3065 */ 3066 template<typename _RealType = double> 3067 class fisher_f_distribution 3068 { 3069 static_assert(std::is_floating_point<_RealType>::value, 3070 "result_type must be a floating point type"); 3071 3072 public: 3073 /** The type of the range of the distribution. */ 3074 typedef _RealType result_type; 3075 3076 /** Parameter type. */ 3077 struct param_type 3078 { 3079 typedef fisher_f_distribution<_RealType> distribution_type; 3080 3081 param_type() : param_type(1) { } 3082 3083 explicit 3084 param_type(_RealType __m, _RealType __n = _RealType(1)) 3085 : _M_m(__m), _M_n(__n) 3086 { } 3087 3088 _RealType 3089 m() const 3090 { return _M_m; } 3091 3092 _RealType 3093 n() const 3094 { return _M_n; } 3095 3096 friend bool 3097 operator==(const param_type& __p1, const param_type& __p2) 3098 { return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; } 3099 3100 friend bool 3101 operator!=(const param_type& __p1, const param_type& __p2) 3102 { return !(__p1 == __p2); } 3103 3104 private: 3105 _RealType _M_m; 3106 _RealType _M_n; 3107 }; 3108 3109 fisher_f_distribution() : fisher_f_distribution(1.0) { } 3110 3111 explicit 3112 fisher_f_distribution(_RealType __m, 3113 _RealType __n = _RealType(1)) 3114 : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2) 3115 { } 3116 3117 explicit 3118 fisher_f_distribution(const param_type& __p) 3119 : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2) 3120 { } 3121 3122 /** 3123 * @brief Resets the distribution state. 3124 */ 3125 void 3126 reset() 3127 { 3128 _M_gd_x.reset(); 3129 _M_gd_y.reset(); 3130 } 3131 3132 /** 3133 * 3134 */ 3135 _RealType 3136 m() const 3137 { return _M_param.m(); } 3138 3139 _RealType 3140 n() const 3141 { return _M_param.n(); } 3142 3143 /** 3144 * @brief Returns the parameter set of the distribution. 3145 */ 3146 param_type 3147 param() const 3148 { return _M_param; } 3149 3150 /** 3151 * @brief Sets the parameter set of the distribution. 3152 * @param __param The new parameter set of the distribution. 3153 */ 3154 void 3155 param(const param_type& __param) 3156 { _M_param = __param; } 3157 3158 /** 3159 * @brief Returns the greatest lower bound value of the distribution. 3160 */ 3161 result_type 3162 min() const 3163 { return result_type(0); } 3164 3165 /** 3166 * @brief Returns the least upper bound value of the distribution. 3167 */ 3168 result_type 3169 max() const 3170 { return std::numeric_limits<result_type>::max(); } 3171 3172 /** 3173 * @brief Generating functions. 3174 */ 3175 template<typename _UniformRandomNumberGenerator> 3176 result_type 3177 operator()(_UniformRandomNumberGenerator& __urng) 3178 { return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); } 3179 3180 template<typename _UniformRandomNumberGenerator> 3181 result_type 3182 operator()(_UniformRandomNumberGenerator& __urng, 3183 const param_type& __p) 3184 { 3185 typedef typename std::gamma_distribution<result_type>::param_type 3186 param_type; 3187 return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n()) 3188 / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m())); 3189 } 3190 3191 template<typename _ForwardIterator, 3192 typename _UniformRandomNumberGenerator> 3193 void 3194 __generate(_ForwardIterator __f, _ForwardIterator __t, 3195 _UniformRandomNumberGenerator& __urng) 3196 { this->__generate_impl(__f, __t, __urng); } 3197 3198 template<typename _ForwardIterator, 3199 typename _UniformRandomNumberGenerator> 3200 void 3201 __generate(_ForwardIterator __f, _ForwardIterator __t, 3202 _UniformRandomNumberGenerator& __urng, 3203 const param_type& __p) 3204 { this->__generate_impl(__f, __t, __urng, __p); } 3205 3206 template<typename _UniformRandomNumberGenerator> 3207 void 3208 __generate(result_type* __f, result_type* __t, 3209 _UniformRandomNumberGenerator& __urng) 3210 { this->__generate_impl(__f, __t, __urng); } 3211 3212 template<typename _UniformRandomNumberGenerator> 3213 void 3214 __generate(result_type* __f, result_type* __t, 3215 _UniformRandomNumberGenerator& __urng, 3216 const param_type& __p) 3217 { this->__generate_impl(__f, __t, __urng, __p); } 3218 3219 /** 3220 * @brief Return true if two Fisher f distributions have 3221 * the same parameters and the sequences that would 3222 * be generated are equal. 3223 */ 3224 friend bool 3225 operator==(const fisher_f_distribution& __d1, 3226 const fisher_f_distribution& __d2) 3227 { return (__d1._M_param == __d2._M_param 3228 && __d1._M_gd_x == __d2._M_gd_x 3229 && __d1._M_gd_y == __d2._M_gd_y); } 3230 3231 /** 3232 * @brief Inserts a %fisher_f_distribution random number distribution 3233 * @p __x into the output stream @p __os. 3234 * 3235 * @param __os An output stream. 3236 * @param __x A %fisher_f_distribution random number distribution. 3237 * 3238 * @returns The output stream with the state of @p __x inserted or in 3239 * an error state. 3240 */ 3241 template<typename _RealType1, typename _CharT, typename _Traits> 3242 friend std::basic_ostream<_CharT, _Traits>& 3243 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3244 const std::fisher_f_distribution<_RealType1>& __x); 3245 3246 /** 3247 * @brief Extracts a %fisher_f_distribution random number distribution 3248 * @p __x from the input stream @p __is. 3249 * 3250 * @param __is An input stream. 3251 * @param __x A %fisher_f_distribution random number 3252 * generator engine. 3253 * 3254 * @returns The input stream with @p __x extracted or in an error state. 3255 */ 3256 template<typename _RealType1, typename _CharT, typename _Traits> 3257 friend std::basic_istream<_CharT, _Traits>& 3258 operator>>(std::basic_istream<_CharT, _Traits>& __is, 3259 std::fisher_f_distribution<_RealType1>& __x); 3260 3261 private: 3262 template<typename _ForwardIterator, 3263 typename _UniformRandomNumberGenerator> 3264 void 3265 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3266 _UniformRandomNumberGenerator& __urng); 3267 3268 template<typename _ForwardIterator, 3269 typename _UniformRandomNumberGenerator> 3270 void 3271 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3272 _UniformRandomNumberGenerator& __urng, 3273 const param_type& __p); 3274 3275 param_type _M_param; 3276 3277 std::gamma_distribution<result_type> _M_gd_x, _M_gd_y; 3278 }; 3279 3280 /** 3281 * @brief Return true if two Fisher f distributions are different. 3282 */ 3283 template<typename _RealType> 3284 inline bool 3285 operator!=(const std::fisher_f_distribution<_RealType>& __d1, 3286 const std::fisher_f_distribution<_RealType>& __d2) 3287 { return !(__d1 == __d2); } 3288 3289 /** 3290 * @brief A student_t_distribution random number distribution. 3291 * 3292 * The formula for the normal probability mass function is: 3293 * @f[ 3294 * p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)} 3295 * (1 + \frac{x^2}{n}) ^{-(n+1)/2} 3296 * @f] 3297 */ 3298 template<typename _RealType = double> 3299 class student_t_distribution 3300 { 3301 static_assert(std::is_floating_point<_RealType>::value, 3302 "result_type must be a floating point type"); 3303 3304 public: 3305 /** The type of the range of the distribution. */ 3306 typedef _RealType result_type; 3307 3308 /** Parameter type. */ 3309 struct param_type 3310 { 3311 typedef student_t_distribution<_RealType> distribution_type; 3312 3313 param_type() : param_type(1) { } 3314 3315 explicit 3316 param_type(_RealType __n) 3317 : _M_n(__n) 3318 { } 3319 3320 _RealType 3321 n() const 3322 { return _M_n; } 3323 3324 friend bool 3325 operator==(const param_type& __p1, const param_type& __p2) 3326 { return __p1._M_n == __p2._M_n; } 3327 3328 friend bool 3329 operator!=(const param_type& __p1, const param_type& __p2) 3330 { return !(__p1 == __p2); } 3331 3332 private: 3333 _RealType _M_n; 3334 }; 3335 3336 student_t_distribution() : student_t_distribution(1.0) { } 3337 3338 explicit 3339 student_t_distribution(_RealType __n) 3340 : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2) 3341 { } 3342 3343 explicit 3344 student_t_distribution(const param_type& __p) 3345 : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2) 3346 { } 3347 3348 /** 3349 * @brief Resets the distribution state. 3350 */ 3351 void 3352 reset() 3353 { 3354 _M_nd.reset(); 3355 _M_gd.reset(); 3356 } 3357 3358 /** 3359 * 3360 */ 3361 _RealType 3362 n() const 3363 { return _M_param.n(); } 3364 3365 /** 3366 * @brief Returns the parameter set of the distribution. 3367 */ 3368 param_type 3369 param() const 3370 { return _M_param; } 3371 3372 /** 3373 * @brief Sets the parameter set of the distribution. 3374 * @param __param The new parameter set of the distribution. 3375 */ 3376 void 3377 param(const param_type& __param) 3378 { _M_param = __param; } 3379 3380 /** 3381 * @brief Returns the greatest lower bound value of the distribution. 3382 */ 3383 result_type 3384 min() const 3385 { return std::numeric_limits<result_type>::lowest(); } 3386 3387 /** 3388 * @brief Returns the least upper bound value of the distribution. 3389 */ 3390 result_type 3391 max() const 3392 { return std::numeric_limits<result_type>::max(); } 3393 3394 /** 3395 * @brief Generating functions. 3396 */ 3397 template<typename _UniformRandomNumberGenerator> 3398 result_type 3399 operator()(_UniformRandomNumberGenerator& __urng) 3400 { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); } 3401 3402 template<typename _UniformRandomNumberGenerator> 3403 result_type 3404 operator()(_UniformRandomNumberGenerator& __urng, 3405 const param_type& __p) 3406 { 3407 typedef typename std::gamma_distribution<result_type>::param_type 3408 param_type; 3409 3410 const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2)); 3411 return _M_nd(__urng) * std::sqrt(__p.n() / __g); 3412 } 3413 3414 template<typename _ForwardIterator, 3415 typename _UniformRandomNumberGenerator> 3416 void 3417 __generate(_ForwardIterator __f, _ForwardIterator __t, 3418 _UniformRandomNumberGenerator& __urng) 3419 { this->__generate_impl(__f, __t, __urng); } 3420 3421 template<typename _ForwardIterator, 3422 typename _UniformRandomNumberGenerator> 3423 void 3424 __generate(_ForwardIterator __f, _ForwardIterator __t, 3425 _UniformRandomNumberGenerator& __urng, 3426 const param_type& __p) 3427 { this->__generate_impl(__f, __t, __urng, __p); } 3428 3429 template<typename _UniformRandomNumberGenerator> 3430 void 3431 __generate(result_type* __f, result_type* __t, 3432 _UniformRandomNumberGenerator& __urng) 3433 { this->__generate_impl(__f, __t, __urng); } 3434 3435 template<typename _UniformRandomNumberGenerator> 3436 void 3437 __generate(result_type* __f, result_type* __t, 3438 _UniformRandomNumberGenerator& __urng, 3439 const param_type& __p) 3440 { this->__generate_impl(__f, __t, __urng, __p); } 3441 3442 /** 3443 * @brief Return true if two Student t distributions have 3444 * the same parameters and the sequences that would 3445 * be generated are equal. 3446 */ 3447 friend bool 3448 operator==(const student_t_distribution& __d1, 3449 const student_t_distribution& __d2) 3450 { return (__d1._M_param == __d2._M_param 3451 && __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); } 3452 3453 /** 3454 * @brief Inserts a %student_t_distribution random number distribution 3455 * @p __x into the output stream @p __os. 3456 * 3457 * @param __os An output stream. 3458 * @param __x A %student_t_distribution random number distribution. 3459 * 3460 * @returns The output stream with the state of @p __x inserted or in 3461 * an error state. 3462 */ 3463 template<typename _RealType1, typename _CharT, typename _Traits> 3464 friend std::basic_ostream<_CharT, _Traits>& 3465 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3466 const std::student_t_distribution<_RealType1>& __x); 3467 3468 /** 3469 * @brief Extracts a %student_t_distribution random number distribution 3470 * @p __x from the input stream @p __is. 3471 * 3472 * @param __is An input stream. 3473 * @param __x A %student_t_distribution random number 3474 * generator engine. 3475 * 3476 * @returns The input stream with @p __x extracted or in an error state. 3477 */ 3478 template<typename _RealType1, typename _CharT, typename _Traits> 3479 friend std::basic_istream<_CharT, _Traits>& 3480 operator>>(std::basic_istream<_CharT, _Traits>& __is, 3481 std::student_t_distribution<_RealType1>& __x); 3482 3483 private: 3484 template<typename _ForwardIterator, 3485 typename _UniformRandomNumberGenerator> 3486 void 3487 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3488 _UniformRandomNumberGenerator& __urng); 3489 template<typename _ForwardIterator, 3490 typename _UniformRandomNumberGenerator> 3491 void 3492 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3493 _UniformRandomNumberGenerator& __urng, 3494 const param_type& __p); 3495 3496 param_type _M_param; 3497 3498 std::normal_distribution<result_type> _M_nd; 3499 std::gamma_distribution<result_type> _M_gd; 3500 }; 3501 3502 /** 3503 * @brief Return true if two Student t distributions are different. 3504 */ 3505 template<typename _RealType> 3506 inline bool 3507 operator!=(const std::student_t_distribution<_RealType>& __d1, 3508 const std::student_t_distribution<_RealType>& __d2) 3509 { return !(__d1 == __d2); } 3510 3511 3512 /// @} group random_distributions_normal 3513 3514 /** 3515 * @addtogroup random_distributions_bernoulli Bernoulli Distributions 3516 * @ingroup random_distributions 3517 * @{ 3518 */ 3519 3520 /** 3521 * @brief A Bernoulli random number distribution. 3522 * 3523 * Generates a sequence of true and false values with likelihood @f$p@f$ 3524 * that true will come up and @f$(1 - p)@f$ that false will appear. 3525 */ 3526 class bernoulli_distribution 3527 { 3528 public: 3529 /** The type of the range of the distribution. */ 3530 typedef bool result_type; 3531 3532 /** Parameter type. */ 3533 struct param_type 3534 { 3535 typedef bernoulli_distribution distribution_type; 3536 3537 param_type() : param_type(0.5) { } 3538 3539 explicit 3540 param_type(double __p) 3541 : _M_p(__p) 3542 { 3543 __glibcxx_assert((_M_p >= 0.0) && (_M_p <= 1.0)); 3544 } 3545 3546 double 3547 p() const 3548 { return _M_p; } 3549 3550 friend bool 3551 operator==(const param_type& __p1, const param_type& __p2) 3552 { return __p1._M_p == __p2._M_p; } 3553 3554 friend bool 3555 operator!=(const param_type& __p1, const param_type& __p2) 3556 { return !(__p1 == __p2); } 3557 3558 private: 3559 double _M_p; 3560 }; 3561 3562 public: 3563 /** 3564 * @brief Constructs a Bernoulli distribution with likelihood 0.5. 3565 */ 3566 bernoulli_distribution() : bernoulli_distribution(0.5) { } 3567 3568 /** 3569 * @brief Constructs a Bernoulli distribution with likelihood @p p. 3570 * 3571 * @param __p [IN] The likelihood of a true result being returned. 3572 * Must be in the interval @f$[0, 1]@f$. 3573 */ 3574 explicit 3575 bernoulli_distribution(double __p) 3576 : _M_param(__p) 3577 { } 3578 3579 explicit 3580 bernoulli_distribution(const param_type& __p) 3581 : _M_param(__p) 3582 { } 3583 3584 /** 3585 * @brief Resets the distribution state. 3586 * 3587 * Does nothing for a Bernoulli distribution. 3588 */ 3589 void 3590 reset() { } 3591 3592 /** 3593 * @brief Returns the @p p parameter of the distribution. 3594 */ 3595 double 3596 p() const 3597 { return _M_param.p(); } 3598 3599 /** 3600 * @brief Returns the parameter set of the distribution. 3601 */ 3602 param_type 3603 param() const 3604 { return _M_param; } 3605 3606 /** 3607 * @brief Sets the parameter set of the distribution. 3608 * @param __param The new parameter set of the distribution. 3609 */ 3610 void 3611 param(const param_type& __param) 3612 { _M_param = __param; } 3613 3614 /** 3615 * @brief Returns the greatest lower bound value of the distribution. 3616 */ 3617 result_type 3618 min() const 3619 { return std::numeric_limits<result_type>::min(); } 3620 3621 /** 3622 * @brief Returns the least upper bound value of the distribution. 3623 */ 3624 result_type 3625 max() const 3626 { return std::numeric_limits<result_type>::max(); } 3627 3628 /** 3629 * @brief Generating functions. 3630 */ 3631 template<typename _UniformRandomNumberGenerator> 3632 result_type 3633 operator()(_UniformRandomNumberGenerator& __urng) 3634 { return this->operator()(__urng, _M_param); } 3635 3636 template<typename _UniformRandomNumberGenerator> 3637 result_type 3638 operator()(_UniformRandomNumberGenerator& __urng, 3639 const param_type& __p) 3640 { 3641 __detail::_Adaptor<_UniformRandomNumberGenerator, double> 3642 __aurng(__urng); 3643 if ((__aurng() - __aurng.min()) 3644 < __p.p() * (__aurng.max() - __aurng.min())) 3645 return true; 3646 return false; 3647 } 3648 3649 template<typename _ForwardIterator, 3650 typename _UniformRandomNumberGenerator> 3651 void 3652 __generate(_ForwardIterator __f, _ForwardIterator __t, 3653 _UniformRandomNumberGenerator& __urng) 3654 { this->__generate(__f, __t, __urng, _M_param); } 3655 3656 template<typename _ForwardIterator, 3657 typename _UniformRandomNumberGenerator> 3658 void 3659 __generate(_ForwardIterator __f, _ForwardIterator __t, 3660 _UniformRandomNumberGenerator& __urng, const param_type& __p) 3661 { this->__generate_impl(__f, __t, __urng, __p); } 3662 3663 template<typename _UniformRandomNumberGenerator> 3664 void 3665 __generate(result_type* __f, result_type* __t, 3666 _UniformRandomNumberGenerator& __urng, 3667 const param_type& __p) 3668 { this->__generate_impl(__f, __t, __urng, __p); } 3669 3670 /** 3671 * @brief Return true if two Bernoulli distributions have 3672 * the same parameters. 3673 */ 3674 friend bool 3675 operator==(const bernoulli_distribution& __d1, 3676 const bernoulli_distribution& __d2) 3677 { return __d1._M_param == __d2._M_param; } 3678 3679 private: 3680 template<typename _ForwardIterator, 3681 typename _UniformRandomNumberGenerator> 3682 void 3683 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3684 _UniformRandomNumberGenerator& __urng, 3685 const param_type& __p); 3686 3687 param_type _M_param; 3688 }; 3689 3690 /** 3691 * @brief Return true if two Bernoulli distributions have 3692 * different parameters. 3693 */ 3694 inline bool 3695 operator!=(const std::bernoulli_distribution& __d1, 3696 const std::bernoulli_distribution& __d2) 3697 { return !(__d1 == __d2); } 3698 3699 /** 3700 * @brief Inserts a %bernoulli_distribution random number distribution 3701 * @p __x into the output stream @p __os. 3702 * 3703 * @param __os An output stream. 3704 * @param __x A %bernoulli_distribution random number distribution. 3705 * 3706 * @returns The output stream with the state of @p __x inserted or in 3707 * an error state. 3708 */ 3709 template<typename _CharT, typename _Traits> 3710 std::basic_ostream<_CharT, _Traits>& 3711 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3712 const std::bernoulli_distribution& __x); 3713 3714 /** 3715 * @brief Extracts a %bernoulli_distribution random number distribution 3716 * @p __x from the input stream @p __is. 3717 * 3718 * @param __is An input stream. 3719 * @param __x A %bernoulli_distribution random number generator engine. 3720 * 3721 * @returns The input stream with @p __x extracted or in an error state. 3722 */ 3723 template<typename _CharT, typename _Traits> 3724 inline std::basic_istream<_CharT, _Traits>& 3725 operator>>(std::basic_istream<_CharT, _Traits>& __is, 3726 std::bernoulli_distribution& __x) 3727 { 3728 double __p; 3729 if (__is >> __p) 3730 __x.param(bernoulli_distribution::param_type(__p)); 3731 return __is; 3732 } 3733 3734 3735 /** 3736 * @brief A discrete binomial random number distribution. 3737 * 3738 * The formula for the binomial probability density function is 3739 * @f$p(i|t,p) = \binom{t}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 3740 * and @f$p@f$ are the parameters of the distribution. 3741 */ 3742 template<typename _IntType = int> 3743 class binomial_distribution 3744 { 3745 static_assert(std::is_integral<_IntType>::value, 3746 "result_type must be an integral type"); 3747 3748 public: 3749 /** The type of the range of the distribution. */ 3750 typedef _IntType result_type; 3751 3752 /** Parameter type. */ 3753 struct param_type 3754 { 3755 typedef binomial_distribution<_IntType> distribution_type; 3756 friend class binomial_distribution<_IntType>; 3757 3758 param_type() : param_type(1) { } 3759 3760 explicit 3761 param_type(_IntType __t, double __p = 0.5) 3762 : _M_t(__t), _M_p(__p) 3763 { 3764 __glibcxx_assert((_M_t >= _IntType(0)) 3765 && (_M_p >= 0.0) 3766 && (_M_p <= 1.0)); 3767 _M_initialize(); 3768 } 3769 3770 _IntType 3771 t() const 3772 { return _M_t; } 3773 3774 double 3775 p() const 3776 { return _M_p; } 3777 3778 friend bool 3779 operator==(const param_type& __p1, const param_type& __p2) 3780 { return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; } 3781 3782 friend bool 3783 operator!=(const param_type& __p1, const param_type& __p2) 3784 { return !(__p1 == __p2); } 3785 3786 private: 3787 void 3788 _M_initialize(); 3789 3790 _IntType _M_t; 3791 double _M_p; 3792 3793 double _M_q; 3794 #if _GLIBCXX_USE_C99_MATH_TR1 3795 double _M_d1, _M_d2, _M_s1, _M_s2, _M_c, 3796 _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p; 3797 #endif 3798 bool _M_easy; 3799 }; 3800 3801 // constructors and member functions 3802 3803 binomial_distribution() : binomial_distribution(1) { } 3804 3805 explicit 3806 binomial_distribution(_IntType __t, double __p = 0.5) 3807 : _M_param(__t, __p), _M_nd() 3808 { } 3809 3810 explicit 3811 binomial_distribution(const param_type& __p) 3812 : _M_param(__p), _M_nd() 3813 { } 3814 3815 /** 3816 * @brief Resets the distribution state. 3817 */ 3818 void 3819 reset() 3820 { _M_nd.reset(); } 3821 3822 /** 3823 * @brief Returns the distribution @p t parameter. 3824 */ 3825 _IntType 3826 t() const 3827 { return _M_param.t(); } 3828 3829 /** 3830 * @brief Returns the distribution @p p parameter. 3831 */ 3832 double 3833 p() const 3834 { return _M_param.p(); } 3835 3836 /** 3837 * @brief Returns the parameter set of the distribution. 3838 */ 3839 param_type 3840 param() const 3841 { return _M_param; } 3842 3843 /** 3844 * @brief Sets the parameter set of the distribution. 3845 * @param __param The new parameter set of the distribution. 3846 */ 3847 void 3848 param(const param_type& __param) 3849 { _M_param = __param; } 3850 3851 /** 3852 * @brief Returns the greatest lower bound value of the distribution. 3853 */ 3854 result_type 3855 min() const 3856 { return 0; } 3857 3858 /** 3859 * @brief Returns the least upper bound value of the distribution. 3860 */ 3861 result_type 3862 max() const 3863 { return _M_param.t(); } 3864 3865 /** 3866 * @brief Generating functions. 3867 */ 3868 template<typename _UniformRandomNumberGenerator> 3869 result_type 3870 operator()(_UniformRandomNumberGenerator& __urng) 3871 { return this->operator()(__urng, _M_param); } 3872 3873 template<typename _UniformRandomNumberGenerator> 3874 result_type 3875 operator()(_UniformRandomNumberGenerator& __urng, 3876 const param_type& __p); 3877 3878 template<typename _ForwardIterator, 3879 typename _UniformRandomNumberGenerator> 3880 void 3881 __generate(_ForwardIterator __f, _ForwardIterator __t, 3882 _UniformRandomNumberGenerator& __urng) 3883 { this->__generate(__f, __t, __urng, _M_param); } 3884 3885 template<typename _ForwardIterator, 3886 typename _UniformRandomNumberGenerator> 3887 void 3888 __generate(_ForwardIterator __f, _ForwardIterator __t, 3889 _UniformRandomNumberGenerator& __urng, 3890 const param_type& __p) 3891 { this->__generate_impl(__f, __t, __urng, __p); } 3892 3893 template<typename _UniformRandomNumberGenerator> 3894 void 3895 __generate(result_type* __f, result_type* __t, 3896 _UniformRandomNumberGenerator& __urng, 3897 const param_type& __p) 3898 { this->__generate_impl(__f, __t, __urng, __p); } 3899 3900 /** 3901 * @brief Return true if two binomial distributions have 3902 * the same parameters and the sequences that would 3903 * be generated are equal. 3904 */ 3905 friend bool 3906 operator==(const binomial_distribution& __d1, 3907 const binomial_distribution& __d2) 3908 #ifdef _GLIBCXX_USE_C99_MATH_TR1 3909 { return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; } 3910 #else 3911 { return __d1._M_param == __d2._M_param; } 3912 #endif 3913 3914 /** 3915 * @brief Inserts a %binomial_distribution random number distribution 3916 * @p __x into the output stream @p __os. 3917 * 3918 * @param __os An output stream. 3919 * @param __x A %binomial_distribution random number distribution. 3920 * 3921 * @returns The output stream with the state of @p __x inserted or in 3922 * an error state. 3923 */ 3924 template<typename _IntType1, 3925 typename _CharT, typename _Traits> 3926 friend std::basic_ostream<_CharT, _Traits>& 3927 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 3928 const std::binomial_distribution<_IntType1>& __x); 3929 3930 /** 3931 * @brief Extracts a %binomial_distribution random number distribution 3932 * @p __x from the input stream @p __is. 3933 * 3934 * @param __is An input stream. 3935 * @param __x A %binomial_distribution random number generator engine. 3936 * 3937 * @returns The input stream with @p __x extracted or in an error 3938 * state. 3939 */ 3940 template<typename _IntType1, 3941 typename _CharT, typename _Traits> 3942 friend std::basic_istream<_CharT, _Traits>& 3943 operator>>(std::basic_istream<_CharT, _Traits>& __is, 3944 std::binomial_distribution<_IntType1>& __x); 3945 3946 private: 3947 template<typename _ForwardIterator, 3948 typename _UniformRandomNumberGenerator> 3949 void 3950 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 3951 _UniformRandomNumberGenerator& __urng, 3952 const param_type& __p); 3953 3954 template<typename _UniformRandomNumberGenerator> 3955 result_type 3956 _M_waiting(_UniformRandomNumberGenerator& __urng, 3957 _IntType __t, double __q); 3958 3959 param_type _M_param; 3960 3961 // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 3962 std::normal_distribution<double> _M_nd; 3963 }; 3964 3965 /** 3966 * @brief Return true if two binomial distributions are different. 3967 */ 3968 template<typename _IntType> 3969 inline bool 3970 operator!=(const std::binomial_distribution<_IntType>& __d1, 3971 const std::binomial_distribution<_IntType>& __d2) 3972 { return !(__d1 == __d2); } 3973 3974 3975 /** 3976 * @brief A discrete geometric random number distribution. 3977 * 3978 * The formula for the geometric probability density function is 3979 * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the 3980 * distribution. 3981 */ 3982 template<typename _IntType = int> 3983 class geometric_distribution 3984 { 3985 static_assert(std::is_integral<_IntType>::value, 3986 "result_type must be an integral type"); 3987 3988 public: 3989 /** The type of the range of the distribution. */ 3990 typedef _IntType result_type; 3991 3992 /** Parameter type. */ 3993 struct param_type 3994 { 3995 typedef geometric_distribution<_IntType> distribution_type; 3996 friend class geometric_distribution<_IntType>; 3997 3998 param_type() : param_type(0.5) { } 3999 4000 explicit 4001 param_type(double __p) 4002 : _M_p(__p) 4003 { 4004 __glibcxx_assert((_M_p > 0.0) && (_M_p < 1.0)); 4005 _M_initialize(); 4006 } 4007 4008 double 4009 p() const 4010 { return _M_p; } 4011 4012 friend bool 4013 operator==(const param_type& __p1, const param_type& __p2) 4014 { return __p1._M_p == __p2._M_p; } 4015 4016 friend bool 4017 operator!=(const param_type& __p1, const param_type& __p2) 4018 { return !(__p1 == __p2); } 4019 4020 private: 4021 void 4022 _M_initialize() 4023 { _M_log_1_p = std::log(1.0 - _M_p); } 4024 4025 double _M_p; 4026 4027 double _M_log_1_p; 4028 }; 4029 4030 // constructors and member functions 4031 4032 geometric_distribution() : geometric_distribution(0.5) { } 4033 4034 explicit 4035 geometric_distribution(double __p) 4036 : _M_param(__p) 4037 { } 4038 4039 explicit 4040 geometric_distribution(const param_type& __p) 4041 : _M_param(__p) 4042 { } 4043 4044 /** 4045 * @brief Resets the distribution state. 4046 * 4047 * Does nothing for the geometric distribution. 4048 */ 4049 void 4050 reset() { } 4051 4052 /** 4053 * @brief Returns the distribution parameter @p p. 4054 */ 4055 double 4056 p() const 4057 { return _M_param.p(); } 4058 4059 /** 4060 * @brief Returns the parameter set of the distribution. 4061 */ 4062 param_type 4063 param() const 4064 { return _M_param; } 4065 4066 /** 4067 * @brief Sets the parameter set of the distribution. 4068 * @param __param The new parameter set of the distribution. 4069 */ 4070 void 4071 param(const param_type& __param) 4072 { _M_param = __param; } 4073 4074 /** 4075 * @brief Returns the greatest lower bound value of the distribution. 4076 */ 4077 result_type 4078 min() const 4079 { return 0; } 4080 4081 /** 4082 * @brief Returns the least upper bound value of the distribution. 4083 */ 4084 result_type 4085 max() const 4086 { return std::numeric_limits<result_type>::max(); } 4087 4088 /** 4089 * @brief Generating functions. 4090 */ 4091 template<typename _UniformRandomNumberGenerator> 4092 result_type 4093 operator()(_UniformRandomNumberGenerator& __urng) 4094 { return this->operator()(__urng, _M_param); } 4095 4096 template<typename _UniformRandomNumberGenerator> 4097 result_type 4098 operator()(_UniformRandomNumberGenerator& __urng, 4099 const param_type& __p); 4100 4101 template<typename _ForwardIterator, 4102 typename _UniformRandomNumberGenerator> 4103 void 4104 __generate(_ForwardIterator __f, _ForwardIterator __t, 4105 _UniformRandomNumberGenerator& __urng) 4106 { this->__generate(__f, __t, __urng, _M_param); } 4107 4108 template<typename _ForwardIterator, 4109 typename _UniformRandomNumberGenerator> 4110 void 4111 __generate(_ForwardIterator __f, _ForwardIterator __t, 4112 _UniformRandomNumberGenerator& __urng, 4113 const param_type& __p) 4114 { this->__generate_impl(__f, __t, __urng, __p); } 4115 4116 template<typename _UniformRandomNumberGenerator> 4117 void 4118 __generate(result_type* __f, result_type* __t, 4119 _UniformRandomNumberGenerator& __urng, 4120 const param_type& __p) 4121 { this->__generate_impl(__f, __t, __urng, __p); } 4122 4123 /** 4124 * @brief Return true if two geometric distributions have 4125 * the same parameters. 4126 */ 4127 friend bool 4128 operator==(const geometric_distribution& __d1, 4129 const geometric_distribution& __d2) 4130 { return __d1._M_param == __d2._M_param; } 4131 4132 private: 4133 template<typename _ForwardIterator, 4134 typename _UniformRandomNumberGenerator> 4135 void 4136 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 4137 _UniformRandomNumberGenerator& __urng, 4138 const param_type& __p); 4139 4140 param_type _M_param; 4141 }; 4142 4143 /** 4144 * @brief Return true if two geometric distributions have 4145 * different parameters. 4146 */ 4147 template<typename _IntType> 4148 inline bool 4149 operator!=(const std::geometric_distribution<_IntType>& __d1, 4150 const std::geometric_distribution<_IntType>& __d2) 4151 { return !(__d1 == __d2); } 4152 4153 /** 4154 * @brief Inserts a %geometric_distribution random number distribution 4155 * @p __x into the output stream @p __os. 4156 * 4157 * @param __os An output stream. 4158 * @param __x A %geometric_distribution random number distribution. 4159 * 4160 * @returns The output stream with the state of @p __x inserted or in 4161 * an error state. 4162 */ 4163 template<typename _IntType, 4164 typename _CharT, typename _Traits> 4165 std::basic_ostream<_CharT, _Traits>& 4166 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 4167 const std::geometric_distribution<_IntType>& __x); 4168 4169 /** 4170 * @brief Extracts a %geometric_distribution random number distribution 4171 * @p __x from the input stream @p __is. 4172 * 4173 * @param __is An input stream. 4174 * @param __x A %geometric_distribution random number generator engine. 4175 * 4176 * @returns The input stream with @p __x extracted or in an error state. 4177 */ 4178 template<typename _IntType, 4179 typename _CharT, typename _Traits> 4180 std::basic_istream<_CharT, _Traits>& 4181 operator>>(std::basic_istream<_CharT, _Traits>& __is, 4182 std::geometric_distribution<_IntType>& __x); 4183 4184 4185 /** 4186 * @brief A negative_binomial_distribution random number distribution. 4187 * 4188 * The formula for the negative binomial probability mass function is 4189 * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$ 4190 * and @f$p@f$ are the parameters of the distribution. 4191 */ 4192 template<typename _IntType = int> 4193 class negative_binomial_distribution 4194 { 4195 static_assert(std::is_integral<_IntType>::value, 4196 "result_type must be an integral type"); 4197 4198 public: 4199 /** The type of the range of the distribution. */ 4200 typedef _IntType result_type; 4201 4202 /** Parameter type. */ 4203 struct param_type 4204 { 4205 typedef negative_binomial_distribution<_IntType> distribution_type; 4206 4207 param_type() : param_type(1) { } 4208 4209 explicit 4210 param_type(_IntType __k, double __p = 0.5) 4211 : _M_k(__k), _M_p(__p) 4212 { 4213 __glibcxx_assert((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0)); 4214 } 4215 4216 _IntType 4217 k() const 4218 { return _M_k; } 4219 4220 double 4221 p() const 4222 { return _M_p; } 4223 4224 friend bool 4225 operator==(const param_type& __p1, const param_type& __p2) 4226 { return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; } 4227 4228 friend bool 4229 operator!=(const param_type& __p1, const param_type& __p2) 4230 { return !(__p1 == __p2); } 4231 4232 private: 4233 _IntType _M_k; 4234 double _M_p; 4235 }; 4236 4237 negative_binomial_distribution() : negative_binomial_distribution(1) { } 4238 4239 explicit 4240 negative_binomial_distribution(_IntType __k, double __p = 0.5) 4241 : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p) 4242 { } 4243 4244 explicit 4245 negative_binomial_distribution(const param_type& __p) 4246 : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p()) 4247 { } 4248 4249 /** 4250 * @brief Resets the distribution state. 4251 */ 4252 void 4253 reset() 4254 { _M_gd.reset(); } 4255 4256 /** 4257 * @brief Return the @f$k@f$ parameter of the distribution. 4258 */ 4259 _IntType 4260 k() const 4261 { return _M_param.k(); } 4262 4263 /** 4264 * @brief Return the @f$p@f$ parameter of the distribution. 4265 */ 4266 double 4267 p() const 4268 { return _M_param.p(); } 4269 4270 /** 4271 * @brief Returns the parameter set of the distribution. 4272 */ 4273 param_type 4274 param() const 4275 { return _M_param; } 4276 4277 /** 4278 * @brief Sets the parameter set of the distribution. 4279 * @param __param The new parameter set of the distribution. 4280 */ 4281 void 4282 param(const param_type& __param) 4283 { _M_param = __param; } 4284 4285 /** 4286 * @brief Returns the greatest lower bound value of the distribution. 4287 */ 4288 result_type 4289 min() const 4290 { return result_type(0); } 4291 4292 /** 4293 * @brief Returns the least upper bound value of the distribution. 4294 */ 4295 result_type 4296 max() const 4297 { return std::numeric_limits<result_type>::max(); } 4298 4299 /** 4300 * @brief Generating functions. 4301 */ 4302 template<typename _UniformRandomNumberGenerator> 4303 result_type 4304 operator()(_UniformRandomNumberGenerator& __urng); 4305 4306 template<typename _UniformRandomNumberGenerator> 4307 result_type 4308 operator()(_UniformRandomNumberGenerator& __urng, 4309 const param_type& __p); 4310 4311 template<typename _ForwardIterator, 4312 typename _UniformRandomNumberGenerator> 4313 void 4314 __generate(_ForwardIterator __f, _ForwardIterator __t, 4315 _UniformRandomNumberGenerator& __urng) 4316 { this->__generate_impl(__f, __t, __urng); } 4317 4318 template<typename _ForwardIterator, 4319 typename _UniformRandomNumberGenerator> 4320 void 4321 __generate(_ForwardIterator __f, _ForwardIterator __t, 4322 _UniformRandomNumberGenerator& __urng, 4323 const param_type& __p) 4324 { this->__generate_impl(__f, __t, __urng, __p); } 4325 4326 template<typename _UniformRandomNumberGenerator> 4327 void 4328 __generate(result_type* __f, result_type* __t, 4329 _UniformRandomNumberGenerator& __urng) 4330 { this->__generate_impl(__f, __t, __urng); } 4331 4332 template<typename _UniformRandomNumberGenerator> 4333 void 4334 __generate(result_type* __f, result_type* __t, 4335 _UniformRandomNumberGenerator& __urng, 4336 const param_type& __p) 4337 { this->__generate_impl(__f, __t, __urng, __p); } 4338 4339 /** 4340 * @brief Return true if two negative binomial distributions have 4341 * the same parameters and the sequences that would be 4342 * generated are equal. 4343 */ 4344 friend bool 4345 operator==(const negative_binomial_distribution& __d1, 4346 const negative_binomial_distribution& __d2) 4347 { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; } 4348 4349 /** 4350 * @brief Inserts a %negative_binomial_distribution random 4351 * number distribution @p __x into the output stream @p __os. 4352 * 4353 * @param __os An output stream. 4354 * @param __x A %negative_binomial_distribution random number 4355 * distribution. 4356 * 4357 * @returns The output stream with the state of @p __x inserted or in 4358 * an error state. 4359 */ 4360 template<typename _IntType1, typename _CharT, typename _Traits> 4361 friend std::basic_ostream<_CharT, _Traits>& 4362 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 4363 const std::negative_binomial_distribution<_IntType1>& __x); 4364 4365 /** 4366 * @brief Extracts a %negative_binomial_distribution random number 4367 * distribution @p __x from the input stream @p __is. 4368 * 4369 * @param __is An input stream. 4370 * @param __x A %negative_binomial_distribution random number 4371 * generator engine. 4372 * 4373 * @returns The input stream with @p __x extracted or in an error state. 4374 */ 4375 template<typename _IntType1, typename _CharT, typename _Traits> 4376 friend std::basic_istream<_CharT, _Traits>& 4377 operator>>(std::basic_istream<_CharT, _Traits>& __is, 4378 std::negative_binomial_distribution<_IntType1>& __x); 4379 4380 private: 4381 template<typename _ForwardIterator, 4382 typename _UniformRandomNumberGenerator> 4383 void 4384 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 4385 _UniformRandomNumberGenerator& __urng); 4386 template<typename _ForwardIterator, 4387 typename _UniformRandomNumberGenerator> 4388 void 4389 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 4390 _UniformRandomNumberGenerator& __urng, 4391 const param_type& __p); 4392 4393 param_type _M_param; 4394 4395 std::gamma_distribution<double> _M_gd; 4396 }; 4397 4398 /** 4399 * @brief Return true if two negative binomial distributions are different. 4400 */ 4401 template<typename _IntType> 4402 inline bool 4403 operator!=(const std::negative_binomial_distribution<_IntType>& __d1, 4404 const std::negative_binomial_distribution<_IntType>& __d2) 4405 { return !(__d1 == __d2); } 4406 4407 4408 /// @} group random_distributions_bernoulli 4409 4410 /** 4411 * @addtogroup random_distributions_poisson Poisson Distributions 4412 * @ingroup random_distributions 4413 * @{ 4414 */ 4415 4416 /** 4417 * @brief A discrete Poisson random number distribution. 4418 * 4419 * The formula for the Poisson probability density function is 4420 * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the 4421 * parameter of the distribution. 4422 */ 4423 template<typename _IntType = int> 4424 class poisson_distribution 4425 { 4426 static_assert(std::is_integral<_IntType>::value, 4427 "result_type must be an integral type"); 4428 4429 public: 4430 /** The type of the range of the distribution. */ 4431 typedef _IntType result_type; 4432 4433 /** Parameter type. */ 4434 struct param_type 4435 { 4436 typedef poisson_distribution<_IntType> distribution_type; 4437 friend class poisson_distribution<_IntType>; 4438 4439 param_type() : param_type(1.0) { } 4440 4441 explicit 4442 param_type(double __mean) 4443 : _M_mean(__mean) 4444 { 4445 __glibcxx_assert(_M_mean > 0.0); 4446 _M_initialize(); 4447 } 4448 4449 double 4450 mean() const 4451 { return _M_mean; } 4452 4453 friend bool 4454 operator==(const param_type& __p1, const param_type& __p2) 4455 { return __p1._M_mean == __p2._M_mean; } 4456 4457 friend bool 4458 operator!=(const param_type& __p1, const param_type& __p2) 4459 { return !(__p1 == __p2); } 4460 4461 private: 4462 // Hosts either log(mean) or the threshold of the simple method. 4463 void 4464 _M_initialize(); 4465 4466 double _M_mean; 4467 4468 double _M_lm_thr; 4469 #if _GLIBCXX_USE_C99_MATH_TR1 4470 double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb; 4471 #endif 4472 }; 4473 4474 // constructors and member functions 4475 4476 poisson_distribution() : poisson_distribution(1.0) { } 4477 4478 explicit 4479 poisson_distribution(double __mean) 4480 : _M_param(__mean), _M_nd() 4481 { } 4482 4483 explicit 4484 poisson_distribution(const param_type& __p) 4485 : _M_param(__p), _M_nd() 4486 { } 4487 4488 /** 4489 * @brief Resets the distribution state. 4490 */ 4491 void 4492 reset() 4493 { _M_nd.reset(); } 4494 4495 /** 4496 * @brief Returns the distribution parameter @p mean. 4497 */ 4498 double 4499 mean() const 4500 { return _M_param.mean(); } 4501 4502 /** 4503 * @brief Returns the parameter set of the distribution. 4504 */ 4505 param_type 4506 param() const 4507 { return _M_param; } 4508 4509 /** 4510 * @brief Sets the parameter set of the distribution. 4511 * @param __param The new parameter set of the distribution. 4512 */ 4513 void 4514 param(const param_type& __param) 4515 { _M_param = __param; } 4516 4517 /** 4518 * @brief Returns the greatest lower bound value of the distribution. 4519 */ 4520 result_type 4521 min() const 4522 { return 0; } 4523 4524 /** 4525 * @brief Returns the least upper bound value of the distribution. 4526 */ 4527 result_type 4528 max() const 4529 { return std::numeric_limits<result_type>::max(); } 4530 4531 /** 4532 * @brief Generating functions. 4533 */ 4534 template<typename _UniformRandomNumberGenerator> 4535 result_type 4536 operator()(_UniformRandomNumberGenerator& __urng) 4537 { return this->operator()(__urng, _M_param); } 4538 4539 template<typename _UniformRandomNumberGenerator> 4540 result_type 4541 operator()(_UniformRandomNumberGenerator& __urng, 4542 const param_type& __p); 4543 4544 template<typename _ForwardIterator, 4545 typename _UniformRandomNumberGenerator> 4546 void 4547 __generate(_ForwardIterator __f, _ForwardIterator __t, 4548 _UniformRandomNumberGenerator& __urng) 4549 { this->__generate(__f, __t, __urng, _M_param); } 4550 4551 template<typename _ForwardIterator, 4552 typename _UniformRandomNumberGenerator> 4553 void 4554 __generate(_ForwardIterator __f, _ForwardIterator __t, 4555 _UniformRandomNumberGenerator& __urng, 4556 const param_type& __p) 4557 { this->__generate_impl(__f, __t, __urng, __p); } 4558 4559 template<typename _UniformRandomNumberGenerator> 4560 void 4561 __generate(result_type* __f, result_type* __t, 4562 _UniformRandomNumberGenerator& __urng, 4563 const param_type& __p) 4564 { this->__generate_impl(__f, __t, __urng, __p); } 4565 4566 /** 4567 * @brief Return true if two Poisson distributions have the same 4568 * parameters and the sequences that would be generated 4569 * are equal. 4570 */ 4571 friend bool 4572 operator==(const poisson_distribution& __d1, 4573 const poisson_distribution& __d2) 4574 #ifdef _GLIBCXX_USE_C99_MATH_TR1 4575 { return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; } 4576 #else 4577 { return __d1._M_param == __d2._M_param; } 4578 #endif 4579 4580 /** 4581 * @brief Inserts a %poisson_distribution random number distribution 4582 * @p __x into the output stream @p __os. 4583 * 4584 * @param __os An output stream. 4585 * @param __x A %poisson_distribution random number distribution. 4586 * 4587 * @returns The output stream with the state of @p __x inserted or in 4588 * an error state. 4589 */ 4590 template<typename _IntType1, typename _CharT, typename _Traits> 4591 friend std::basic_ostream<_CharT, _Traits>& 4592 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 4593 const std::poisson_distribution<_IntType1>& __x); 4594 4595 /** 4596 * @brief Extracts a %poisson_distribution random number distribution 4597 * @p __x from the input stream @p __is. 4598 * 4599 * @param __is An input stream. 4600 * @param __x A %poisson_distribution random number generator engine. 4601 * 4602 * @returns The input stream with @p __x extracted or in an error 4603 * state. 4604 */ 4605 template<typename _IntType1, typename _CharT, typename _Traits> 4606 friend std::basic_istream<_CharT, _Traits>& 4607 operator>>(std::basic_istream<_CharT, _Traits>& __is, 4608 std::poisson_distribution<_IntType1>& __x); 4609 4610 private: 4611 template<typename _ForwardIterator, 4612 typename _UniformRandomNumberGenerator> 4613 void 4614 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 4615 _UniformRandomNumberGenerator& __urng, 4616 const param_type& __p); 4617 4618 param_type _M_param; 4619 4620 // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 4621 std::normal_distribution<double> _M_nd; 4622 }; 4623 4624 /** 4625 * @brief Return true if two Poisson distributions are different. 4626 */ 4627 template<typename _IntType> 4628 inline bool 4629 operator!=(const std::poisson_distribution<_IntType>& __d1, 4630 const std::poisson_distribution<_IntType>& __d2) 4631 { return !(__d1 == __d2); } 4632 4633 4634 /** 4635 * @brief An exponential continuous distribution for random numbers. 4636 * 4637 * The formula for the exponential probability density function is 4638 * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$. 4639 * 4640 * <table border=1 cellpadding=10 cellspacing=0> 4641 * <caption align=top>Distribution Statistics</caption> 4642 * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 4643 * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr> 4644 * <tr><td>Mode</td><td>@f$zero@f$</td></tr> 4645 * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr> 4646 * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr> 4647 * </table> 4648 */ 4649 template<typename _RealType = double> 4650 class exponential_distribution 4651 { 4652 static_assert(std::is_floating_point<_RealType>::value, 4653 "result_type must be a floating point type"); 4654 4655 public: 4656 /** The type of the range of the distribution. */ 4657 typedef _RealType result_type; 4658 4659 /** Parameter type. */ 4660 struct param_type 4661 { 4662 typedef exponential_distribution<_RealType> distribution_type; 4663 4664 param_type() : param_type(1.0) { } 4665 4666 explicit 4667 param_type(_RealType __lambda) 4668 : _M_lambda(__lambda) 4669 { 4670 __glibcxx_assert(_M_lambda > _RealType(0)); 4671 } 4672 4673 _RealType 4674 lambda() const 4675 { return _M_lambda; } 4676 4677 friend bool 4678 operator==(const param_type& __p1, const param_type& __p2) 4679 { return __p1._M_lambda == __p2._M_lambda; } 4680 4681 friend bool 4682 operator!=(const param_type& __p1, const param_type& __p2) 4683 { return !(__p1 == __p2); } 4684 4685 private: 4686 _RealType _M_lambda; 4687 }; 4688 4689 public: 4690 /** 4691 * @brief Constructs an exponential distribution with inverse scale 4692 * parameter 1.0 4693 */ 4694 exponential_distribution() : exponential_distribution(1.0) { } 4695 4696 /** 4697 * @brief Constructs an exponential distribution with inverse scale 4698 * parameter @f$\lambda@f$. 4699 */ 4700 explicit 4701 exponential_distribution(_RealType __lambda) 4702 : _M_param(__lambda) 4703 { } 4704 4705 explicit 4706 exponential_distribution(const param_type& __p) 4707 : _M_param(__p) 4708 { } 4709 4710 /** 4711 * @brief Resets the distribution state. 4712 * 4713 * Has no effect on exponential distributions. 4714 */ 4715 void 4716 reset() { } 4717 4718 /** 4719 * @brief Returns the inverse scale parameter of the distribution. 4720 */ 4721 _RealType 4722 lambda() const 4723 { return _M_param.lambda(); } 4724 4725 /** 4726 * @brief Returns the parameter set of the distribution. 4727 */ 4728 param_type 4729 param() const 4730 { return _M_param; } 4731 4732 /** 4733 * @brief Sets the parameter set of the distribution. 4734 * @param __param The new parameter set of the distribution. 4735 */ 4736 void 4737 param(const param_type& __param) 4738 { _M_param = __param; } 4739 4740 /** 4741 * @brief Returns the greatest lower bound value of the distribution. 4742 */ 4743 result_type 4744 min() const 4745 { return result_type(0); } 4746 4747 /** 4748 * @brief Returns the least upper bound value of the distribution. 4749 */ 4750 result_type 4751 max() const 4752 { return std::numeric_limits<result_type>::max(); } 4753 4754 /** 4755 * @brief Generating functions. 4756 */ 4757 template<typename _UniformRandomNumberGenerator> 4758 result_type 4759 operator()(_UniformRandomNumberGenerator& __urng) 4760 { return this->operator()(__urng, _M_param); } 4761 4762 template<typename _UniformRandomNumberGenerator> 4763 result_type 4764 operator()(_UniformRandomNumberGenerator& __urng, 4765 const param_type& __p) 4766 { 4767 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 4768 __aurng(__urng); 4769 return -std::log(result_type(1) - __aurng()) / __p.lambda(); 4770 } 4771 4772 template<typename _ForwardIterator, 4773 typename _UniformRandomNumberGenerator> 4774 void 4775 __generate(_ForwardIterator __f, _ForwardIterator __t, 4776 _UniformRandomNumberGenerator& __urng) 4777 { this->__generate(__f, __t, __urng, _M_param); } 4778 4779 template<typename _ForwardIterator, 4780 typename _UniformRandomNumberGenerator> 4781 void 4782 __generate(_ForwardIterator __f, _ForwardIterator __t, 4783 _UniformRandomNumberGenerator& __urng, 4784 const param_type& __p) 4785 { this->__generate_impl(__f, __t, __urng, __p); } 4786 4787 template<typename _UniformRandomNumberGenerator> 4788 void 4789 __generate(result_type* __f, result_type* __t, 4790 _UniformRandomNumberGenerator& __urng, 4791 const param_type& __p) 4792 { this->__generate_impl(__f, __t, __urng, __p); } 4793 4794 /** 4795 * @brief Return true if two exponential distributions have the same 4796 * parameters. 4797 */ 4798 friend bool 4799 operator==(const exponential_distribution& __d1, 4800 const exponential_distribution& __d2) 4801 { return __d1._M_param == __d2._M_param; } 4802 4803 private: 4804 template<typename _ForwardIterator, 4805 typename _UniformRandomNumberGenerator> 4806 void 4807 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 4808 _UniformRandomNumberGenerator& __urng, 4809 const param_type& __p); 4810 4811 param_type _M_param; 4812 }; 4813 4814 /** 4815 * @brief Return true if two exponential distributions have different 4816 * parameters. 4817 */ 4818 template<typename _RealType> 4819 inline bool 4820 operator!=(const std::exponential_distribution<_RealType>& __d1, 4821 const std::exponential_distribution<_RealType>& __d2) 4822 { return !(__d1 == __d2); } 4823 4824 /** 4825 * @brief Inserts a %exponential_distribution random number distribution 4826 * @p __x into the output stream @p __os. 4827 * 4828 * @param __os An output stream. 4829 * @param __x A %exponential_distribution random number distribution. 4830 * 4831 * @returns The output stream with the state of @p __x inserted or in 4832 * an error state. 4833 */ 4834 template<typename _RealType, typename _CharT, typename _Traits> 4835 std::basic_ostream<_CharT, _Traits>& 4836 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 4837 const std::exponential_distribution<_RealType>& __x); 4838 4839 /** 4840 * @brief Extracts a %exponential_distribution random number distribution 4841 * @p __x from the input stream @p __is. 4842 * 4843 * @param __is An input stream. 4844 * @param __x A %exponential_distribution random number 4845 * generator engine. 4846 * 4847 * @returns The input stream with @p __x extracted or in an error state. 4848 */ 4849 template<typename _RealType, typename _CharT, typename _Traits> 4850 std::basic_istream<_CharT, _Traits>& 4851 operator>>(std::basic_istream<_CharT, _Traits>& __is, 4852 std::exponential_distribution<_RealType>& __x); 4853 4854 4855 /** 4856 * @brief A weibull_distribution random number distribution. 4857 * 4858 * The formula for the normal probability density function is: 4859 * @f[ 4860 * p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1} 4861 * \exp{(-(\frac{x}{\beta})^\alpha)} 4862 * @f] 4863 */ 4864 template<typename _RealType = double> 4865 class weibull_distribution 4866 { 4867 static_assert(std::is_floating_point<_RealType>::value, 4868 "result_type must be a floating point type"); 4869 4870 public: 4871 /** The type of the range of the distribution. */ 4872 typedef _RealType result_type; 4873 4874 /** Parameter type. */ 4875 struct param_type 4876 { 4877 typedef weibull_distribution<_RealType> distribution_type; 4878 4879 param_type() : param_type(1.0) { } 4880 4881 explicit 4882 param_type(_RealType __a, _RealType __b = _RealType(1.0)) 4883 : _M_a(__a), _M_b(__b) 4884 { } 4885 4886 _RealType 4887 a() const 4888 { return _M_a; } 4889 4890 _RealType 4891 b() const 4892 { return _M_b; } 4893 4894 friend bool 4895 operator==(const param_type& __p1, const param_type& __p2) 4896 { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 4897 4898 friend bool 4899 operator!=(const param_type& __p1, const param_type& __p2) 4900 { return !(__p1 == __p2); } 4901 4902 private: 4903 _RealType _M_a; 4904 _RealType _M_b; 4905 }; 4906 4907 weibull_distribution() : weibull_distribution(1.0) { } 4908 4909 explicit 4910 weibull_distribution(_RealType __a, _RealType __b = _RealType(1)) 4911 : _M_param(__a, __b) 4912 { } 4913 4914 explicit 4915 weibull_distribution(const param_type& __p) 4916 : _M_param(__p) 4917 { } 4918 4919 /** 4920 * @brief Resets the distribution state. 4921 */ 4922 void 4923 reset() 4924 { } 4925 4926 /** 4927 * @brief Return the @f$a@f$ parameter of the distribution. 4928 */ 4929 _RealType 4930 a() const 4931 { return _M_param.a(); } 4932 4933 /** 4934 * @brief Return the @f$b@f$ parameter of the distribution. 4935 */ 4936 _RealType 4937 b() const 4938 { return _M_param.b(); } 4939 4940 /** 4941 * @brief Returns the parameter set of the distribution. 4942 */ 4943 param_type 4944 param() const 4945 { return _M_param; } 4946 4947 /** 4948 * @brief Sets the parameter set of the distribution. 4949 * @param __param The new parameter set of the distribution. 4950 */ 4951 void 4952 param(const param_type& __param) 4953 { _M_param = __param; } 4954 4955 /** 4956 * @brief Returns the greatest lower bound value of the distribution. 4957 */ 4958 result_type 4959 min() const 4960 { return result_type(0); } 4961 4962 /** 4963 * @brief Returns the least upper bound value of the distribution. 4964 */ 4965 result_type 4966 max() const 4967 { return std::numeric_limits<result_type>::max(); } 4968 4969 /** 4970 * @brief Generating functions. 4971 */ 4972 template<typename _UniformRandomNumberGenerator> 4973 result_type 4974 operator()(_UniformRandomNumberGenerator& __urng) 4975 { return this->operator()(__urng, _M_param); } 4976 4977 template<typename _UniformRandomNumberGenerator> 4978 result_type 4979 operator()(_UniformRandomNumberGenerator& __urng, 4980 const param_type& __p); 4981 4982 template<typename _ForwardIterator, 4983 typename _UniformRandomNumberGenerator> 4984 void 4985 __generate(_ForwardIterator __f, _ForwardIterator __t, 4986 _UniformRandomNumberGenerator& __urng) 4987 { this->__generate(__f, __t, __urng, _M_param); } 4988 4989 template<typename _ForwardIterator, 4990 typename _UniformRandomNumberGenerator> 4991 void 4992 __generate(_ForwardIterator __f, _ForwardIterator __t, 4993 _UniformRandomNumberGenerator& __urng, 4994 const param_type& __p) 4995 { this->__generate_impl(__f, __t, __urng, __p); } 4996 4997 template<typename _UniformRandomNumberGenerator> 4998 void 4999 __generate(result_type* __f, result_type* __t, 5000 _UniformRandomNumberGenerator& __urng, 5001 const param_type& __p) 5002 { this->__generate_impl(__f, __t, __urng, __p); } 5003 5004 /** 5005 * @brief Return true if two Weibull distributions have the same 5006 * parameters. 5007 */ 5008 friend bool 5009 operator==(const weibull_distribution& __d1, 5010 const weibull_distribution& __d2) 5011 { return __d1._M_param == __d2._M_param; } 5012 5013 private: 5014 template<typename _ForwardIterator, 5015 typename _UniformRandomNumberGenerator> 5016 void 5017 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 5018 _UniformRandomNumberGenerator& __urng, 5019 const param_type& __p); 5020 5021 param_type _M_param; 5022 }; 5023 5024 /** 5025 * @brief Return true if two Weibull distributions have different 5026 * parameters. 5027 */ 5028 template<typename _RealType> 5029 inline bool 5030 operator!=(const std::weibull_distribution<_RealType>& __d1, 5031 const std::weibull_distribution<_RealType>& __d2) 5032 { return !(__d1 == __d2); } 5033 5034 /** 5035 * @brief Inserts a %weibull_distribution random number distribution 5036 * @p __x into the output stream @p __os. 5037 * 5038 * @param __os An output stream. 5039 * @param __x A %weibull_distribution random number distribution. 5040 * 5041 * @returns The output stream with the state of @p __x inserted or in 5042 * an error state. 5043 */ 5044 template<typename _RealType, typename _CharT, typename _Traits> 5045 std::basic_ostream<_CharT, _Traits>& 5046 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 5047 const std::weibull_distribution<_RealType>& __x); 5048 5049 /** 5050 * @brief Extracts a %weibull_distribution random number distribution 5051 * @p __x from the input stream @p __is. 5052 * 5053 * @param __is An input stream. 5054 * @param __x A %weibull_distribution random number 5055 * generator engine. 5056 * 5057 * @returns The input stream with @p __x extracted or in an error state. 5058 */ 5059 template<typename _RealType, typename _CharT, typename _Traits> 5060 std::basic_istream<_CharT, _Traits>& 5061 operator>>(std::basic_istream<_CharT, _Traits>& __is, 5062 std::weibull_distribution<_RealType>& __x); 5063 5064 5065 /** 5066 * @brief A extreme_value_distribution random number distribution. 5067 * 5068 * The formula for the normal probability mass function is 5069 * @f[ 5070 * p(x|a,b) = \frac{1}{b} 5071 * \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b})) 5072 * @f] 5073 */ 5074 template<typename _RealType = double> 5075 class extreme_value_distribution 5076 { 5077 static_assert(std::is_floating_point<_RealType>::value, 5078 "result_type must be a floating point type"); 5079 5080 public: 5081 /** The type of the range of the distribution. */ 5082 typedef _RealType result_type; 5083 5084 /** Parameter type. */ 5085 struct param_type 5086 { 5087 typedef extreme_value_distribution<_RealType> distribution_type; 5088 5089 param_type() : param_type(0.0) { } 5090 5091 explicit 5092 param_type(_RealType __a, _RealType __b = _RealType(1.0)) 5093 : _M_a(__a), _M_b(__b) 5094 { } 5095 5096 _RealType 5097 a() const 5098 { return _M_a; } 5099 5100 _RealType 5101 b() const 5102 { return _M_b; } 5103 5104 friend bool 5105 operator==(const param_type& __p1, const param_type& __p2) 5106 { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; } 5107 5108 friend bool 5109 operator!=(const param_type& __p1, const param_type& __p2) 5110 { return !(__p1 == __p2); } 5111 5112 private: 5113 _RealType _M_a; 5114 _RealType _M_b; 5115 }; 5116 5117 extreme_value_distribution() : extreme_value_distribution(0.0) { } 5118 5119 explicit 5120 extreme_value_distribution(_RealType __a, _RealType __b = _RealType(1)) 5121 : _M_param(__a, __b) 5122 { } 5123 5124 explicit 5125 extreme_value_distribution(const param_type& __p) 5126 : _M_param(__p) 5127 { } 5128 5129 /** 5130 * @brief Resets the distribution state. 5131 */ 5132 void 5133 reset() 5134 { } 5135 5136 /** 5137 * @brief Return the @f$a@f$ parameter of the distribution. 5138 */ 5139 _RealType 5140 a() const 5141 { return _M_param.a(); } 5142 5143 /** 5144 * @brief Return the @f$b@f$ parameter of the distribution. 5145 */ 5146 _RealType 5147 b() const 5148 { return _M_param.b(); } 5149 5150 /** 5151 * @brief Returns the parameter set of the distribution. 5152 */ 5153 param_type 5154 param() const 5155 { return _M_param; } 5156 5157 /** 5158 * @brief Sets the parameter set of the distribution. 5159 * @param __param The new parameter set of the distribution. 5160 */ 5161 void 5162 param(const param_type& __param) 5163 { _M_param = __param; } 5164 5165 /** 5166 * @brief Returns the greatest lower bound value of the distribution. 5167 */ 5168 result_type 5169 min() const 5170 { return std::numeric_limits<result_type>::lowest(); } 5171 5172 /** 5173 * @brief Returns the least upper bound value of the distribution. 5174 */ 5175 result_type 5176 max() const 5177 { return std::numeric_limits<result_type>::max(); } 5178 5179 /** 5180 * @brief Generating functions. 5181 */ 5182 template<typename _UniformRandomNumberGenerator> 5183 result_type 5184 operator()(_UniformRandomNumberGenerator& __urng) 5185 { return this->operator()(__urng, _M_param); } 5186 5187 template<typename _UniformRandomNumberGenerator> 5188 result_type 5189 operator()(_UniformRandomNumberGenerator& __urng, 5190 const param_type& __p); 5191 5192 template<typename _ForwardIterator, 5193 typename _UniformRandomNumberGenerator> 5194 void 5195 __generate(_ForwardIterator __f, _ForwardIterator __t, 5196 _UniformRandomNumberGenerator& __urng) 5197 { this->__generate(__f, __t, __urng, _M_param); } 5198 5199 template<typename _ForwardIterator, 5200 typename _UniformRandomNumberGenerator> 5201 void 5202 __generate(_ForwardIterator __f, _ForwardIterator __t, 5203 _UniformRandomNumberGenerator& __urng, 5204 const param_type& __p) 5205 { this->__generate_impl(__f, __t, __urng, __p); } 5206 5207 template<typename _UniformRandomNumberGenerator> 5208 void 5209 __generate(result_type* __f, result_type* __t, 5210 _UniformRandomNumberGenerator& __urng, 5211 const param_type& __p) 5212 { this->__generate_impl(__f, __t, __urng, __p); } 5213 5214 /** 5215 * @brief Return true if two extreme value distributions have the same 5216 * parameters. 5217 */ 5218 friend bool 5219 operator==(const extreme_value_distribution& __d1, 5220 const extreme_value_distribution& __d2) 5221 { return __d1._M_param == __d2._M_param; } 5222 5223 private: 5224 template<typename _ForwardIterator, 5225 typename _UniformRandomNumberGenerator> 5226 void 5227 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 5228 _UniformRandomNumberGenerator& __urng, 5229 const param_type& __p); 5230 5231 param_type _M_param; 5232 }; 5233 5234 /** 5235 * @brief Return true if two extreme value distributions have different 5236 * parameters. 5237 */ 5238 template<typename _RealType> 5239 inline bool 5240 operator!=(const std::extreme_value_distribution<_RealType>& __d1, 5241 const std::extreme_value_distribution<_RealType>& __d2) 5242 { return !(__d1 == __d2); } 5243 5244 /** 5245 * @brief Inserts a %extreme_value_distribution random number distribution 5246 * @p __x into the output stream @p __os. 5247 * 5248 * @param __os An output stream. 5249 * @param __x A %extreme_value_distribution random number distribution. 5250 * 5251 * @returns The output stream with the state of @p __x inserted or in 5252 * an error state. 5253 */ 5254 template<typename _RealType, typename _CharT, typename _Traits> 5255 std::basic_ostream<_CharT, _Traits>& 5256 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 5257 const std::extreme_value_distribution<_RealType>& __x); 5258 5259 /** 5260 * @brief Extracts a %extreme_value_distribution random number 5261 * distribution @p __x from the input stream @p __is. 5262 * 5263 * @param __is An input stream. 5264 * @param __x A %extreme_value_distribution random number 5265 * generator engine. 5266 * 5267 * @returns The input stream with @p __x extracted or in an error state. 5268 */ 5269 template<typename _RealType, typename _CharT, typename _Traits> 5270 std::basic_istream<_CharT, _Traits>& 5271 operator>>(std::basic_istream<_CharT, _Traits>& __is, 5272 std::extreme_value_distribution<_RealType>& __x); 5273 5274 5275 /** 5276 * @brief A discrete_distribution random number distribution. 5277 * 5278 * The formula for the discrete probability mass function is 5279 * 5280 */ 5281 template<typename _IntType = int> 5282 class discrete_distribution 5283 { 5284 static_assert(std::is_integral<_IntType>::value, 5285 "result_type must be an integral type"); 5286 5287 public: 5288 /** The type of the range of the distribution. */ 5289 typedef _IntType result_type; 5290 5291 /** Parameter type. */ 5292 struct param_type 5293 { 5294 typedef discrete_distribution<_IntType> distribution_type; 5295 friend class discrete_distribution<_IntType>; 5296 5297 param_type() 5298 : _M_prob(), _M_cp() 5299 { } 5300 5301 template<typename _InputIterator> 5302 param_type(_InputIterator __wbegin, 5303 _InputIterator __wend) 5304 : _M_prob(__wbegin, __wend), _M_cp() 5305 { _M_initialize(); } 5306 5307 param_type(initializer_list<double> __wil) 5308 : _M_prob(__wil.begin(), __wil.end()), _M_cp() 5309 { _M_initialize(); } 5310 5311 template<typename _Func> 5312 param_type(size_t __nw, double __xmin, double __xmax, 5313 _Func __fw); 5314 5315 // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 5316 param_type(const param_type&) = default; 5317 param_type& operator=(const param_type&) = default; 5318 5319 std::vector<double> 5320 probabilities() const 5321 { return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; } 5322 5323 friend bool 5324 operator==(const param_type& __p1, const param_type& __p2) 5325 { return __p1._M_prob == __p2._M_prob; } 5326 5327 friend bool 5328 operator!=(const param_type& __p1, const param_type& __p2) 5329 { return !(__p1 == __p2); } 5330 5331 private: 5332 void 5333 _M_initialize(); 5334 5335 std::vector<double> _M_prob; 5336 std::vector<double> _M_cp; 5337 }; 5338 5339 discrete_distribution() 5340 : _M_param() 5341 { } 5342 5343 template<typename _InputIterator> 5344 discrete_distribution(_InputIterator __wbegin, 5345 _InputIterator __wend) 5346 : _M_param(__wbegin, __wend) 5347 { } 5348 5349 discrete_distribution(initializer_list<double> __wl) 5350 : _M_param(__wl) 5351 { } 5352 5353 template<typename _Func> 5354 discrete_distribution(size_t __nw, double __xmin, double __xmax, 5355 _Func __fw) 5356 : _M_param(__nw, __xmin, __xmax, __fw) 5357 { } 5358 5359 explicit 5360 discrete_distribution(const param_type& __p) 5361 : _M_param(__p) 5362 { } 5363 5364 /** 5365 * @brief Resets the distribution state. 5366 */ 5367 void 5368 reset() 5369 { } 5370 5371 /** 5372 * @brief Returns the probabilities of the distribution. 5373 */ 5374 std::vector<double> 5375 probabilities() const 5376 { 5377 return _M_param._M_prob.empty() 5378 ? std::vector<double>(1, 1.0) : _M_param._M_prob; 5379 } 5380 5381 /** 5382 * @brief Returns the parameter set of the distribution. 5383 */ 5384 param_type 5385 param() const 5386 { return _M_param; } 5387 5388 /** 5389 * @brief Sets the parameter set of the distribution. 5390 * @param __param The new parameter set of the distribution. 5391 */ 5392 void 5393 param(const param_type& __param) 5394 { _M_param = __param; } 5395 5396 /** 5397 * @brief Returns the greatest lower bound value of the distribution. 5398 */ 5399 result_type 5400 min() const 5401 { return result_type(0); } 5402 5403 /** 5404 * @brief Returns the least upper bound value of the distribution. 5405 */ 5406 result_type 5407 max() const 5408 { 5409 return _M_param._M_prob.empty() 5410 ? result_type(0) : result_type(_M_param._M_prob.size() - 1); 5411 } 5412 5413 /** 5414 * @brief Generating functions. 5415 */ 5416 template<typename _UniformRandomNumberGenerator> 5417 result_type 5418 operator()(_UniformRandomNumberGenerator& __urng) 5419 { return this->operator()(__urng, _M_param); } 5420 5421 template<typename _UniformRandomNumberGenerator> 5422 result_type 5423 operator()(_UniformRandomNumberGenerator& __urng, 5424 const param_type& __p); 5425 5426 template<typename _ForwardIterator, 5427 typename _UniformRandomNumberGenerator> 5428 void 5429 __generate(_ForwardIterator __f, _ForwardIterator __t, 5430 _UniformRandomNumberGenerator& __urng) 5431 { this->__generate(__f, __t, __urng, _M_param); } 5432 5433 template<typename _ForwardIterator, 5434 typename _UniformRandomNumberGenerator> 5435 void 5436 __generate(_ForwardIterator __f, _ForwardIterator __t, 5437 _UniformRandomNumberGenerator& __urng, 5438 const param_type& __p) 5439 { this->__generate_impl(__f, __t, __urng, __p); } 5440 5441 template<typename _UniformRandomNumberGenerator> 5442 void 5443 __generate(result_type* __f, result_type* __t, 5444 _UniformRandomNumberGenerator& __urng, 5445 const param_type& __p) 5446 { this->__generate_impl(__f, __t, __urng, __p); } 5447 5448 /** 5449 * @brief Return true if two discrete distributions have the same 5450 * parameters. 5451 */ 5452 friend bool 5453 operator==(const discrete_distribution& __d1, 5454 const discrete_distribution& __d2) 5455 { return __d1._M_param == __d2._M_param; } 5456 5457 /** 5458 * @brief Inserts a %discrete_distribution random number distribution 5459 * @p __x into the output stream @p __os. 5460 * 5461 * @param __os An output stream. 5462 * @param __x A %discrete_distribution random number distribution. 5463 * 5464 * @returns The output stream with the state of @p __x inserted or in 5465 * an error state. 5466 */ 5467 template<typename _IntType1, typename _CharT, typename _Traits> 5468 friend std::basic_ostream<_CharT, _Traits>& 5469 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 5470 const std::discrete_distribution<_IntType1>& __x); 5471 5472 /** 5473 * @brief Extracts a %discrete_distribution random number distribution 5474 * @p __x from the input stream @p __is. 5475 * 5476 * @param __is An input stream. 5477 * @param __x A %discrete_distribution random number 5478 * generator engine. 5479 * 5480 * @returns The input stream with @p __x extracted or in an error 5481 * state. 5482 */ 5483 template<typename _IntType1, typename _CharT, typename _Traits> 5484 friend std::basic_istream<_CharT, _Traits>& 5485 operator>>(std::basic_istream<_CharT, _Traits>& __is, 5486 std::discrete_distribution<_IntType1>& __x); 5487 5488 private: 5489 template<typename _ForwardIterator, 5490 typename _UniformRandomNumberGenerator> 5491 void 5492 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 5493 _UniformRandomNumberGenerator& __urng, 5494 const param_type& __p); 5495 5496 param_type _M_param; 5497 }; 5498 5499 /** 5500 * @brief Return true if two discrete distributions have different 5501 * parameters. 5502 */ 5503 template<typename _IntType> 5504 inline bool 5505 operator!=(const std::discrete_distribution<_IntType>& __d1, 5506 const std::discrete_distribution<_IntType>& __d2) 5507 { return !(__d1 == __d2); } 5508 5509 5510 /** 5511 * @brief A piecewise_constant_distribution random number distribution. 5512 * 5513 * The formula for the piecewise constant probability mass function is 5514 * 5515 */ 5516 template<typename _RealType = double> 5517 class piecewise_constant_distribution 5518 { 5519 static_assert(std::is_floating_point<_RealType>::value, 5520 "result_type must be a floating point type"); 5521 5522 public: 5523 /** The type of the range of the distribution. */ 5524 typedef _RealType result_type; 5525 5526 /** Parameter type. */ 5527 struct param_type 5528 { 5529 typedef piecewise_constant_distribution<_RealType> distribution_type; 5530 friend class piecewise_constant_distribution<_RealType>; 5531 5532 param_type() 5533 : _M_int(), _M_den(), _M_cp() 5534 { } 5535 5536 template<typename _InputIteratorB, typename _InputIteratorW> 5537 param_type(_InputIteratorB __bfirst, 5538 _InputIteratorB __bend, 5539 _InputIteratorW __wbegin); 5540 5541 template<typename _Func> 5542 param_type(initializer_list<_RealType> __bi, _Func __fw); 5543 5544 template<typename _Func> 5545 param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 5546 _Func __fw); 5547 5548 // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 5549 param_type(const param_type&) = default; 5550 param_type& operator=(const param_type&) = default; 5551 5552 std::vector<_RealType> 5553 intervals() const 5554 { 5555 if (_M_int.empty()) 5556 { 5557 std::vector<_RealType> __tmp(2); 5558 __tmp[1] = _RealType(1); 5559 return __tmp; 5560 } 5561 else 5562 return _M_int; 5563 } 5564 5565 std::vector<double> 5566 densities() const 5567 { return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; } 5568 5569 friend bool 5570 operator==(const param_type& __p1, const param_type& __p2) 5571 { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; } 5572 5573 friend bool 5574 operator!=(const param_type& __p1, const param_type& __p2) 5575 { return !(__p1 == __p2); } 5576 5577 private: 5578 void 5579 _M_initialize(); 5580 5581 std::vector<_RealType> _M_int; 5582 std::vector<double> _M_den; 5583 std::vector<double> _M_cp; 5584 }; 5585 5586 piecewise_constant_distribution() 5587 : _M_param() 5588 { } 5589 5590 template<typename _InputIteratorB, typename _InputIteratorW> 5591 piecewise_constant_distribution(_InputIteratorB __bfirst, 5592 _InputIteratorB __bend, 5593 _InputIteratorW __wbegin) 5594 : _M_param(__bfirst, __bend, __wbegin) 5595 { } 5596 5597 template<typename _Func> 5598 piecewise_constant_distribution(initializer_list<_RealType> __bl, 5599 _Func __fw) 5600 : _M_param(__bl, __fw) 5601 { } 5602 5603 template<typename _Func> 5604 piecewise_constant_distribution(size_t __nw, 5605 _RealType __xmin, _RealType __xmax, 5606 _Func __fw) 5607 : _M_param(__nw, __xmin, __xmax, __fw) 5608 { } 5609 5610 explicit 5611 piecewise_constant_distribution(const param_type& __p) 5612 : _M_param(__p) 5613 { } 5614 5615 /** 5616 * @brief Resets the distribution state. 5617 */ 5618 void 5619 reset() 5620 { } 5621 5622 /** 5623 * @brief Returns a vector of the intervals. 5624 */ 5625 std::vector<_RealType> 5626 intervals() const 5627 { 5628 if (_M_param._M_int.empty()) 5629 { 5630 std::vector<_RealType> __tmp(2); 5631 __tmp[1] = _RealType(1); 5632 return __tmp; 5633 } 5634 else 5635 return _M_param._M_int; 5636 } 5637 5638 /** 5639 * @brief Returns a vector of the probability densities. 5640 */ 5641 std::vector<double> 5642 densities() const 5643 { 5644 return _M_param._M_den.empty() 5645 ? std::vector<double>(1, 1.0) : _M_param._M_den; 5646 } 5647 5648 /** 5649 * @brief Returns the parameter set of the distribution. 5650 */ 5651 param_type 5652 param() const 5653 { return _M_param; } 5654 5655 /** 5656 * @brief Sets the parameter set of the distribution. 5657 * @param __param The new parameter set of the distribution. 5658 */ 5659 void 5660 param(const param_type& __param) 5661 { _M_param = __param; } 5662 5663 /** 5664 * @brief Returns the greatest lower bound value of the distribution. 5665 */ 5666 result_type 5667 min() const 5668 { 5669 return _M_param._M_int.empty() 5670 ? result_type(0) : _M_param._M_int.front(); 5671 } 5672 5673 /** 5674 * @brief Returns the least upper bound value of the distribution. 5675 */ 5676 result_type 5677 max() const 5678 { 5679 return _M_param._M_int.empty() 5680 ? result_type(1) : _M_param._M_int.back(); 5681 } 5682 5683 /** 5684 * @brief Generating functions. 5685 */ 5686 template<typename _UniformRandomNumberGenerator> 5687 result_type 5688 operator()(_UniformRandomNumberGenerator& __urng) 5689 { return this->operator()(__urng, _M_param); } 5690 5691 template<typename _UniformRandomNumberGenerator> 5692 result_type 5693 operator()(_UniformRandomNumberGenerator& __urng, 5694 const param_type& __p); 5695 5696 template<typename _ForwardIterator, 5697 typename _UniformRandomNumberGenerator> 5698 void 5699 __generate(_ForwardIterator __f, _ForwardIterator __t, 5700 _UniformRandomNumberGenerator& __urng) 5701 { this->__generate(__f, __t, __urng, _M_param); } 5702 5703 template<typename _ForwardIterator, 5704 typename _UniformRandomNumberGenerator> 5705 void 5706 __generate(_ForwardIterator __f, _ForwardIterator __t, 5707 _UniformRandomNumberGenerator& __urng, 5708 const param_type& __p) 5709 { this->__generate_impl(__f, __t, __urng, __p); } 5710 5711 template<typename _UniformRandomNumberGenerator> 5712 void 5713 __generate(result_type* __f, result_type* __t, 5714 _UniformRandomNumberGenerator& __urng, 5715 const param_type& __p) 5716 { this->__generate_impl(__f, __t, __urng, __p); } 5717 5718 /** 5719 * @brief Return true if two piecewise constant distributions have the 5720 * same parameters. 5721 */ 5722 friend bool 5723 operator==(const piecewise_constant_distribution& __d1, 5724 const piecewise_constant_distribution& __d2) 5725 { return __d1._M_param == __d2._M_param; } 5726 5727 /** 5728 * @brief Inserts a %piecewise_constant_distribution random 5729 * number distribution @p __x into the output stream @p __os. 5730 * 5731 * @param __os An output stream. 5732 * @param __x A %piecewise_constant_distribution random number 5733 * distribution. 5734 * 5735 * @returns The output stream with the state of @p __x inserted or in 5736 * an error state. 5737 */ 5738 template<typename _RealType1, typename _CharT, typename _Traits> 5739 friend std::basic_ostream<_CharT, _Traits>& 5740 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 5741 const std::piecewise_constant_distribution<_RealType1>& __x); 5742 5743 /** 5744 * @brief Extracts a %piecewise_constant_distribution random 5745 * number distribution @p __x from the input stream @p __is. 5746 * 5747 * @param __is An input stream. 5748 * @param __x A %piecewise_constant_distribution random number 5749 * generator engine. 5750 * 5751 * @returns The input stream with @p __x extracted or in an error 5752 * state. 5753 */ 5754 template<typename _RealType1, typename _CharT, typename _Traits> 5755 friend std::basic_istream<_CharT, _Traits>& 5756 operator>>(std::basic_istream<_CharT, _Traits>& __is, 5757 std::piecewise_constant_distribution<_RealType1>& __x); 5758 5759 private: 5760 template<typename _ForwardIterator, 5761 typename _UniformRandomNumberGenerator> 5762 void 5763 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 5764 _UniformRandomNumberGenerator& __urng, 5765 const param_type& __p); 5766 5767 param_type _M_param; 5768 }; 5769 5770 /** 5771 * @brief Return true if two piecewise constant distributions have 5772 * different parameters. 5773 */ 5774 template<typename _RealType> 5775 inline bool 5776 operator!=(const std::piecewise_constant_distribution<_RealType>& __d1, 5777 const std::piecewise_constant_distribution<_RealType>& __d2) 5778 { return !(__d1 == __d2); } 5779 5780 5781 /** 5782 * @brief A piecewise_linear_distribution random number distribution. 5783 * 5784 * The formula for the piecewise linear probability mass function is 5785 * 5786 */ 5787 template<typename _RealType = double> 5788 class piecewise_linear_distribution 5789 { 5790 static_assert(std::is_floating_point<_RealType>::value, 5791 "result_type must be a floating point type"); 5792 5793 public: 5794 /** The type of the range of the distribution. */ 5795 typedef _RealType result_type; 5796 5797 /** Parameter type. */ 5798 struct param_type 5799 { 5800 typedef piecewise_linear_distribution<_RealType> distribution_type; 5801 friend class piecewise_linear_distribution<_RealType>; 5802 5803 param_type() 5804 : _M_int(), _M_den(), _M_cp(), _M_m() 5805 { } 5806 5807 template<typename _InputIteratorB, typename _InputIteratorW> 5808 param_type(_InputIteratorB __bfirst, 5809 _InputIteratorB __bend, 5810 _InputIteratorW __wbegin); 5811 5812 template<typename _Func> 5813 param_type(initializer_list<_RealType> __bl, _Func __fw); 5814 5815 template<typename _Func> 5816 param_type(size_t __nw, _RealType __xmin, _RealType __xmax, 5817 _Func __fw); 5818 5819 // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ 5820 param_type(const param_type&) = default; 5821 param_type& operator=(const param_type&) = default; 5822 5823 std::vector<_RealType> 5824 intervals() const 5825 { 5826 if (_M_int.empty()) 5827 { 5828 std::vector<_RealType> __tmp(2); 5829 __tmp[1] = _RealType(1); 5830 return __tmp; 5831 } 5832 else 5833 return _M_int; 5834 } 5835 5836 std::vector<double> 5837 densities() const 5838 { return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; } 5839 5840 friend bool 5841 operator==(const param_type& __p1, const param_type& __p2) 5842 { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; } 5843 5844 friend bool 5845 operator!=(const param_type& __p1, const param_type& __p2) 5846 { return !(__p1 == __p2); } 5847 5848 private: 5849 void 5850 _M_initialize(); 5851 5852 std::vector<_RealType> _M_int; 5853 std::vector<double> _M_den; 5854 std::vector<double> _M_cp; 5855 std::vector<double> _M_m; 5856 }; 5857 5858 piecewise_linear_distribution() 5859 : _M_param() 5860 { } 5861 5862 template<typename _InputIteratorB, typename _InputIteratorW> 5863 piecewise_linear_distribution(_InputIteratorB __bfirst, 5864 _InputIteratorB __bend, 5865 _InputIteratorW __wbegin) 5866 : _M_param(__bfirst, __bend, __wbegin) 5867 { } 5868 5869 template<typename _Func> 5870 piecewise_linear_distribution(initializer_list<_RealType> __bl, 5871 _Func __fw) 5872 : _M_param(__bl, __fw) 5873 { } 5874 5875 template<typename _Func> 5876 piecewise_linear_distribution(size_t __nw, 5877 _RealType __xmin, _RealType __xmax, 5878 _Func __fw) 5879 : _M_param(__nw, __xmin, __xmax, __fw) 5880 { } 5881 5882 explicit 5883 piecewise_linear_distribution(const param_type& __p) 5884 : _M_param(__p) 5885 { } 5886 5887 /** 5888 * Resets the distribution state. 5889 */ 5890 void 5891 reset() 5892 { } 5893 5894 /** 5895 * @brief Return the intervals of the distribution. 5896 */ 5897 std::vector<_RealType> 5898 intervals() const 5899 { 5900 if (_M_param._M_int.empty()) 5901 { 5902 std::vector<_RealType> __tmp(2); 5903 __tmp[1] = _RealType(1); 5904 return __tmp; 5905 } 5906 else 5907 return _M_param._M_int; 5908 } 5909 5910 /** 5911 * @brief Return a vector of the probability densities of the 5912 * distribution. 5913 */ 5914 std::vector<double> 5915 densities() const 5916 { 5917 return _M_param._M_den.empty() 5918 ? std::vector<double>(2, 1.0) : _M_param._M_den; 5919 } 5920 5921 /** 5922 * @brief Returns the parameter set of the distribution. 5923 */ 5924 param_type 5925 param() const 5926 { return _M_param; } 5927 5928 /** 5929 * @brief Sets the parameter set of the distribution. 5930 * @param __param The new parameter set of the distribution. 5931 */ 5932 void 5933 param(const param_type& __param) 5934 { _M_param = __param; } 5935 5936 /** 5937 * @brief Returns the greatest lower bound value of the distribution. 5938 */ 5939 result_type 5940 min() const 5941 { 5942 return _M_param._M_int.empty() 5943 ? result_type(0) : _M_param._M_int.front(); 5944 } 5945 5946 /** 5947 * @brief Returns the least upper bound value of the distribution. 5948 */ 5949 result_type 5950 max() const 5951 { 5952 return _M_param._M_int.empty() 5953 ? result_type(1) : _M_param._M_int.back(); 5954 } 5955 5956 /** 5957 * @brief Generating functions. 5958 */ 5959 template<typename _UniformRandomNumberGenerator> 5960 result_type 5961 operator()(_UniformRandomNumberGenerator& __urng) 5962 { return this->operator()(__urng, _M_param); } 5963 5964 template<typename _UniformRandomNumberGenerator> 5965 result_type 5966 operator()(_UniformRandomNumberGenerator& __urng, 5967 const param_type& __p); 5968 5969 template<typename _ForwardIterator, 5970 typename _UniformRandomNumberGenerator> 5971 void 5972 __generate(_ForwardIterator __f, _ForwardIterator __t, 5973 _UniformRandomNumberGenerator& __urng) 5974 { this->__generate(__f, __t, __urng, _M_param); } 5975 5976 template<typename _ForwardIterator, 5977 typename _UniformRandomNumberGenerator> 5978 void 5979 __generate(_ForwardIterator __f, _ForwardIterator __t, 5980 _UniformRandomNumberGenerator& __urng, 5981 const param_type& __p) 5982 { this->__generate_impl(__f, __t, __urng, __p); } 5983 5984 template<typename _UniformRandomNumberGenerator> 5985 void 5986 __generate(result_type* __f, result_type* __t, 5987 _UniformRandomNumberGenerator& __urng, 5988 const param_type& __p) 5989 { this->__generate_impl(__f, __t, __urng, __p); } 5990 5991 /** 5992 * @brief Return true if two piecewise linear distributions have the 5993 * same parameters. 5994 */ 5995 friend bool 5996 operator==(const piecewise_linear_distribution& __d1, 5997 const piecewise_linear_distribution& __d2) 5998 { return __d1._M_param == __d2._M_param; } 5999 6000 /** 6001 * @brief Inserts a %piecewise_linear_distribution random number 6002 * distribution @p __x into the output stream @p __os. 6003 * 6004 * @param __os An output stream. 6005 * @param __x A %piecewise_linear_distribution random number 6006 * distribution. 6007 * 6008 * @returns The output stream with the state of @p __x inserted or in 6009 * an error state. 6010 */ 6011 template<typename _RealType1, typename _CharT, typename _Traits> 6012 friend std::basic_ostream<_CharT, _Traits>& 6013 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 6014 const std::piecewise_linear_distribution<_RealType1>& __x); 6015 6016 /** 6017 * @brief Extracts a %piecewise_linear_distribution random number 6018 * distribution @p __x from the input stream @p __is. 6019 * 6020 * @param __is An input stream. 6021 * @param __x A %piecewise_linear_distribution random number 6022 * generator engine. 6023 * 6024 * @returns The input stream with @p __x extracted or in an error 6025 * state. 6026 */ 6027 template<typename _RealType1, typename _CharT, typename _Traits> 6028 friend std::basic_istream<_CharT, _Traits>& 6029 operator>>(std::basic_istream<_CharT, _Traits>& __is, 6030 std::piecewise_linear_distribution<_RealType1>& __x); 6031 6032 private: 6033 template<typename _ForwardIterator, 6034 typename _UniformRandomNumberGenerator> 6035 void 6036 __generate_impl(_ForwardIterator __f, _ForwardIterator __t, 6037 _UniformRandomNumberGenerator& __urng, 6038 const param_type& __p); 6039 6040 param_type _M_param; 6041 }; 6042 6043 /** 6044 * @brief Return true if two piecewise linear distributions have 6045 * different parameters. 6046 */ 6047 template<typename _RealType> 6048 inline bool 6049 operator!=(const std::piecewise_linear_distribution<_RealType>& __d1, 6050 const std::piecewise_linear_distribution<_RealType>& __d2) 6051 { return !(__d1 == __d2); } 6052 6053 6054 /// @} group random_distributions_poisson 6055 6056 /// @} *group random_distributions 6057 6058 /** 6059 * @addtogroup random_utilities Random Number Utilities 6060 * @ingroup random 6061 * @{ 6062 */ 6063 6064 /** 6065 * @brief The seed_seq class generates sequences of seeds for random 6066 * number generators. 6067 */ 6068 class seed_seq 6069 { 6070 public: 6071 /** The type of the seed vales. */ 6072 typedef uint_least32_t result_type; 6073 6074 /** Default constructor. */ 6075 seed_seq() noexcept 6076 : _M_v() 6077 { } 6078 6079 template<typename _IntType, typename = _Require<is_integral<_IntType>>> 6080 seed_seq(std::initializer_list<_IntType> __il); 6081 6082 template<typename _InputIterator> 6083 seed_seq(_InputIterator __begin, _InputIterator __end); 6084 6085 // generating functions 6086 template<typename _RandomAccessIterator> 6087 void 6088 generate(_RandomAccessIterator __begin, _RandomAccessIterator __end); 6089 6090 // property functions 6091 size_t size() const noexcept 6092 { return _M_v.size(); } 6093 6094 template<typename _OutputIterator> 6095 void 6096 param(_OutputIterator __dest) const 6097 { std::copy(_M_v.begin(), _M_v.end(), __dest); } 6098 6099 // no copy functions 6100 seed_seq(const seed_seq&) = delete; 6101 seed_seq& operator=(const seed_seq&) = delete; 6102 6103 private: 6104 std::vector<result_type> _M_v; 6105 }; 6106 6107 /// @} group random_utilities 6108 6109 /// @} group random 6110 6111 _GLIBCXX_END_NAMESPACE_VERSION 6112 } // namespace std 6113 6114 #endif 6115