1 // random number generation -*- C++ -*- 2 3 // Copyright (C) 2009, 2010 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 tr1/random.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{tr1/random} 29 */ 30 31 #ifndef _GLIBCXX_TR1_RANDOM_H 32 #define _GLIBCXX_TR1_RANDOM_H 1 33 34 #pragma GCC system_header 35 36 namespace std _GLIBCXX_VISIBILITY(default) 37 { 38 namespace tr1 39 { 40 // [5.1] Random number generation 41 42 /** 43 * @addtogroup tr1_random Random Number Generation 44 * A facility for generating random numbers on selected distributions. 45 * @{ 46 */ 47 48 /* 49 * Implementation-space details. 50 */ 51 namespace __detail 52 { 53 _GLIBCXX_BEGIN_NAMESPACE_VERSION 54 55 template<typename _UIntType, int __w, 56 bool = __w < std::numeric_limits<_UIntType>::digits> 57 struct _Shift 58 { static const _UIntType __value = 0; }; 59 60 template<typename _UIntType, int __w> 61 struct _Shift<_UIntType, __w, true> 62 { static const _UIntType __value = _UIntType(1) << __w; }; 63 64 template<typename _Tp, _Tp __a, _Tp __c, _Tp __m, bool> 65 struct _Mod; 66 67 // Dispatch based on modulus value to prevent divide-by-zero compile-time 68 // errors when m == 0. 69 template<typename _Tp, _Tp __a, _Tp __c, _Tp __m> 70 inline _Tp 71 __mod(_Tp __x) 72 { return _Mod<_Tp, __a, __c, __m, __m == 0>::__calc(__x); } 73 74 typedef __gnu_cxx::__conditional_type<(sizeof(unsigned) == 4), 75 unsigned, unsigned long>::__type _UInt32Type; 76 77 /* 78 * An adaptor class for converting the output of any Generator into 79 * the input for a specific Distribution. 80 */ 81 template<typename _Engine, typename _Distribution> 82 struct _Adaptor 83 { 84 typedef typename remove_reference<_Engine>::type _BEngine; 85 typedef typename _BEngine::result_type _Engine_result_type; 86 typedef typename _Distribution::input_type result_type; 87 88 public: 89 _Adaptor(const _Engine& __g) 90 : _M_g(__g) { } 91 92 result_type 93 min() const 94 { 95 result_type __return_value; 96 if (is_integral<_Engine_result_type>::value 97 && is_integral<result_type>::value) 98 __return_value = _M_g.min(); 99 else 100 __return_value = result_type(0); 101 return __return_value; 102 } 103 104 result_type 105 max() const 106 { 107 result_type __return_value; 108 if (is_integral<_Engine_result_type>::value 109 && is_integral<result_type>::value) 110 __return_value = _M_g.max(); 111 else if (!is_integral<result_type>::value) 112 __return_value = result_type(1); 113 else 114 __return_value = std::numeric_limits<result_type>::max() - 1; 115 return __return_value; 116 } 117 118 /* 119 * Converts a value generated by the adapted random number generator 120 * into a value in the input domain for the dependent random number 121 * distribution. 122 * 123 * Because the type traits are compile time constants only the 124 * appropriate clause of the if statements will actually be emitted 125 * by the compiler. 126 */ 127 result_type 128 operator()() 129 { 130 result_type __return_value; 131 if (is_integral<_Engine_result_type>::value 132 && is_integral<result_type>::value) 133 __return_value = _M_g(); 134 else if (!is_integral<_Engine_result_type>::value 135 && !is_integral<result_type>::value) 136 __return_value = result_type(_M_g() - _M_g.min()) 137 / result_type(_M_g.max() - _M_g.min()); 138 else if (is_integral<_Engine_result_type>::value 139 && !is_integral<result_type>::value) 140 __return_value = result_type(_M_g() - _M_g.min()) 141 / result_type(_M_g.max() - _M_g.min() + result_type(1)); 142 else 143 __return_value = (((_M_g() - _M_g.min()) 144 / (_M_g.max() - _M_g.min())) 145 * std::numeric_limits<result_type>::max()); 146 return __return_value; 147 } 148 149 private: 150 _Engine _M_g; 151 }; 152 153 // Specialization for _Engine*. 154 template<typename _Engine, typename _Distribution> 155 struct _Adaptor<_Engine*, _Distribution> 156 { 157 typedef typename _Engine::result_type _Engine_result_type; 158 typedef typename _Distribution::input_type result_type; 159 160 public: 161 _Adaptor(_Engine* __g) 162 : _M_g(__g) { } 163 164 result_type 165 min() const 166 { 167 result_type __return_value; 168 if (is_integral<_Engine_result_type>::value 169 && is_integral<result_type>::value) 170 __return_value = _M_g->min(); 171 else 172 __return_value = result_type(0); 173 return __return_value; 174 } 175 176 result_type 177 max() const 178 { 179 result_type __return_value; 180 if (is_integral<_Engine_result_type>::value 181 && is_integral<result_type>::value) 182 __return_value = _M_g->max(); 183 else if (!is_integral<result_type>::value) 184 __return_value = result_type(1); 185 else 186 __return_value = std::numeric_limits<result_type>::max() - 1; 187 return __return_value; 188 } 189 190 result_type 191 operator()() 192 { 193 result_type __return_value; 194 if (is_integral<_Engine_result_type>::value 195 && is_integral<result_type>::value) 196 __return_value = (*_M_g)(); 197 else if (!is_integral<_Engine_result_type>::value 198 && !is_integral<result_type>::value) 199 __return_value = result_type((*_M_g)() - _M_g->min()) 200 / result_type(_M_g->max() - _M_g->min()); 201 else if (is_integral<_Engine_result_type>::value 202 && !is_integral<result_type>::value) 203 __return_value = result_type((*_M_g)() - _M_g->min()) 204 / result_type(_M_g->max() - _M_g->min() + result_type(1)); 205 else 206 __return_value = ((((*_M_g)() - _M_g->min()) 207 / (_M_g->max() - _M_g->min())) 208 * std::numeric_limits<result_type>::max()); 209 return __return_value; 210 } 211 212 private: 213 _Engine* _M_g; 214 }; 215 216 _GLIBCXX_END_NAMESPACE_VERSION 217 } // namespace __detail 218 219 _GLIBCXX_BEGIN_NAMESPACE_VERSION 220 221 /** 222 * Produces random numbers on a given distribution function using a 223 * non-uniform random number generation engine. 224 * 225 * @todo the engine_value_type needs to be studied more carefully. 226 */ 227 template<typename _Engine, typename _Dist> 228 class variate_generator 229 { 230 // Concept requirements. 231 __glibcxx_class_requires(_Engine, _CopyConstructibleConcept) 232 // __glibcxx_class_requires(_Engine, _EngineConcept) 233 // __glibcxx_class_requires(_Dist, _EngineConcept) 234 235 public: 236 typedef _Engine engine_type; 237 typedef __detail::_Adaptor<_Engine, _Dist> engine_value_type; 238 typedef _Dist distribution_type; 239 typedef typename _Dist::result_type result_type; 240 241 // tr1:5.1.1 table 5.1 requirement 242 typedef typename __gnu_cxx::__enable_if< 243 is_arithmetic<result_type>::value, result_type>::__type _IsValidType; 244 245 /** 246 * Constructs a variate generator with the uniform random number 247 * generator @p __eng for the random distribution @p __dist. 248 * 249 * @throws Any exceptions which may thrown by the copy constructors of 250 * the @p _Engine or @p _Dist objects. 251 */ 252 variate_generator(engine_type __eng, distribution_type __dist) 253 : _M_engine(__eng), _M_dist(__dist) { } 254 255 /** 256 * Gets the next generated value on the distribution. 257 */ 258 result_type 259 operator()() 260 { return _M_dist(_M_engine); } 261 262 /** 263 * WTF? 264 */ 265 template<typename _Tp> 266 result_type 267 operator()(_Tp __value) 268 { return _M_dist(_M_engine, __value); } 269 270 /** 271 * Gets a reference to the underlying uniform random number generator 272 * object. 273 */ 274 engine_value_type& 275 engine() 276 { return _M_engine; } 277 278 /** 279 * Gets a const reference to the underlying uniform random number 280 * generator object. 281 */ 282 const engine_value_type& 283 engine() const 284 { return _M_engine; } 285 286 /** 287 * Gets a reference to the underlying random distribution. 288 */ 289 distribution_type& 290 distribution() 291 { return _M_dist; } 292 293 /** 294 * Gets a const reference to the underlying random distribution. 295 */ 296 const distribution_type& 297 distribution() const 298 { return _M_dist; } 299 300 /** 301 * Gets the closed lower bound of the distribution interval. 302 */ 303 result_type 304 min() const 305 { return this->distribution().min(); } 306 307 /** 308 * Gets the closed upper bound of the distribution interval. 309 */ 310 result_type 311 max() const 312 { return this->distribution().max(); } 313 314 private: 315 engine_value_type _M_engine; 316 distribution_type _M_dist; 317 }; 318 319 320 /** 321 * @addtogroup tr1_random_generators Random Number Generators 322 * @ingroup tr1_random 323 * 324 * These classes define objects which provide random or pseudorandom 325 * numbers, either from a discrete or a continuous interval. The 326 * random number generator supplied as a part of this library are 327 * all uniform random number generators which provide a sequence of 328 * random number uniformly distributed over their range. 329 * 330 * A number generator is a function object with an operator() that 331 * takes zero arguments and returns a number. 332 * 333 * A compliant random number generator must satisfy the following 334 * requirements. <table border=1 cellpadding=10 cellspacing=0> 335 * <caption align=top>Random Number Generator Requirements</caption> 336 * <tr><td>To be documented.</td></tr> </table> 337 * 338 * @{ 339 */ 340 341 /** 342 * @brief A model of a linear congruential random number generator. 343 * 344 * A random number generator that produces pseudorandom numbers using the 345 * linear function @f$x_{i+1}\leftarrow(ax_{i} + c) \bmod m @f$. 346 * 347 * The template parameter @p _UIntType must be an unsigned integral type 348 * large enough to store values up to (__m-1). If the template parameter 349 * @p __m is 0, the modulus @p __m used is 350 * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template 351 * parameters @p __a and @p __c must be less than @p __m. 352 * 353 * The size of the state is @f$ 1 @f$. 354 */ 355 template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 356 class linear_congruential 357 { 358 __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept) 359 // __glibcpp_class_requires(__a < __m && __c < __m) 360 361 public: 362 /** The type of the generated random value. */ 363 typedef _UIntType result_type; 364 365 /** The multiplier. */ 366 static const _UIntType multiplier = __a; 367 /** An increment. */ 368 static const _UIntType increment = __c; 369 /** The modulus. */ 370 static const _UIntType modulus = __m; 371 372 /** 373 * Constructs a %linear_congruential random number generator engine with 374 * seed @p __s. The default seed value is 1. 375 * 376 * @param __s The initial seed value. 377 */ 378 explicit 379 linear_congruential(unsigned long __x0 = 1) 380 { this->seed(__x0); } 381 382 /** 383 * Constructs a %linear_congruential random number generator engine 384 * seeded from the generator function @p __g. 385 * 386 * @param __g The seed generator function. 387 */ 388 template<class _Gen> 389 linear_congruential(_Gen& __g) 390 { this->seed(__g); } 391 392 /** 393 * Reseeds the %linear_congruential random number generator engine 394 * sequence to the seed @g __s. 395 * 396 * @param __s The new seed. 397 */ 398 void 399 seed(unsigned long __s = 1); 400 401 /** 402 * Reseeds the %linear_congruential random number generator engine 403 * sequence using values from the generator function @p __g. 404 * 405 * @param __g the seed generator function. 406 */ 407 template<class _Gen> 408 void 409 seed(_Gen& __g) 410 { seed(__g, typename is_fundamental<_Gen>::type()); } 411 412 /** 413 * Gets the smallest possible value in the output range. 414 * 415 * The minimum depends on the @p __c parameter: if it is zero, the 416 * minimum generated must be > 0, otherwise 0 is allowed. 417 */ 418 result_type 419 min() const 420 { return (__detail::__mod<_UIntType, 1, 0, __m>(__c) == 0) ? 1 : 0; } 421 422 /** 423 * Gets the largest possible value in the output range. 424 */ 425 result_type 426 max() const 427 { return __m - 1; } 428 429 /** 430 * Gets the next random number in the sequence. 431 */ 432 result_type 433 operator()(); 434 435 /** 436 * Compares two linear congruential random number generator 437 * objects of the same type for equality. 438 * 439 * @param __lhs A linear congruential random number generator object. 440 * @param __rhs Another linear congruential random number generator obj. 441 * 442 * @returns true if the two objects are equal, false otherwise. 443 */ 444 friend bool 445 operator==(const linear_congruential& __lhs, 446 const linear_congruential& __rhs) 447 { return __lhs._M_x == __rhs._M_x; } 448 449 /** 450 * Compares two linear congruential random number generator 451 * objects of the same type for inequality. 452 * 453 * @param __lhs A linear congruential random number generator object. 454 * @param __rhs Another linear congruential random number generator obj. 455 * 456 * @returns true if the two objects are not equal, false otherwise. 457 */ 458 friend bool 459 operator!=(const linear_congruential& __lhs, 460 const linear_congruential& __rhs) 461 { return !(__lhs == __rhs); } 462 463 /** 464 * Writes the textual representation of the state x(i) of x to @p __os. 465 * 466 * @param __os The output stream. 467 * @param __lcr A % linear_congruential random number generator. 468 * @returns __os. 469 */ 470 template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 471 _UIntType1 __m1, 472 typename _CharT, typename _Traits> 473 friend std::basic_ostream<_CharT, _Traits>& 474 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 475 const linear_congruential<_UIntType1, __a1, __c1, 476 __m1>& __lcr); 477 478 /** 479 * Sets the state of the engine by reading its textual 480 * representation from @p __is. 481 * 482 * The textual representation must have been previously written using an 483 * output stream whose imbued locale and whose type's template 484 * specialization arguments _CharT and _Traits were the same as those of 485 * @p __is. 486 * 487 * @param __is The input stream. 488 * @param __lcr A % linear_congruential random number generator. 489 * @returns __is. 490 */ 491 template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 492 _UIntType1 __m1, 493 typename _CharT, typename _Traits> 494 friend std::basic_istream<_CharT, _Traits>& 495 operator>>(std::basic_istream<_CharT, _Traits>& __is, 496 linear_congruential<_UIntType1, __a1, __c1, __m1>& __lcr); 497 498 private: 499 template<class _Gen> 500 void 501 seed(_Gen& __g, true_type) 502 { return seed(static_cast<unsigned long>(__g)); } 503 504 template<class _Gen> 505 void 506 seed(_Gen& __g, false_type); 507 508 _UIntType _M_x; 509 }; 510 511 /** 512 * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller. 513 */ 514 typedef linear_congruential<unsigned long, 16807, 0, 2147483647> minstd_rand0; 515 516 /** 517 * An alternative LCR (Lehmer Generator function) . 518 */ 519 typedef linear_congruential<unsigned long, 48271, 0, 2147483647> minstd_rand; 520 521 522 /** 523 * A generalized feedback shift register discrete random number generator. 524 * 525 * This algorithm avoids multiplication and division and is designed to be 526 * friendly to a pipelined architecture. If the parameters are chosen 527 * correctly, this generator will produce numbers with a very long period and 528 * fairly good apparent entropy, although still not cryptographically strong. 529 * 530 * The best way to use this generator is with the predefined mt19937 class. 531 * 532 * This algorithm was originally invented by Makoto Matsumoto and 533 * Takuji Nishimura. 534 * 535 * @var word_size The number of bits in each element of the state vector. 536 * @var state_size The degree of recursion. 537 * @var shift_size The period parameter. 538 * @var mask_bits The separation point bit index. 539 * @var parameter_a The last row of the twist matrix. 540 * @var output_u The first right-shift tempering matrix parameter. 541 * @var output_s The first left-shift tempering matrix parameter. 542 * @var output_b The first left-shift tempering matrix mask. 543 * @var output_t The second left-shift tempering matrix parameter. 544 * @var output_c The second left-shift tempering matrix mask. 545 * @var output_l The second right-shift tempering matrix parameter. 546 */ 547 template<class _UIntType, int __w, int __n, int __m, int __r, 548 _UIntType __a, int __u, int __s, _UIntType __b, int __t, 549 _UIntType __c, int __l> 550 class mersenne_twister 551 { 552 __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept) 553 554 public: 555 // types 556 typedef _UIntType result_type; 557 558 // parameter values 559 static const int word_size = __w; 560 static const int state_size = __n; 561 static const int shift_size = __m; 562 static const int mask_bits = __r; 563 static const _UIntType parameter_a = __a; 564 static const int output_u = __u; 565 static const int output_s = __s; 566 static const _UIntType output_b = __b; 567 static const int output_t = __t; 568 static const _UIntType output_c = __c; 569 static const int output_l = __l; 570 571 // constructors and member function 572 mersenne_twister() 573 { seed(); } 574 575 explicit 576 mersenne_twister(unsigned long __value) 577 { seed(__value); } 578 579 template<class _Gen> 580 mersenne_twister(_Gen& __g) 581 { seed(__g); } 582 583 void 584 seed() 585 { seed(5489UL); } 586 587 void 588 seed(unsigned long __value); 589 590 template<class _Gen> 591 void 592 seed(_Gen& __g) 593 { seed(__g, typename is_fundamental<_Gen>::type()); } 594 595 result_type 596 min() const 597 { return 0; }; 598 599 result_type 600 max() const 601 { return __detail::_Shift<_UIntType, __w>::__value - 1; } 602 603 result_type 604 operator()(); 605 606 /** 607 * Compares two % mersenne_twister random number generator objects of 608 * the same type for equality. 609 * 610 * @param __lhs A % mersenne_twister random number generator object. 611 * @param __rhs Another % mersenne_twister random number generator 612 * object. 613 * 614 * @returns true if the two objects are equal, false otherwise. 615 */ 616 friend bool 617 operator==(const mersenne_twister& __lhs, 618 const mersenne_twister& __rhs) 619 { return std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x); } 620 621 /** 622 * Compares two % mersenne_twister random number generator objects of 623 * the same type for inequality. 624 * 625 * @param __lhs A % mersenne_twister random number generator object. 626 * @param __rhs Another % mersenne_twister random number generator 627 * object. 628 * 629 * @returns true if the two objects are not equal, false otherwise. 630 */ 631 friend bool 632 operator!=(const mersenne_twister& __lhs, 633 const mersenne_twister& __rhs) 634 { return !(__lhs == __rhs); } 635 636 /** 637 * Inserts the current state of a % mersenne_twister random number 638 * generator engine @p __x into the output stream @p __os. 639 * 640 * @param __os An output stream. 641 * @param __x A % mersenne_twister random number generator engine. 642 * 643 * @returns The output stream with the state of @p __x inserted or in 644 * an error state. 645 */ 646 template<class _UIntType1, int __w1, int __n1, int __m1, int __r1, 647 _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1, 648 _UIntType1 __c1, int __l1, 649 typename _CharT, typename _Traits> 650 friend std::basic_ostream<_CharT, _Traits>& 651 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 652 const mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1, 653 __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x); 654 655 /** 656 * Extracts the current state of a % mersenne_twister random number 657 * generator engine @p __x from the input stream @p __is. 658 * 659 * @param __is An input stream. 660 * @param __x A % mersenne_twister random number generator engine. 661 * 662 * @returns The input stream with the state of @p __x extracted or in 663 * an error state. 664 */ 665 template<class _UIntType1, int __w1, int __n1, int __m1, int __r1, 666 _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1, 667 _UIntType1 __c1, int __l1, 668 typename _CharT, typename _Traits> 669 friend std::basic_istream<_CharT, _Traits>& 670 operator>>(std::basic_istream<_CharT, _Traits>& __is, 671 mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1, 672 __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x); 673 674 private: 675 template<class _Gen> 676 void 677 seed(_Gen& __g, true_type) 678 { return seed(static_cast<unsigned long>(__g)); } 679 680 template<class _Gen> 681 void 682 seed(_Gen& __g, false_type); 683 684 _UIntType _M_x[state_size]; 685 int _M_p; 686 }; 687 688 /** 689 * The classic Mersenne Twister. 690 * 691 * Reference: 692 * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally 693 * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions 694 * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. 695 */ 696 typedef mersenne_twister< 697 unsigned long, 32, 624, 397, 31, 698 0x9908b0dful, 11, 7, 699 0x9d2c5680ul, 15, 700 0xefc60000ul, 18 701 > mt19937; 702 703 704 /** 705 * @brief The Marsaglia-Zaman generator. 706 * 707 * This is a model of a Generalized Fibonacci discrete random number 708 * generator, sometimes referred to as the SWC generator. 709 * 710 * A discrete random number generator that produces pseudorandom 711 * numbers using @f$x_{i}\leftarrow(x_{i - s} - x_{i - r} - 712 * carry_{i-1}) \bmod m @f$. 713 * 714 * The size of the state is @f$ r @f$ 715 * and the maximum period of the generator is @f$ m^r - m^s -1 @f$. 716 * 717 * N1688[4.13] says <em>the template parameter _IntType shall denote 718 * an integral type large enough to store values up to m</em>. 719 * 720 * @var _M_x The state of the generator. This is a ring buffer. 721 * @var _M_carry The carry. 722 * @var _M_p Current index of x(i - r). 723 */ 724 template<typename _IntType, _IntType __m, int __s, int __r> 725 class subtract_with_carry 726 { 727 __glibcxx_class_requires(_IntType, _IntegerConcept) 728 729 public: 730 /** The type of the generated random value. */ 731 typedef _IntType result_type; 732 733 // parameter values 734 static const _IntType modulus = __m; 735 static const int long_lag = __r; 736 static const int short_lag = __s; 737 738 /** 739 * Constructs a default-initialized % subtract_with_carry random number 740 * generator. 741 */ 742 subtract_with_carry() 743 { this->seed(); } 744 745 /** 746 * Constructs an explicitly seeded % subtract_with_carry random number 747 * generator. 748 */ 749 explicit 750 subtract_with_carry(unsigned long __value) 751 { this->seed(__value); } 752 753 /** 754 * Constructs a %subtract_with_carry random number generator engine 755 * seeded from the generator function @p __g. 756 * 757 * @param __g The seed generator function. 758 */ 759 template<class _Gen> 760 subtract_with_carry(_Gen& __g) 761 { this->seed(__g); } 762 763 /** 764 * Seeds the initial state @f$ x_0 @f$ of the random number generator. 765 * 766 * N1688[4.19] modifies this as follows. If @p __value == 0, 767 * sets value to 19780503. In any case, with a linear 768 * congruential generator lcg(i) having parameters @f$ m_{lcg} = 769 * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value 770 * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m 771 * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$ 772 * set carry to 1, otherwise sets carry to 0. 773 */ 774 void 775 seed(unsigned long __value = 19780503); 776 777 /** 778 * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry 779 * random number generator. 780 */ 781 template<class _Gen> 782 void 783 seed(_Gen& __g) 784 { seed(__g, typename is_fundamental<_Gen>::type()); } 785 786 /** 787 * Gets the inclusive minimum value of the range of random integers 788 * returned by this generator. 789 */ 790 result_type 791 min() const 792 { return 0; } 793 794 /** 795 * Gets the inclusive maximum value of the range of random integers 796 * returned by this generator. 797 */ 798 result_type 799 max() const 800 { return this->modulus - 1; } 801 802 /** 803 * Gets the next random number in the sequence. 804 */ 805 result_type 806 operator()(); 807 808 /** 809 * Compares two % subtract_with_carry random number generator objects of 810 * the same type for equality. 811 * 812 * @param __lhs A % subtract_with_carry random number generator object. 813 * @param __rhs Another % subtract_with_carry random number generator 814 * object. 815 * 816 * @returns true if the two objects are equal, false otherwise. 817 */ 818 friend bool 819 operator==(const subtract_with_carry& __lhs, 820 const subtract_with_carry& __rhs) 821 { return std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x); } 822 823 /** 824 * Compares two % subtract_with_carry random number generator objects of 825 * the same type for inequality. 826 * 827 * @param __lhs A % subtract_with_carry random number generator object. 828 * @param __rhs Another % subtract_with_carry random number generator 829 * object. 830 * 831 * @returns true if the two objects are not equal, false otherwise. 832 */ 833 friend bool 834 operator!=(const subtract_with_carry& __lhs, 835 const subtract_with_carry& __rhs) 836 { return !(__lhs == __rhs); } 837 838 /** 839 * Inserts the current state of a % subtract_with_carry random number 840 * generator engine @p __x into the output stream @p __os. 841 * 842 * @param __os An output stream. 843 * @param __x A % subtract_with_carry random number generator engine. 844 * 845 * @returns The output stream with the state of @p __x inserted or in 846 * an error state. 847 */ 848 template<typename _IntType1, _IntType1 __m1, int __s1, int __r1, 849 typename _CharT, typename _Traits> 850 friend std::basic_ostream<_CharT, _Traits>& 851 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 852 const subtract_with_carry<_IntType1, __m1, __s1, 853 __r1>& __x); 854 855 /** 856 * Extracts the current state of a % subtract_with_carry random number 857 * generator engine @p __x from the input stream @p __is. 858 * 859 * @param __is An input stream. 860 * @param __x A % subtract_with_carry random number generator engine. 861 * 862 * @returns The input stream with the state of @p __x extracted or in 863 * an error state. 864 */ 865 template<typename _IntType1, _IntType1 __m1, int __s1, int __r1, 866 typename _CharT, typename _Traits> 867 friend std::basic_istream<_CharT, _Traits>& 868 operator>>(std::basic_istream<_CharT, _Traits>& __is, 869 subtract_with_carry<_IntType1, __m1, __s1, __r1>& __x); 870 871 private: 872 template<class _Gen> 873 void 874 seed(_Gen& __g, true_type) 875 { return seed(static_cast<unsigned long>(__g)); } 876 877 template<class _Gen> 878 void 879 seed(_Gen& __g, false_type); 880 881 typedef typename __gnu_cxx::__add_unsigned<_IntType>::__type _UIntType; 882 883 _UIntType _M_x[long_lag]; 884 _UIntType _M_carry; 885 int _M_p; 886 }; 887 888 889 /** 890 * @brief The Marsaglia-Zaman generator (floats version). 891 * 892 * @var _M_x The state of the generator. This is a ring buffer. 893 * @var _M_carry The carry. 894 * @var _M_p Current index of x(i - r). 895 * @var _M_npows Precomputed negative powers of 2. 896 */ 897 template<typename _RealType, int __w, int __s, int __r> 898 class subtract_with_carry_01 899 { 900 public: 901 /** The type of the generated random value. */ 902 typedef _RealType result_type; 903 904 // parameter values 905 static const int word_size = __w; 906 static const int long_lag = __r; 907 static const int short_lag = __s; 908 909 /** 910 * Constructs a default-initialized % subtract_with_carry_01 random 911 * number generator. 912 */ 913 subtract_with_carry_01() 914 { 915 this->seed(); 916 _M_initialize_npows(); 917 } 918 919 /** 920 * Constructs an explicitly seeded % subtract_with_carry_01 random number 921 * generator. 922 */ 923 explicit 924 subtract_with_carry_01(unsigned long __value) 925 { 926 this->seed(__value); 927 _M_initialize_npows(); 928 } 929 930 /** 931 * Constructs a % subtract_with_carry_01 random number generator engine 932 * seeded from the generator function @p __g. 933 * 934 * @param __g The seed generator function. 935 */ 936 template<class _Gen> 937 subtract_with_carry_01(_Gen& __g) 938 { 939 this->seed(__g); 940 _M_initialize_npows(); 941 } 942 943 /** 944 * Seeds the initial state @f$ x_0 @f$ of the random number generator. 945 */ 946 void 947 seed(unsigned long __value = 19780503); 948 949 /** 950 * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry_01 951 * random number generator. 952 */ 953 template<class _Gen> 954 void 955 seed(_Gen& __g) 956 { seed(__g, typename is_fundamental<_Gen>::type()); } 957 958 /** 959 * Gets the minimum value of the range of random floats 960 * returned by this generator. 961 */ 962 result_type 963 min() const 964 { return 0.0; } 965 966 /** 967 * Gets the maximum value of the range of random floats 968 * returned by this generator. 969 */ 970 result_type 971 max() const 972 { return 1.0; } 973 974 /** 975 * Gets the next random number in the sequence. 976 */ 977 result_type 978 operator()(); 979 980 /** 981 * Compares two % subtract_with_carry_01 random number generator objects 982 * of the same type for equality. 983 * 984 * @param __lhs A % subtract_with_carry_01 random number 985 * generator object. 986 * @param __rhs Another % subtract_with_carry_01 random number generator 987 * object. 988 * 989 * @returns true if the two objects are equal, false otherwise. 990 */ 991 friend bool 992 operator==(const subtract_with_carry_01& __lhs, 993 const subtract_with_carry_01& __rhs) 994 { 995 for (int __i = 0; __i < long_lag; ++__i) 996 if (!std::equal(__lhs._M_x[__i], __lhs._M_x[__i] + __n, 997 __rhs._M_x[__i])) 998 return false; 999 return true; 1000 } 1001 1002 /** 1003 * Compares two % subtract_with_carry_01 random number generator objects 1004 * of the same type for inequality. 1005 * 1006 * @param __lhs A % subtract_with_carry_01 random number 1007 * generator object. 1008 * 1009 * @param __rhs Another % subtract_with_carry_01 random number generator 1010 * object. 1011 * 1012 * @returns true if the two objects are not equal, false otherwise. 1013 */ 1014 friend bool 1015 operator!=(const subtract_with_carry_01& __lhs, 1016 const subtract_with_carry_01& __rhs) 1017 { return !(__lhs == __rhs); } 1018 1019 /** 1020 * Inserts the current state of a % subtract_with_carry_01 random number 1021 * generator engine @p __x into the output stream @p __os. 1022 * 1023 * @param __os An output stream. 1024 * @param __x A % subtract_with_carry_01 random number generator engine. 1025 * 1026 * @returns The output stream with the state of @p __x inserted or in 1027 * an error state. 1028 */ 1029 template<typename _RealType1, int __w1, int __s1, int __r1, 1030 typename _CharT, typename _Traits> 1031 friend std::basic_ostream<_CharT, _Traits>& 1032 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1033 const subtract_with_carry_01<_RealType1, __w1, __s1, 1034 __r1>& __x); 1035 1036 /** 1037 * Extracts the current state of a % subtract_with_carry_01 random number 1038 * generator engine @p __x from the input stream @p __is. 1039 * 1040 * @param __is An input stream. 1041 * @param __x A % subtract_with_carry_01 random number generator engine. 1042 * 1043 * @returns The input stream with the state of @p __x extracted or in 1044 * an error state. 1045 */ 1046 template<typename _RealType1, int __w1, int __s1, int __r1, 1047 typename _CharT, typename _Traits> 1048 friend std::basic_istream<_CharT, _Traits>& 1049 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1050 subtract_with_carry_01<_RealType1, __w1, __s1, __r1>& __x); 1051 1052 private: 1053 template<class _Gen> 1054 void 1055 seed(_Gen& __g, true_type) 1056 { return seed(static_cast<unsigned long>(__g)); } 1057 1058 template<class _Gen> 1059 void 1060 seed(_Gen& __g, false_type); 1061 1062 void 1063 _M_initialize_npows(); 1064 1065 static const int __n = (__w + 31) / 32; 1066 1067 typedef __detail::_UInt32Type _UInt32Type; 1068 _UInt32Type _M_x[long_lag][__n]; 1069 _RealType _M_npows[__n]; 1070 _UInt32Type _M_carry; 1071 int _M_p; 1072 }; 1073 1074 typedef subtract_with_carry_01<float, 24, 10, 24> ranlux_base_01; 1075 1076 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1077 // 508. Bad parameters for ranlux64_base_01. 1078 typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01; 1079 1080 1081 /** 1082 * Produces random numbers from some base engine by discarding blocks of 1083 * data. 1084 * 1085 * 0 <= @p __r <= @p __p 1086 */ 1087 template<class _UniformRandomNumberGenerator, int __p, int __r> 1088 class discard_block 1089 { 1090 // __glibcxx_class_requires(typename base_type::result_type, 1091 // ArithmeticTypeConcept) 1092 1093 public: 1094 /** The type of the underlying generator engine. */ 1095 typedef _UniformRandomNumberGenerator base_type; 1096 /** The type of the generated random value. */ 1097 typedef typename base_type::result_type result_type; 1098 1099 // parameter values 1100 static const int block_size = __p; 1101 static const int used_block = __r; 1102 1103 /** 1104 * Constructs a default %discard_block engine. 1105 * 1106 * The underlying engine is default constructed as well. 1107 */ 1108 discard_block() 1109 : _M_n(0) { } 1110 1111 /** 1112 * Copy constructs a %discard_block engine. 1113 * 1114 * Copies an existing base class random number generator. 1115 * @param rng An existing (base class) engine object. 1116 */ 1117 explicit 1118 discard_block(const base_type& __rng) 1119 : _M_b(__rng), _M_n(0) { } 1120 1121 /** 1122 * Seed constructs a %discard_block engine. 1123 * 1124 * Constructs the underlying generator engine seeded with @p __s. 1125 * @param __s A seed value for the base class engine. 1126 */ 1127 explicit 1128 discard_block(unsigned long __s) 1129 : _M_b(__s), _M_n(0) { } 1130 1131 /** 1132 * Generator construct a %discard_block engine. 1133 * 1134 * @param __g A seed generator function. 1135 */ 1136 template<class _Gen> 1137 discard_block(_Gen& __g) 1138 : _M_b(__g), _M_n(0) { } 1139 1140 /** 1141 * Reseeds the %discard_block object with the default seed for the 1142 * underlying base class generator engine. 1143 */ 1144 void seed() 1145 { 1146 _M_b.seed(); 1147 _M_n = 0; 1148 } 1149 1150 /** 1151 * Reseeds the %discard_block object with the given seed generator 1152 * function. 1153 * @param __g A seed generator function. 1154 */ 1155 template<class _Gen> 1156 void seed(_Gen& __g) 1157 { 1158 _M_b.seed(__g); 1159 _M_n = 0; 1160 } 1161 1162 /** 1163 * Gets a const reference to the underlying generator engine object. 1164 */ 1165 const base_type& 1166 base() const 1167 { return _M_b; } 1168 1169 /** 1170 * Gets the minimum value in the generated random number range. 1171 */ 1172 result_type 1173 min() const 1174 { return _M_b.min(); } 1175 1176 /** 1177 * Gets the maximum value in the generated random number range. 1178 */ 1179 result_type 1180 max() const 1181 { return _M_b.max(); } 1182 1183 /** 1184 * Gets the next value in the generated random number sequence. 1185 */ 1186 result_type 1187 operator()(); 1188 1189 /** 1190 * Compares two %discard_block random number generator objects of 1191 * the same type for equality. 1192 * 1193 * @param __lhs A %discard_block random number generator object. 1194 * @param __rhs Another %discard_block random number generator 1195 * object. 1196 * 1197 * @returns true if the two objects are equal, false otherwise. 1198 */ 1199 friend bool 1200 operator==(const discard_block& __lhs, const discard_block& __rhs) 1201 { return (__lhs._M_b == __rhs._M_b) && (__lhs._M_n == __rhs._M_n); } 1202 1203 /** 1204 * Compares two %discard_block random number generator objects of 1205 * the same type for inequality. 1206 * 1207 * @param __lhs A %discard_block random number generator object. 1208 * @param __rhs Another %discard_block random number generator 1209 * object. 1210 * 1211 * @returns true if the two objects are not equal, false otherwise. 1212 */ 1213 friend bool 1214 operator!=(const discard_block& __lhs, const discard_block& __rhs) 1215 { return !(__lhs == __rhs); } 1216 1217 /** 1218 * Inserts the current state of a %discard_block random number 1219 * generator engine @p __x into the output stream @p __os. 1220 * 1221 * @param __os An output stream. 1222 * @param __x A %discard_block random number generator engine. 1223 * 1224 * @returns The output stream with the state of @p __x inserted or in 1225 * an error state. 1226 */ 1227 template<class _UniformRandomNumberGenerator1, int __p1, int __r1, 1228 typename _CharT, typename _Traits> 1229 friend std::basic_ostream<_CharT, _Traits>& 1230 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1231 const discard_block<_UniformRandomNumberGenerator1, 1232 __p1, __r1>& __x); 1233 1234 /** 1235 * Extracts the current state of a % subtract_with_carry random number 1236 * generator engine @p __x from the input stream @p __is. 1237 * 1238 * @param __is An input stream. 1239 * @param __x A %discard_block random number generator engine. 1240 * 1241 * @returns The input stream with the state of @p __x extracted or in 1242 * an error state. 1243 */ 1244 template<class _UniformRandomNumberGenerator1, int __p1, int __r1, 1245 typename _CharT, typename _Traits> 1246 friend std::basic_istream<_CharT, _Traits>& 1247 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1248 discard_block<_UniformRandomNumberGenerator1, 1249 __p1, __r1>& __x); 1250 1251 private: 1252 base_type _M_b; 1253 int _M_n; 1254 }; 1255 1256 1257 /** 1258 * James's luxury-level-3 integer adaptation of Luescher's generator. 1259 */ 1260 typedef discard_block< 1261 subtract_with_carry<unsigned long, (1UL << 24), 10, 24>, 1262 223, 1263 24 1264 > ranlux3; 1265 1266 /** 1267 * James's luxury-level-4 integer adaptation of Luescher's generator. 1268 */ 1269 typedef discard_block< 1270 subtract_with_carry<unsigned long, (1UL << 24), 10, 24>, 1271 389, 1272 24 1273 > ranlux4; 1274 1275 typedef discard_block< 1276 subtract_with_carry_01<float, 24, 10, 24>, 1277 223, 1278 24 1279 > ranlux3_01; 1280 1281 typedef discard_block< 1282 subtract_with_carry_01<float, 24, 10, 24>, 1283 389, 1284 24 1285 > ranlux4_01; 1286 1287 1288 /** 1289 * A random number generator adaptor class that combines two random number 1290 * generator engines into a single output sequence. 1291 */ 1292 template<class _UniformRandomNumberGenerator1, int __s1, 1293 class _UniformRandomNumberGenerator2, int __s2> 1294 class xor_combine 1295 { 1296 // __glibcxx_class_requires(typename _UniformRandomNumberGenerator1:: 1297 // result_type, ArithmeticTypeConcept) 1298 // __glibcxx_class_requires(typename _UniformRandomNumberGenerator2:: 1299 // result_type, ArithmeticTypeConcept) 1300 1301 public: 1302 /** The type of the first underlying generator engine. */ 1303 typedef _UniformRandomNumberGenerator1 base1_type; 1304 /** The type of the second underlying generator engine. */ 1305 typedef _UniformRandomNumberGenerator2 base2_type; 1306 1307 private: 1308 typedef typename base1_type::result_type _Result_type1; 1309 typedef typename base2_type::result_type _Result_type2; 1310 1311 public: 1312 /** The type of the generated random value. */ 1313 typedef typename __gnu_cxx::__conditional_type<(sizeof(_Result_type1) 1314 > sizeof(_Result_type2)), 1315 _Result_type1, _Result_type2>::__type result_type; 1316 1317 // parameter values 1318 static const int shift1 = __s1; 1319 static const int shift2 = __s2; 1320 1321 // constructors and member function 1322 xor_combine() 1323 : _M_b1(), _M_b2() 1324 { _M_initialize_max(); } 1325 1326 xor_combine(const base1_type& __rng1, const base2_type& __rng2) 1327 : _M_b1(__rng1), _M_b2(__rng2) 1328 { _M_initialize_max(); } 1329 1330 xor_combine(unsigned long __s) 1331 : _M_b1(__s), _M_b2(__s + 1) 1332 { _M_initialize_max(); } 1333 1334 template<class _Gen> 1335 xor_combine(_Gen& __g) 1336 : _M_b1(__g), _M_b2(__g) 1337 { _M_initialize_max(); } 1338 1339 void 1340 seed() 1341 { 1342 _M_b1.seed(); 1343 _M_b2.seed(); 1344 } 1345 1346 template<class _Gen> 1347 void 1348 seed(_Gen& __g) 1349 { 1350 _M_b1.seed(__g); 1351 _M_b2.seed(__g); 1352 } 1353 1354 const base1_type& 1355 base1() const 1356 { return _M_b1; } 1357 1358 const base2_type& 1359 base2() const 1360 { return _M_b2; } 1361 1362 result_type 1363 min() const 1364 { return 0; } 1365 1366 result_type 1367 max() const 1368 { return _M_max; } 1369 1370 /** 1371 * Gets the next random number in the sequence. 1372 */ 1373 // NB: Not exactly the TR1 formula, per N2079 instead. 1374 result_type 1375 operator()() 1376 { 1377 return ((result_type(_M_b1() - _M_b1.min()) << shift1) 1378 ^ (result_type(_M_b2() - _M_b2.min()) << shift2)); 1379 } 1380 1381 /** 1382 * Compares two %xor_combine random number generator objects of 1383 * the same type for equality. 1384 * 1385 * @param __lhs A %xor_combine random number generator object. 1386 * @param __rhs Another %xor_combine random number generator 1387 * object. 1388 * 1389 * @returns true if the two objects are equal, false otherwise. 1390 */ 1391 friend bool 1392 operator==(const xor_combine& __lhs, const xor_combine& __rhs) 1393 { 1394 return (__lhs.base1() == __rhs.base1()) 1395 && (__lhs.base2() == __rhs.base2()); 1396 } 1397 1398 /** 1399 * Compares two %xor_combine random number generator objects of 1400 * the same type for inequality. 1401 * 1402 * @param __lhs A %xor_combine random number generator object. 1403 * @param __rhs Another %xor_combine random number generator 1404 * object. 1405 * 1406 * @returns true if the two objects are not equal, false otherwise. 1407 */ 1408 friend bool 1409 operator!=(const xor_combine& __lhs, const xor_combine& __rhs) 1410 { return !(__lhs == __rhs); } 1411 1412 /** 1413 * Inserts the current state of a %xor_combine random number 1414 * generator engine @p __x into the output stream @p __os. 1415 * 1416 * @param __os An output stream. 1417 * @param __x A %xor_combine random number generator engine. 1418 * 1419 * @returns The output stream with the state of @p __x inserted or in 1420 * an error state. 1421 */ 1422 template<class _UniformRandomNumberGenerator11, int __s11, 1423 class _UniformRandomNumberGenerator21, int __s21, 1424 typename _CharT, typename _Traits> 1425 friend std::basic_ostream<_CharT, _Traits>& 1426 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1427 const xor_combine<_UniformRandomNumberGenerator11, __s11, 1428 _UniformRandomNumberGenerator21, __s21>& __x); 1429 1430 /** 1431 * Extracts the current state of a %xor_combine random number 1432 * generator engine @p __x from the input stream @p __is. 1433 * 1434 * @param __is An input stream. 1435 * @param __x A %xor_combine random number generator engine. 1436 * 1437 * @returns The input stream with the state of @p __x extracted or in 1438 * an error state. 1439 */ 1440 template<class _UniformRandomNumberGenerator11, int __s11, 1441 class _UniformRandomNumberGenerator21, int __s21, 1442 typename _CharT, typename _Traits> 1443 friend std::basic_istream<_CharT, _Traits>& 1444 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1445 xor_combine<_UniformRandomNumberGenerator11, __s11, 1446 _UniformRandomNumberGenerator21, __s21>& __x); 1447 1448 private: 1449 void 1450 _M_initialize_max(); 1451 1452 result_type 1453 _M_initialize_max_aux(result_type, result_type, int); 1454 1455 base1_type _M_b1; 1456 base2_type _M_b2; 1457 result_type _M_max; 1458 }; 1459 1460 1461 /** 1462 * A standard interface to a platform-specific non-deterministic 1463 * random number generator (if any are available). 1464 */ 1465 class random_device 1466 { 1467 public: 1468 // types 1469 typedef unsigned int result_type; 1470 1471 // constructors, destructors and member functions 1472 1473 #ifdef _GLIBCXX_USE_RANDOM_TR1 1474 1475 explicit 1476 random_device(const std::string& __token = "/dev/urandom") 1477 { 1478 if ((__token != "/dev/urandom" && __token != "/dev/random") 1479 || !(_M_file = std::fopen(__token.c_str(), "rb"))) 1480 std::__throw_runtime_error(__N("random_device::" 1481 "random_device(const std::string&)")); 1482 } 1483 1484 ~random_device() 1485 { std::fclose(_M_file); } 1486 1487 #else 1488 1489 explicit 1490 random_device(const std::string& __token = "mt19937") 1491 : _M_mt(_M_strtoul(__token)) { } 1492 1493 private: 1494 static unsigned long 1495 _M_strtoul(const std::string& __str) 1496 { 1497 unsigned long __ret = 5489UL; 1498 if (__str != "mt19937") 1499 { 1500 const char* __nptr = __str.c_str(); 1501 char* __endptr; 1502 __ret = std::strtoul(__nptr, &__endptr, 0); 1503 if (*__nptr == '\0' || *__endptr != '\0') 1504 std::__throw_runtime_error(__N("random_device::_M_strtoul" 1505 "(const std::string&)")); 1506 } 1507 return __ret; 1508 } 1509 1510 public: 1511 1512 #endif 1513 1514 result_type 1515 min() const 1516 { return std::numeric_limits<result_type>::min(); } 1517 1518 result_type 1519 max() const 1520 { return std::numeric_limits<result_type>::max(); } 1521 1522 double 1523 entropy() const 1524 { return 0.0; } 1525 1526 result_type 1527 operator()() 1528 { 1529 #ifdef _GLIBCXX_USE_RANDOM_TR1 1530 result_type __ret; 1531 std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type), 1532 1, _M_file); 1533 return __ret; 1534 #else 1535 return _M_mt(); 1536 #endif 1537 } 1538 1539 private: 1540 random_device(const random_device&); 1541 void operator=(const random_device&); 1542 1543 #ifdef _GLIBCXX_USE_RANDOM_TR1 1544 FILE* _M_file; 1545 #else 1546 mt19937 _M_mt; 1547 #endif 1548 }; 1549 1550 /* @} */ // group tr1_random_generators 1551 1552 /** 1553 * @addtogroup tr1_random_distributions Random Number Distributions 1554 * @ingroup tr1_random 1555 * @{ 1556 */ 1557 1558 /** 1559 * @addtogroup tr1_random_distributions_discrete Discrete Distributions 1560 * @ingroup tr1_random_distributions 1561 * @{ 1562 */ 1563 1564 /** 1565 * @brief Uniform discrete distribution for random numbers. 1566 * A discrete random distribution on the range @f$[min, max]@f$ with equal 1567 * probability throughout the range. 1568 */ 1569 template<typename _IntType = int> 1570 class uniform_int 1571 { 1572 __glibcxx_class_requires(_IntType, _IntegerConcept) 1573 1574 public: 1575 /** The type of the parameters of the distribution. */ 1576 typedef _IntType input_type; 1577 /** The type of the range of the distribution. */ 1578 typedef _IntType result_type; 1579 1580 public: 1581 /** 1582 * Constructs a uniform distribution object. 1583 */ 1584 explicit 1585 uniform_int(_IntType __min = 0, _IntType __max = 9) 1586 : _M_min(__min), _M_max(__max) 1587 { 1588 _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max); 1589 } 1590 1591 /** 1592 * Gets the inclusive lower bound of the distribution range. 1593 */ 1594 result_type 1595 min() const 1596 { return _M_min; } 1597 1598 /** 1599 * Gets the inclusive upper bound of the distribution range. 1600 */ 1601 result_type 1602 max() const 1603 { return _M_max; } 1604 1605 /** 1606 * Resets the distribution state. 1607 * 1608 * Does nothing for the uniform integer distribution. 1609 */ 1610 void 1611 reset() { } 1612 1613 /** 1614 * Gets a uniformly distributed random number in the range 1615 * @f$(min, max)@f$. 1616 */ 1617 template<typename _UniformRandomNumberGenerator> 1618 result_type 1619 operator()(_UniformRandomNumberGenerator& __urng) 1620 { 1621 typedef typename _UniformRandomNumberGenerator::result_type 1622 _UResult_type; 1623 return _M_call(__urng, _M_min, _M_max, 1624 typename is_integral<_UResult_type>::type()); 1625 } 1626 1627 /** 1628 * Gets a uniform random number in the range @f$[0, n)@f$. 1629 * 1630 * This function is aimed at use with std::random_shuffle. 1631 */ 1632 template<typename _UniformRandomNumberGenerator> 1633 result_type 1634 operator()(_UniformRandomNumberGenerator& __urng, result_type __n) 1635 { 1636 typedef typename _UniformRandomNumberGenerator::result_type 1637 _UResult_type; 1638 return _M_call(__urng, 0, __n - 1, 1639 typename is_integral<_UResult_type>::type()); 1640 } 1641 1642 /** 1643 * Inserts a %uniform_int random number distribution @p __x into the 1644 * output stream @p os. 1645 * 1646 * @param __os An output stream. 1647 * @param __x A %uniform_int random number distribution. 1648 * 1649 * @returns The output stream with the state of @p __x inserted or in 1650 * an error state. 1651 */ 1652 template<typename _IntType1, typename _CharT, typename _Traits> 1653 friend std::basic_ostream<_CharT, _Traits>& 1654 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1655 const uniform_int<_IntType1>& __x); 1656 1657 /** 1658 * Extracts a %uniform_int random number distribution 1659 * @p __x from the input stream @p __is. 1660 * 1661 * @param __is An input stream. 1662 * @param __x A %uniform_int random number generator engine. 1663 * 1664 * @returns The input stream with @p __x extracted or in an error state. 1665 */ 1666 template<typename _IntType1, typename _CharT, typename _Traits> 1667 friend std::basic_istream<_CharT, _Traits>& 1668 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1669 uniform_int<_IntType1>& __x); 1670 1671 private: 1672 template<typename _UniformRandomNumberGenerator> 1673 result_type 1674 _M_call(_UniformRandomNumberGenerator& __urng, 1675 result_type __min, result_type __max, true_type); 1676 1677 template<typename _UniformRandomNumberGenerator> 1678 result_type 1679 _M_call(_UniformRandomNumberGenerator& __urng, 1680 result_type __min, result_type __max, false_type) 1681 { 1682 return result_type((__urng() - __urng.min()) 1683 / (__urng.max() - __urng.min()) 1684 * (__max - __min + 1)) + __min; 1685 } 1686 1687 _IntType _M_min; 1688 _IntType _M_max; 1689 }; 1690 1691 1692 /** 1693 * @brief A Bernoulli random number distribution. 1694 * 1695 * Generates a sequence of true and false values with likelihood @f$ p @f$ 1696 * that true will come up and @f$ (1 - p) @f$ that false will appear. 1697 */ 1698 class bernoulli_distribution 1699 { 1700 public: 1701 typedef int input_type; 1702 typedef bool result_type; 1703 1704 public: 1705 /** 1706 * Constructs a Bernoulli distribution with likelihood @p p. 1707 * 1708 * @param __p [IN] The likelihood of a true result being returned. Must 1709 * be in the interval @f$ [0, 1] @f$. 1710 */ 1711 explicit 1712 bernoulli_distribution(double __p = 0.5) 1713 : _M_p(__p) 1714 { 1715 _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0)); 1716 } 1717 1718 /** 1719 * Gets the @p p parameter of the distribution. 1720 */ 1721 double 1722 p() const 1723 { return _M_p; } 1724 1725 /** 1726 * Resets the distribution state. 1727 * 1728 * Does nothing for a Bernoulli distribution. 1729 */ 1730 void 1731 reset() { } 1732 1733 /** 1734 * Gets the next value in the Bernoullian sequence. 1735 */ 1736 template<class _UniformRandomNumberGenerator> 1737 result_type 1738 operator()(_UniformRandomNumberGenerator& __urng) 1739 { 1740 if ((__urng() - __urng.min()) < _M_p * (__urng.max() - __urng.min())) 1741 return true; 1742 return false; 1743 } 1744 1745 /** 1746 * Inserts a %bernoulli_distribution random number distribution 1747 * @p __x into the output stream @p __os. 1748 * 1749 * @param __os An output stream. 1750 * @param __x A %bernoulli_distribution random number distribution. 1751 * 1752 * @returns The output stream with the state of @p __x inserted or in 1753 * an error state. 1754 */ 1755 template<typename _CharT, typename _Traits> 1756 friend std::basic_ostream<_CharT, _Traits>& 1757 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1758 const bernoulli_distribution& __x); 1759 1760 /** 1761 * Extracts a %bernoulli_distribution random number distribution 1762 * @p __x from the input stream @p __is. 1763 * 1764 * @param __is An input stream. 1765 * @param __x A %bernoulli_distribution random number generator engine. 1766 * 1767 * @returns The input stream with @p __x extracted or in an error state. 1768 */ 1769 template<typename _CharT, typename _Traits> 1770 friend std::basic_istream<_CharT, _Traits>& 1771 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1772 bernoulli_distribution& __x) 1773 { return __is >> __x._M_p; } 1774 1775 private: 1776 double _M_p; 1777 }; 1778 1779 1780 /** 1781 * @brief A discrete geometric random number distribution. 1782 * 1783 * The formula for the geometric probability mass function is 1784 * @f$ p(i) = (1 - p)p^{i-1} @f$ where @f$ p @f$ is the parameter of the 1785 * distribution. 1786 */ 1787 template<typename _IntType = int, typename _RealType = double> 1788 class geometric_distribution 1789 { 1790 public: 1791 // types 1792 typedef _RealType input_type; 1793 typedef _IntType result_type; 1794 1795 // constructors and member function 1796 explicit 1797 geometric_distribution(const _RealType& __p = _RealType(0.5)) 1798 : _M_p(__p) 1799 { 1800 _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0)); 1801 _M_initialize(); 1802 } 1803 1804 /** 1805 * Gets the distribution parameter @p p. 1806 */ 1807 _RealType 1808 p() const 1809 { return _M_p; } 1810 1811 void 1812 reset() { } 1813 1814 template<class _UniformRandomNumberGenerator> 1815 result_type 1816 operator()(_UniformRandomNumberGenerator& __urng); 1817 1818 /** 1819 * Inserts a %geometric_distribution random number distribution 1820 * @p __x into the output stream @p __os. 1821 * 1822 * @param __os An output stream. 1823 * @param __x A %geometric_distribution random number distribution. 1824 * 1825 * @returns The output stream with the state of @p __x inserted or in 1826 * an error state. 1827 */ 1828 template<typename _IntType1, typename _RealType1, 1829 typename _CharT, typename _Traits> 1830 friend std::basic_ostream<_CharT, _Traits>& 1831 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1832 const geometric_distribution<_IntType1, _RealType1>& __x); 1833 1834 /** 1835 * Extracts a %geometric_distribution random number distribution 1836 * @p __x from the input stream @p __is. 1837 * 1838 * @param __is An input stream. 1839 * @param __x A %geometric_distribution random number generator engine. 1840 * 1841 * @returns The input stream with @p __x extracted or in an error state. 1842 */ 1843 template<typename _CharT, typename _Traits> 1844 friend std::basic_istream<_CharT, _Traits>& 1845 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1846 geometric_distribution& __x) 1847 { 1848 __is >> __x._M_p; 1849 __x._M_initialize(); 1850 return __is; 1851 } 1852 1853 private: 1854 void 1855 _M_initialize() 1856 { _M_log_p = std::log(_M_p); } 1857 1858 _RealType _M_p; 1859 _RealType _M_log_p; 1860 }; 1861 1862 1863 template<typename _RealType> 1864 class normal_distribution; 1865 1866 /** 1867 * @brief A discrete Poisson random number distribution. 1868 * 1869 * The formula for the Poisson probability mass function is 1870 * @f$ p(i) = \frac{mean^i}{i!} e^{-mean} @f$ where @f$ mean @f$ is the 1871 * parameter of the distribution. 1872 */ 1873 template<typename _IntType = int, typename _RealType = double> 1874 class poisson_distribution 1875 { 1876 public: 1877 // types 1878 typedef _RealType input_type; 1879 typedef _IntType result_type; 1880 1881 // constructors and member function 1882 explicit 1883 poisson_distribution(const _RealType& __mean = _RealType(1)) 1884 : _M_mean(__mean), _M_nd() 1885 { 1886 _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); 1887 _M_initialize(); 1888 } 1889 1890 /** 1891 * Gets the distribution parameter @p mean. 1892 */ 1893 _RealType 1894 mean() const 1895 { return _M_mean; } 1896 1897 void 1898 reset() 1899 { _M_nd.reset(); } 1900 1901 template<class _UniformRandomNumberGenerator> 1902 result_type 1903 operator()(_UniformRandomNumberGenerator& __urng); 1904 1905 /** 1906 * Inserts a %poisson_distribution random number distribution 1907 * @p __x into the output stream @p __os. 1908 * 1909 * @param __os An output stream. 1910 * @param __x A %poisson_distribution random number distribution. 1911 * 1912 * @returns The output stream with the state of @p __x inserted or in 1913 * an error state. 1914 */ 1915 template<typename _IntType1, typename _RealType1, 1916 typename _CharT, typename _Traits> 1917 friend std::basic_ostream<_CharT, _Traits>& 1918 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1919 const poisson_distribution<_IntType1, _RealType1>& __x); 1920 1921 /** 1922 * Extracts a %poisson_distribution random number distribution 1923 * @p __x from the input stream @p __is. 1924 * 1925 * @param __is An input stream. 1926 * @param __x A %poisson_distribution random number generator engine. 1927 * 1928 * @returns The input stream with @p __x extracted or in an error state. 1929 */ 1930 template<typename _IntType1, typename _RealType1, 1931 typename _CharT, typename _Traits> 1932 friend std::basic_istream<_CharT, _Traits>& 1933 operator>>(std::basic_istream<_CharT, _Traits>& __is, 1934 poisson_distribution<_IntType1, _RealType1>& __x); 1935 1936 private: 1937 void 1938 _M_initialize(); 1939 1940 // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 1941 normal_distribution<_RealType> _M_nd; 1942 1943 _RealType _M_mean; 1944 1945 // Hosts either log(mean) or the threshold of the simple method. 1946 _RealType _M_lm_thr; 1947 #if _GLIBCXX_USE_C99_MATH_TR1 1948 _RealType _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb; 1949 #endif 1950 }; 1951 1952 1953 /** 1954 * @brief A discrete binomial random number distribution. 1955 * 1956 * The formula for the binomial probability mass function is 1957 * @f$ p(i) = \binom{n}{i} p^i (1 - p)^{t - i} @f$ where @f$ t @f$ 1958 * and @f$ p @f$ are the parameters of the distribution. 1959 */ 1960 template<typename _IntType = int, typename _RealType = double> 1961 class binomial_distribution 1962 { 1963 public: 1964 // types 1965 typedef _RealType input_type; 1966 typedef _IntType result_type; 1967 1968 // constructors and member function 1969 explicit 1970 binomial_distribution(_IntType __t = 1, 1971 const _RealType& __p = _RealType(0.5)) 1972 : _M_t(__t), _M_p(__p), _M_nd() 1973 { 1974 _GLIBCXX_DEBUG_ASSERT((_M_t >= 0) && (_M_p >= 0.0) && (_M_p <= 1.0)); 1975 _M_initialize(); 1976 } 1977 1978 /** 1979 * Gets the distribution @p t parameter. 1980 */ 1981 _IntType 1982 t() const 1983 { return _M_t; } 1984 1985 /** 1986 * Gets the distribution @p p parameter. 1987 */ 1988 _RealType 1989 p() const 1990 { return _M_p; } 1991 1992 void 1993 reset() 1994 { _M_nd.reset(); } 1995 1996 template<class _UniformRandomNumberGenerator> 1997 result_type 1998 operator()(_UniformRandomNumberGenerator& __urng); 1999 2000 /** 2001 * Inserts a %binomial_distribution random number distribution 2002 * @p __x into the output stream @p __os. 2003 * 2004 * @param __os An output stream. 2005 * @param __x A %binomial_distribution random number distribution. 2006 * 2007 * @returns The output stream with the state of @p __x inserted or in 2008 * an error state. 2009 */ 2010 template<typename _IntType1, typename _RealType1, 2011 typename _CharT, typename _Traits> 2012 friend std::basic_ostream<_CharT, _Traits>& 2013 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2014 const binomial_distribution<_IntType1, _RealType1>& __x); 2015 2016 /** 2017 * Extracts a %binomial_distribution random number distribution 2018 * @p __x from the input stream @p __is. 2019 * 2020 * @param __is An input stream. 2021 * @param __x A %binomial_distribution random number generator engine. 2022 * 2023 * @returns The input stream with @p __x extracted or in an error state. 2024 */ 2025 template<typename _IntType1, typename _RealType1, 2026 typename _CharT, typename _Traits> 2027 friend std::basic_istream<_CharT, _Traits>& 2028 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2029 binomial_distribution<_IntType1, _RealType1>& __x); 2030 2031 private: 2032 void 2033 _M_initialize(); 2034 2035 template<class _UniformRandomNumberGenerator> 2036 result_type 2037 _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t); 2038 2039 // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 2040 normal_distribution<_RealType> _M_nd; 2041 2042 _RealType _M_q; 2043 #if _GLIBCXX_USE_C99_MATH_TR1 2044 _RealType _M_d1, _M_d2, _M_s1, _M_s2, _M_c, 2045 _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p; 2046 #endif 2047 _RealType _M_p; 2048 _IntType _M_t; 2049 2050 bool _M_easy; 2051 }; 2052 2053 /* @} */ // group tr1_random_distributions_discrete 2054 2055 /** 2056 * @addtogroup tr1_random_distributions_continuous Continuous Distributions 2057 * @ingroup tr1_random_distributions 2058 * @{ 2059 */ 2060 2061 /** 2062 * @brief Uniform continuous distribution for random numbers. 2063 * 2064 * A continuous random distribution on the range [min, max) with equal 2065 * probability throughout the range. The URNG should be real-valued and 2066 * deliver number in the range [0, 1). 2067 */ 2068 template<typename _RealType = double> 2069 class uniform_real 2070 { 2071 public: 2072 // types 2073 typedef _RealType input_type; 2074 typedef _RealType result_type; 2075 2076 public: 2077 /** 2078 * Constructs a uniform_real object. 2079 * 2080 * @param __min [IN] The lower bound of the distribution. 2081 * @param __max [IN] The upper bound of the distribution. 2082 */ 2083 explicit 2084 uniform_real(_RealType __min = _RealType(0), 2085 _RealType __max = _RealType(1)) 2086 : _M_min(__min), _M_max(__max) 2087 { 2088 _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max); 2089 } 2090 2091 result_type 2092 min() const 2093 { return _M_min; } 2094 2095 result_type 2096 max() const 2097 { return _M_max; } 2098 2099 void 2100 reset() { } 2101 2102 template<class _UniformRandomNumberGenerator> 2103 result_type 2104 operator()(_UniformRandomNumberGenerator& __urng) 2105 { return (__urng() * (_M_max - _M_min)) + _M_min; } 2106 2107 /** 2108 * Inserts a %uniform_real random number distribution @p __x into the 2109 * output stream @p __os. 2110 * 2111 * @param __os An output stream. 2112 * @param __x A %uniform_real random number distribution. 2113 * 2114 * @returns The output stream with the state of @p __x inserted or in 2115 * an error state. 2116 */ 2117 template<typename _RealType1, typename _CharT, typename _Traits> 2118 friend std::basic_ostream<_CharT, _Traits>& 2119 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2120 const uniform_real<_RealType1>& __x); 2121 2122 /** 2123 * Extracts a %uniform_real random number distribution 2124 * @p __x from the input stream @p __is. 2125 * 2126 * @param __is An input stream. 2127 * @param __x A %uniform_real random number generator engine. 2128 * 2129 * @returns The input stream with @p __x extracted or in an error state. 2130 */ 2131 template<typename _RealType1, typename _CharT, typename _Traits> 2132 friend std::basic_istream<_CharT, _Traits>& 2133 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2134 uniform_real<_RealType1>& __x); 2135 2136 private: 2137 _RealType _M_min; 2138 _RealType _M_max; 2139 }; 2140 2141 2142 /** 2143 * @brief An exponential continuous distribution for random numbers. 2144 * 2145 * The formula for the exponential probability mass function is 2146 * @f$ p(x) = \lambda e^{-\lambda x} @f$. 2147 * 2148 * <table border=1 cellpadding=10 cellspacing=0> 2149 * <caption align=top>Distribution Statistics</caption> 2150 * <tr><td>Mean</td><td>@f$ \frac{1}{\lambda} @f$</td></tr> 2151 * <tr><td>Median</td><td>@f$ \frac{\ln 2}{\lambda} @f$</td></tr> 2152 * <tr><td>Mode</td><td>@f$ zero @f$</td></tr> 2153 * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr> 2154 * <tr><td>Standard Deviation</td><td>@f$ \frac{1}{\lambda} @f$</td></tr> 2155 * </table> 2156 */ 2157 template<typename _RealType = double> 2158 class exponential_distribution 2159 { 2160 public: 2161 // types 2162 typedef _RealType input_type; 2163 typedef _RealType result_type; 2164 2165 public: 2166 /** 2167 * Constructs an exponential distribution with inverse scale parameter 2168 * @f$ \lambda @f$. 2169 */ 2170 explicit 2171 exponential_distribution(const result_type& __lambda = result_type(1)) 2172 : _M_lambda(__lambda) 2173 { 2174 _GLIBCXX_DEBUG_ASSERT(_M_lambda > 0); 2175 } 2176 2177 /** 2178 * Gets the inverse scale parameter of the distribution. 2179 */ 2180 _RealType 2181 lambda() const 2182 { return _M_lambda; } 2183 2184 /** 2185 * Resets the distribution. 2186 * 2187 * Has no effect on exponential distributions. 2188 */ 2189 void 2190 reset() { } 2191 2192 template<class _UniformRandomNumberGenerator> 2193 result_type 2194 operator()(_UniformRandomNumberGenerator& __urng) 2195 { return -std::log(__urng()) / _M_lambda; } 2196 2197 /** 2198 * Inserts a %exponential_distribution random number distribution 2199 * @p __x into the output stream @p __os. 2200 * 2201 * @param __os An output stream. 2202 * @param __x A %exponential_distribution random number distribution. 2203 * 2204 * @returns The output stream with the state of @p __x inserted or in 2205 * an error state. 2206 */ 2207 template<typename _RealType1, typename _CharT, typename _Traits> 2208 friend std::basic_ostream<_CharT, _Traits>& 2209 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2210 const exponential_distribution<_RealType1>& __x); 2211 2212 /** 2213 * Extracts a %exponential_distribution random number distribution 2214 * @p __x from the input stream @p __is. 2215 * 2216 * @param __is An input stream. 2217 * @param __x A %exponential_distribution random number 2218 * generator engine. 2219 * 2220 * @returns The input stream with @p __x extracted or in an error state. 2221 */ 2222 template<typename _CharT, typename _Traits> 2223 friend std::basic_istream<_CharT, _Traits>& 2224 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2225 exponential_distribution& __x) 2226 { return __is >> __x._M_lambda; } 2227 2228 private: 2229 result_type _M_lambda; 2230 }; 2231 2232 2233 /** 2234 * @brief A normal continuous distribution for random numbers. 2235 * 2236 * The formula for the normal probability mass function is 2237 * @f$ p(x) = \frac{1}{\sigma \sqrt{2 \pi}} 2238 * e^{- \frac{{x - mean}^ {2}}{2 \sigma ^ {2}} } @f$. 2239 */ 2240 template<typename _RealType = double> 2241 class normal_distribution 2242 { 2243 public: 2244 // types 2245 typedef _RealType input_type; 2246 typedef _RealType result_type; 2247 2248 public: 2249 /** 2250 * Constructs a normal distribution with parameters @f$ mean @f$ and 2251 * @f$ \sigma @f$. 2252 */ 2253 explicit 2254 normal_distribution(const result_type& __mean = result_type(0), 2255 const result_type& __sigma = result_type(1)) 2256 : _M_mean(__mean), _M_sigma(__sigma), _M_saved_available(false) 2257 { 2258 _GLIBCXX_DEBUG_ASSERT(_M_sigma > 0); 2259 } 2260 2261 /** 2262 * Gets the mean of the distribution. 2263 */ 2264 _RealType 2265 mean() const 2266 { return _M_mean; } 2267 2268 /** 2269 * Gets the @f$ \sigma @f$ of the distribution. 2270 */ 2271 _RealType 2272 sigma() const 2273 { return _M_sigma; } 2274 2275 /** 2276 * Resets the distribution. 2277 */ 2278 void 2279 reset() 2280 { _M_saved_available = false; } 2281 2282 template<class _UniformRandomNumberGenerator> 2283 result_type 2284 operator()(_UniformRandomNumberGenerator& __urng); 2285 2286 /** 2287 * Inserts a %normal_distribution random number distribution 2288 * @p __x into the output stream @p __os. 2289 * 2290 * @param __os An output stream. 2291 * @param __x A %normal_distribution random number distribution. 2292 * 2293 * @returns The output stream with the state of @p __x inserted or in 2294 * an error state. 2295 */ 2296 template<typename _RealType1, typename _CharT, typename _Traits> 2297 friend std::basic_ostream<_CharT, _Traits>& 2298 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2299 const normal_distribution<_RealType1>& __x); 2300 2301 /** 2302 * Extracts a %normal_distribution random number distribution 2303 * @p __x from the input stream @p __is. 2304 * 2305 * @param __is An input stream. 2306 * @param __x A %normal_distribution random number generator engine. 2307 * 2308 * @returns The input stream with @p __x extracted or in an error state. 2309 */ 2310 template<typename _RealType1, typename _CharT, typename _Traits> 2311 friend std::basic_istream<_CharT, _Traits>& 2312 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2313 normal_distribution<_RealType1>& __x); 2314 2315 private: 2316 result_type _M_mean; 2317 result_type _M_sigma; 2318 result_type _M_saved; 2319 bool _M_saved_available; 2320 }; 2321 2322 2323 /** 2324 * @brief A gamma continuous distribution for random numbers. 2325 * 2326 * The formula for the gamma probability mass function is 2327 * @f$ p(x) = \frac{1}{\Gamma(\alpha)} x^{\alpha - 1} e^{-x} @f$. 2328 */ 2329 template<typename _RealType = double> 2330 class gamma_distribution 2331 { 2332 public: 2333 // types 2334 typedef _RealType input_type; 2335 typedef _RealType result_type; 2336 2337 public: 2338 /** 2339 * Constructs a gamma distribution with parameters @f$ \alpha @f$. 2340 */ 2341 explicit 2342 gamma_distribution(const result_type& __alpha_val = result_type(1)) 2343 : _M_alpha(__alpha_val) 2344 { 2345 _GLIBCXX_DEBUG_ASSERT(_M_alpha > 0); 2346 _M_initialize(); 2347 } 2348 2349 /** 2350 * Gets the @f$ \alpha @f$ of the distribution. 2351 */ 2352 _RealType 2353 alpha() const 2354 { return _M_alpha; } 2355 2356 /** 2357 * Resets the distribution. 2358 */ 2359 void 2360 reset() { } 2361 2362 template<class _UniformRandomNumberGenerator> 2363 result_type 2364 operator()(_UniformRandomNumberGenerator& __urng); 2365 2366 /** 2367 * Inserts a %gamma_distribution random number distribution 2368 * @p __x into the output stream @p __os. 2369 * 2370 * @param __os An output stream. 2371 * @param __x A %gamma_distribution random number distribution. 2372 * 2373 * @returns The output stream with the state of @p __x inserted or in 2374 * an error state. 2375 */ 2376 template<typename _RealType1, typename _CharT, typename _Traits> 2377 friend std::basic_ostream<_CharT, _Traits>& 2378 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 2379 const gamma_distribution<_RealType1>& __x); 2380 2381 /** 2382 * Extracts a %gamma_distribution random number distribution 2383 * @p __x from the input stream @p __is. 2384 * 2385 * @param __is An input stream. 2386 * @param __x A %gamma_distribution random number generator engine. 2387 * 2388 * @returns The input stream with @p __x extracted or in an error state. 2389 */ 2390 template<typename _CharT, typename _Traits> 2391 friend std::basic_istream<_CharT, _Traits>& 2392 operator>>(std::basic_istream<_CharT, _Traits>& __is, 2393 gamma_distribution& __x) 2394 { 2395 __is >> __x._M_alpha; 2396 __x._M_initialize(); 2397 return __is; 2398 } 2399 2400 private: 2401 void 2402 _M_initialize(); 2403 2404 result_type _M_alpha; 2405 2406 // Hosts either lambda of GB or d of modified Vaduva's. 2407 result_type _M_l_d; 2408 }; 2409 2410 /* @} */ // group tr1_random_distributions_continuous 2411 /* @} */ // group tr1_random_distributions 2412 /* @} */ // group tr1_random 2413 _GLIBCXX_END_NAMESPACE_VERSION 2414 } 2415 } 2416 2417 #endif // _GLIBCXX_TR1_RANDOM_H 2418