1 // random number generation -*- C++ -*-
3 // Copyright (C) 2006 Free Software Foundation, Inc.
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 2, or (at your option)
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.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
30 #ifndef _STD_TR1_RANDOM
31 #define _STD_TR1_RANDOM 1
35 * This is a TR1 C++ Library header.
39 #include <bits/concept_check.h>
40 #include <bits/cpp_type_traits.h>
42 #include <debug/debug.h>
46 #include <tr1/type_traits>
51 _GLIBCXX_BEGIN_NAMESPACE(tr1)
53 // [5.1] Random number generation
56 * @addtogroup tr1_random Random Number Generation
57 * A facility for generating random numbers on selected distributions.
62 * Implementation-space details.
66 // Type selectors -- are these already implemented elsewhere?
67 template<bool, typename _TpTrue, typename _TpFalse>
70 typedef _TpTrue _Type;
73 template<typename _TpTrue, typename _TpFalse>
74 struct _Select<false, _TpTrue, _TpFalse>
76 typedef _TpFalse _Type;
80 * An adaptor class for converting the output of any Generator into
81 * the input for a specific Distribution.
83 template<typename _Generator, typename _Distribution>
86 typedef typename _Generator::result_type generated_type;
87 typedef typename _Distribution::input_type result_type;
90 _Adaptor(const _Generator& __g)
101 * Converts a value generated by the adapted random number generator into a
102 * value in the input domain for the dependent random number distribution.
104 * Because the type traits are compile time constants only the appropriate
105 * clause of the if statements will actually be emitted by the compiler.
107 template<typename _Generator, typename _Distribution>
108 typename _Adaptor<_Generator, _Distribution>::result_type
109 _Adaptor<_Generator, _Distribution>::
112 result_type __return_value = 0;
113 if (is_integral<generated_type>::value
114 && is_integral<result_type>::value)
115 __return_value = _M_g();
116 else if (is_integral<generated_type>::value
117 && !is_integral<result_type>::value)
118 __return_value = result_type(_M_g())
119 / result_type(_M_g.max() - _M_g.min() + 1);
120 else if (!is_integral<generated_type>::value
121 && !is_integral<result_type>::value)
122 __return_value = result_type(_M_g())
123 / result_type(_M_g.max() - _M_g.min());
124 return __return_value;
127 template<typename _UIntType, int __w, bool =
128 __w != std::numeric_limits<_UIntType>::digits>
130 { static const _UIntType __value = 0; };
132 template<typename _UIntType, int __w>
133 struct _Shift<_UIntType, __w, true>
134 { static const _UIntType __value = _UIntType(1) << __w; };
136 } // namespace std::tr1::_Private
140 * Produces random numbers on a given disribution function using a un uniform
141 * random number generation engine.
143 * @todo the engine_value_type needs to be studied more carefully.
145 template<typename _Generator, typename _Dist>
146 class variate_generator
148 // Concept requirements.
149 __glibcxx_class_requires(_Generator, _CopyConstructibleConcept)
150 // __glibcxx_class_requires(_Generator, _GeneratorConcept)
151 // __glibcxx_class_requires(_Dist, _GeneratorConcept)
154 typedef _Generator engine_type;
155 typedef _Private::_Adaptor<_Generator, _Dist> engine_value_type;
156 typedef _Dist distribution_type;
157 typedef typename _Dist::result_type result_type;
159 // tr1:5.1.1 table 5.1 requirement
160 typedef typename std::__enable_if<result_type,
161 is_arithmetic<result_type>::value
162 >::__type _IsValidType;
166 * Constructs a variate generator with the uniform random number
167 * generator @p __eng for the random distribution @p __dist.
169 * @throws Any exceptions which may thrown by the copy constructors of
170 * the @p _Generator or @p _Dist objects.
172 variate_generator(engine_type __eng, distribution_type __dist)
173 : _M_engine(__eng), _M_dist(__dist) { }
176 * Gets the next generated value on the distribution.
181 template<typename _Tp>
183 operator()(_Tp __value);
186 * Gets a reference to the underlying uniform random number generator
191 { return _M_engine; }
194 * Gets a const reference to the underlying uniform random number
197 const engine_value_type&
199 { return _M_engine; }
202 * Gets a reference to the underlying random distribution.
209 * Gets a const reference to the underlying random distribution.
211 const distribution_type&
216 * Gets the closed lower bound of the distribution interval.
220 { return this->distribution().min(); }
223 * Gets the closed upper bound of the distribution interval.
227 { return this->distribution().max(); }
230 engine_value_type _M_engine;
231 distribution_type _M_dist;
235 * Gets the next random value on the given distribution.
237 template<typename _Generator, typename _Dist>
238 typename variate_generator<_Generator, _Dist>::result_type
239 variate_generator<_Generator, _Dist>::
241 { return _M_dist(_M_engine); }
246 template<typename _Generator, typename _Dist>
247 template<typename _Tp>
248 typename variate_generator<_Generator, _Dist>::result_type
249 variate_generator<_Generator, _Dist>::
250 operator()(_Tp __value)
251 { return _M_dist(_M_engine, __value); }
255 * @addtogroup tr1_random_generators Random Number Generators
256 * @ingroup tr1_random
258 * These classes define objects which provide random or pseudorandom numbers,
259 * either from a discrete or a continuous interval. The random number
260 * generator supplied as a part of this library are all uniform random number
261 * generators which provide a sequence of random number uniformly distributed
264 * A number generator is a function object with an operator() that takes zero
265 * arguments and returns a number.
267 * A compliant random number generator must satisy the following requirements.
268 * <table border=1 cellpadding=10 cellspacing=0>
269 * <caption align=top>Random Number Generator Requirements</caption>
270 * <tr><td>To be documented.</td></tr>
277 * @brief A model of a linear congruential random number generator.
279 * A random number generator that produces pseudorandom numbers using the
280 * linear function @f$x_{i+1}\leftarrow(ax_{i} + c) \bmod m @f$.
282 * The template parameter @p _UIntType must be an unsigned integral type
283 * large enough to store values up to (__m-1). If the template parameter
284 * @p __m is 0, the modulus @p __m used is
285 * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
286 * parameters @p __a and @p __c must be less than @p __m.
288 * The size of the state is @f$ 1 @f$.
290 template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
291 class linear_congruential;
293 template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
294 typename _CharT, typename _Traits>
295 std::basic_ostream<_CharT, _Traits>&
296 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
297 const linear_congruential<_UIntType, __a, __c, __m>& __lcr);
299 template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
300 typename _CharT, typename _Traits>
301 std::basic_istream<_CharT, _Traits>&
302 operator>>(std::basic_istream<_CharT, _Traits>& __is,
303 linear_congruential<_UIntType, __a, __c, __m>& __lcr);
305 template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
306 class linear_congruential
308 __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept)
309 // __glibcpp_class_requires(__a < __m && __c < __m)
312 /** The type of the generated random value. */
313 typedef _UIntType result_type;
315 /** The multiplier. */
316 static const _UIntType multiplier = __a;
318 static const _UIntType increment = __c;
320 static const _UIntType modulus = __m;
323 * Constructs a %linear_congruential random number generator engine with
324 * seed @p __s. The default seed value is 1.
326 * @param __s The initial seed value.
329 linear_congruential(unsigned long __x0 = 1)
330 { this->seed(__x0); }
333 * Constructs a %linear_congruential random number generator engine
334 * seeded from the generator function @p __g.
336 * @param __g The seed generator function.
339 linear_congruential(_Gen& __g)
343 * Reseeds the %linear_congruential random number generator engine
344 * sequence to the seed @g __s.
346 * @param __s The new seed.
349 seed(unsigned long __s = 1);
352 * Reseeds the %linear_congruential random number generator engine
353 * sequence using values from the generator function @p __g.
355 * @param __g the seed generator function.
360 { seed(__g, typename is_fundamental<_Gen>::type()); }
363 * Gets the smallest possible value in the output range.
369 * Gets the largest possible value in the output range.
375 * Gets the next random number in the sequence.
381 * Compares two linear congruential random number generator objects of the
382 * same type for equality.
384 * @param __lhs A linear congruential random number generator object.
385 * @param __rhs Another linear congruential random number generator obj.
387 * @returns true if the two objects are equal, false otherwise.
390 operator==(const linear_congruential& __lhs,
391 const linear_congruential& __rhs)
392 { return __lhs._M_x == __rhs._M_x; }
395 * Compares two linear congruential random number generator objects of the
396 * same type for inequality.
398 * @param __lhs A linear congruential random number generator object.
399 * @param __rhs Another linear congruential random number generator obj.
401 * @returns true if the two objects are not equal, false otherwise.
404 operator!=(const linear_congruential& __lhs,
405 const linear_congruential& __rhs)
406 { return !(__lhs == __rhs); }
409 * Writes the textual representation of the state x(i) of x to @p __os.
411 * @param __os The output stream.
412 * @param __lcr A % linear_congruential random number generator.
415 template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
417 typename _CharT, typename _Traits>
418 friend std::basic_ostream<_CharT, _Traits>&
419 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
420 const linear_congruential<_UIntType1, __a1, __c1,
424 * Sets the state of the engine by reading its textual
425 * representation from @p __is.
427 * The textual representation must have been previously written using an
428 * output stream whose imbued locale and whose type's template
429 * specialization arguments _CharT and _Traits were the same as those of
432 * @param __is The input stream.
433 * @param __lcr A % linear_congruential random number generator.
436 template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
438 typename _CharT, typename _Traits>
439 friend std::basic_istream<_CharT, _Traits>&
440 operator>>(std::basic_istream<_CharT, _Traits>& __is,
441 linear_congruential<_UIntType1, __a1, __c1, __m1>& __lcr);
446 seed(_Gen& __g, true_type)
447 { return seed(static_cast<unsigned long>(__g)); }
451 seed(_Gen& __g, false_type);
458 * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
460 typedef linear_congruential<unsigned int, 16807, 0, 2147483647> minstd_rand0;
463 * An alternative LCR (Lehmer Generator function) .
465 typedef linear_congruential<unsigned int, 48271, 0, 2147483647> minstd_rand;
469 * A generalized feedback shift register discrete random number generator.
471 * This algorithm avoind multiplication and division and is designed to be
472 * friendly to a pipelined architecture. If the parameters are chosen
473 * correctly, this generator will produce numbers with a very long period and
474 * fairly good apparent entropy, although still not cryptographically strong.
476 * The best way to use this generator is with the predefined mt19937 class.
478 * This algorithm was originally invented by Makoto Matsumoto and
481 * @var word_size The number of bits in each element of the state vector.
482 * @var state_size The degree of recursion.
483 * @var shift_size The period parameter.
484 * @var mask_bits The separation point bit index.
485 * @var parameter_a The last row of the twist matrix.
486 * @var output_u The first right-shift tempering matrix parameter.
487 * @var output_s The first left-shift tempering matrix parameter.
488 * @var output_b The first left-shift tempering matrix mask.
489 * @var output_t The second left-shift tempering matrix parameter.
490 * @var output_c The second left-shift tempering matrix mask.
491 * @var output_l The second right-shift tempering matrix parameter.
493 template<class _UIntType, int __w, int __n, int __m, int __r,
494 _UIntType __a, int __u, int __s, _UIntType __b, int __t,
495 _UIntType __c, int __l>
496 class mersenne_twister;
498 template<class _UIntType, int __w, int __n, int __m, int __r,
499 _UIntType __a, int __u, int __s, _UIntType __b, int __t,
500 _UIntType __c, int __l,
501 typename _CharT, typename _Traits>
502 std::basic_ostream<_CharT, _Traits>&
503 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
504 const mersenne_twister<_UIntType, __w, __n, __m,
505 __r, __a, __u, __s, __b, __t, __c, __l>& __x);
507 template<class _UIntType, int __w, int __n, int __m, int __r,
508 _UIntType __a, int __u, int __s, _UIntType __b, int __t,
509 _UIntType __c, int __l,
510 typename _CharT, typename _Traits>
511 std::basic_istream<_CharT, _Traits>&
512 operator>>(std::basic_istream<_CharT, _Traits>& __is,
513 mersenne_twister<_UIntType, __w, __n, __m,
514 __r, __a, __u, __s, __b, __t, __c, __l>& __x);
516 template<class _UIntType, int __w, int __n, int __m, int __r,
517 _UIntType __a, int __u, int __s, _UIntType __b, int __t,
518 _UIntType __c, int __l>
519 class mersenne_twister
521 __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept)
525 typedef _UIntType result_type ;
528 static const int word_size = __w;
529 static const int state_size = __n;
530 static const int shift_size = __m;
531 static const int mask_bits = __r;
532 static const _UIntType parameter_a = __a;
533 static const int output_u = __u;
534 static const int output_s = __s;
535 static const _UIntType output_b = __b;
536 static const int output_t = __t;
537 static const _UIntType output_c = __c;
538 static const int output_l = __l;
540 // constructors and member function
545 mersenne_twister(unsigned long __value)
549 mersenne_twister(_Gen& __g)
557 seed(unsigned long __value);
562 { seed(__g, typename is_fundamental<_Gen>::type()); }
570 { return _Private::_Shift<_UIntType, __w>::__value - 1; }
576 * Compares two % mersenne_twister random number generator objects of
577 * the same type for equality.
579 * @param __lhs A % mersenne_twister random number generator object.
580 * @param __rhs Another % mersenne_twister random number generator
583 * @returns true if the two objects are equal, false otherwise.
586 operator==(const mersenne_twister& __lhs,
587 const mersenne_twister& __rhs)
588 { return std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x); }
591 * Compares two % mersenne_twister random number generator objects of
592 * the same type for inequality.
594 * @param __lhs A % mersenne_twister random number generator object.
595 * @param __rhs Another % mersenne_twister random number generator
598 * @returns true if the two objects are not equal, false otherwise.
601 operator!=(const mersenne_twister& __lhs,
602 const mersenne_twister& __rhs)
603 { return !(__lhs == __rhs); }
606 * Inserts the current state of a % mersenne_twister random number
607 * generator engine @p __x into the output stream @p __os.
609 * @param __os An output stream.
610 * @param __x A % mersenne_twister random number generator engine.
612 * @returns The output stream with the state of @p __x inserted or in
615 template<class _UIntType1, int __w1, int __n1, int __m1, int __r1,
616 _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1,
617 _UIntType1 __c1, int __l1,
618 typename _CharT, typename _Traits>
619 friend std::basic_ostream<_CharT, _Traits>&
620 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
621 const mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1,
622 __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x);
625 * Extracts the current state of a % mersenne_twister random number
626 * generator engine @p __x from the input stream @p __is.
628 * @param __is An input stream.
629 * @param __x A % mersenne_twister random number generator engine.
631 * @returns The input stream with the state of @p __x extracted or in
634 template<class _UIntType1, int __w1, int __n1, int __m1, int __r1,
635 _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1,
636 _UIntType1 __c1, int __l1,
637 typename _CharT, typename _Traits>
638 friend std::basic_istream<_CharT, _Traits>&
639 operator>>(std::basic_istream<_CharT, _Traits>& __is,
640 mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1,
641 __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x);
646 seed(_Gen& __g, true_type)
647 { return seed(static_cast<unsigned long>(__g)); }
651 seed(_Gen& __g, false_type);
654 _UIntType _M_x[state_size];
659 * The classic Mersenne Twister.
662 * M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally
663 * Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions
664 * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
666 typedef mersenne_twister<
667 unsigned long, 32, 624, 397, 31,
675 * @brief The Marsaglia-Zaman generator.
677 * This is a model of a Generalized Fibonacci discrete random number
678 * generator, sometimes referred to as the SWC generator.
680 * A discrete random number generator that produces pseudorandom numbers using
681 * @f$x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m @f$.
683 * The size of the state is @f$ r @f$
684 * and the maximum period of the generator is @f$ m^r - m^s -1 @f$.
686 * N1688[4.13] says "the template parameter _IntType shall denote an integral
687 * type large enough to store values up to m."
690 * @var _M_x The state of te generator. This is a ring buffer.
691 * @var _M_carry The carry.
692 * @var _M_p Current index of x(i - r).
695 template<typename _IntType, _IntType __m, int __s, int __r>
696 class subtract_with_carry;
698 template<typename _IntType, _IntType __m, int __s, int __r,
699 typename _CharT, typename _Traits>
700 std::basic_ostream<_CharT, _Traits>&
701 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
702 const subtract_with_carry<_IntType, __m, __s, __r>& __x);
704 template<typename _IntType, _IntType __m, int __s, int __r,
705 typename _CharT, typename _Traits>
706 std::basic_istream<_CharT, _Traits>&
707 operator>>(std::basic_istream<_CharT, _Traits>& __is,
708 subtract_with_carry<_IntType, __m, __s, __r>& __x);
710 template<typename _IntType, _IntType __m, int __s, int __r>
711 class subtract_with_carry
713 __glibcxx_class_requires(_IntType, _IntegerConcept)
716 /** The type of the generated random value. */
717 typedef _IntType result_type;
720 static const _IntType modulus = __m;
721 static const int long_lag = __r;
722 static const int short_lag = __s;
726 * Constructs a default-initialized % subtract_with_carry random number
729 subtract_with_carry()
733 * Constructs an explicitly seeded % subtract_with_carry random number
737 subtract_with_carry(unsigned long __value)
738 { this->seed(__value); }
741 * Constructs a % subtract_with_carry random number generator seeded from
742 * the PAD iterated by [__first, last).
745 subtract_with_carry(_Gen& __g)
749 * Seeds the initial state @f$ x_0 @f$ of the random number generator.
751 * @note This implementation follows the tr1 specification but will
752 * obviously not work correctly on all platforms, since it has hardcoded
753 * values that may overflow ints on some platforms.
755 * N1688[4.19] modifies this as follows.
756 * If @p __value == 0, sets value to 19780503. In any case, with a linear
757 * congruential generator lcg(i) having parameters @f$ m_{lcg} =
758 * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value @f$, sets
759 * @f$ x_{-r} \dots x_{-1} @f$ to
760 * @f$ lcg(1) \bmod m \dots lcg(r) \bmod m @f$ respectively.
761 * If @f$ x_{-1} = 0 @f$ set carry to 1, otherwise sets carry to 0.
764 seed(unsigned long __value = 19780503);
767 * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry
768 * random number generator.
773 { seed(__g, typename is_fundamental<_Gen>::type()); }
776 * Gets the inclusive minimum value of the range of random integers
777 * returned by this generator.
784 * Gets the inclusive maximum value of the range of random integers
785 * returned by this generator.
789 { return this->modulus - 1; }
792 * Gets the next random number in the sequence.
798 * Compares two % subtract_with_carry random number generator objects of
799 * the same type for equality.
801 * @param __lhs A % subtract_with_carry random number generator object.
802 * @param __rhs Another % subtract_with_carry random number generator
805 * @returns true if the two objects are equal, false otherwise.
808 operator==(const subtract_with_carry& __lhs,
809 const subtract_with_carry& __rhs)
810 { return std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x); }
813 * Compares two % subtract_with_carry random number generator objects of
814 * the same type for inequality.
816 * @param __lhs A % subtract_with_carry random number generator object.
817 * @param __rhs Another % subtract_with_carry random number generator
820 * @returns true if the two objects are not equal, false otherwise.
823 operator!=(const subtract_with_carry& __lhs,
824 const subtract_with_carry& __rhs)
825 { return !(__lhs == __rhs); }
828 * Inserts the current state of a % subtract_with_carry random number
829 * generator engine @p __x into the output stream @p __os.
831 * @param __os An output stream.
832 * @param __x A % subtract_with_carry random number generator engine.
834 * @returns The output stream with the state of @p __x inserted or in
837 template<typename _IntType1, _IntType1 __m1, int __s1, int __r1,
838 typename _CharT, typename _Traits>
839 friend std::basic_ostream<_CharT, _Traits>&
840 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
841 const subtract_with_carry<_IntType1, __m1, __s1,
845 * Extracts the current state of a % subtract_with_carry random number
846 * generator engine @p __x from the input stream @p __is.
848 * @param __is An input stream.
849 * @param __x A % subtract_with_carry random number generator engine.
851 * @returns The input stream with the state of @p __x extracted or in
854 template<typename _IntType1, _IntType1 __m1, int __s1, int __r1,
855 typename _CharT, typename _Traits>
856 friend std::basic_istream<_CharT, _Traits>&
857 operator>>(std::basic_istream<_CharT, _Traits>& __is,
858 subtract_with_carry<_IntType1, __m1, __s1, __r1>& __x);
863 seed(_Gen& __g, true_type)
864 { return seed(static_cast<unsigned long>(__g)); }
868 seed(_Gen& __g, false_type);
872 result_type _M_x[long_lag];
873 result_type _M_carry;
878 * Produces random numbers from some base engine by discarding blocks of
881 * 0 <= @p __r <= @p __p
883 template<class _UniformRandomNumberGenerator, int __p, int __r>
886 template<class _UniformRandomNumberGenerator, int __p, int __r,
887 typename _CharT, typename _Traits>
888 std::basic_ostream<_CharT, _Traits>&
889 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
890 const discard_block<_UniformRandomNumberGenerator,
893 template<class _UniformRandomNumberGenerator, int __p, int __r,
894 typename _CharT, typename _Traits>
895 std::basic_istream<_CharT, _Traits>&
896 operator>>(std::basic_istream<_CharT, _Traits>& __is,
897 discard_block<_UniformRandomNumberGenerator, __p, __r>& __x);
899 template<class _UniformRandomNumberGenerator, int __p, int __r>
902 // __glibcxx_class_requires(typename base_type::result_type,
903 // ArithmeticTypeConcept)
906 /** The type of the underlying generator engine. */
907 typedef _UniformRandomNumberGenerator base_type;
908 /** The type of the generated random value. */
909 typedef typename base_type::result_type result_type;
912 static const int block_size = __p;
913 static const int used_block = __r;
916 * Constructs a default %discard_block engine.
918 * The underlying engine is default constructed as well.
924 * Copy constructs a %discard_block engine.
926 * Copies an existing base class random number geenerator.
927 * @param rng An existing (base class) engine object.
930 discard_block(const base_type& __rng)
931 : _M_b(__rng), _M_n(0) { }
934 * Seed constructs a %discard_block engine.
936 * Constructs the underlying generator engine seeded with @p __s.
937 * @param __s A seed value for the base class engine.
940 discard_block(unsigned long __s)
941 : _M_b(__s), _M_n(0) { }
944 * Generator constructs a %discard_block engine.
946 * @param __g A seed generator function.
949 discard_block(_Gen& __g)
950 : _M_b(__g), _M_n(0) { }
953 * Reseeds the %discard_block object with the default seed for the
954 * underlying base class generator engine.
963 * Reseeds the %discard_block object with the given seed generator
965 * @param __g A seed generator function.
975 * Gets a const reference to the underlying generator engine object.
982 * Gets the minimum value in the generated random number range.
986 { return _M_b.min(); }
989 * Gets the maximum value in the generated random number range.
993 { return _M_b.max(); }
996 * Gets the next value in the generated random number sequence.
1002 * Compares two %discard_block random number generator objects of
1003 * the same type for equality.
1005 * @param __lhs A %discard_block random number generator object.
1006 * @param __rhs Another %discard_block random number generator
1009 * @returns true if the two objects are equal, false otherwise.
1012 operator==(const discard_block& __lhs, const discard_block& __rhs)
1013 { return (__lhs._M_b == __rhs._M_b) && (__lhs._M_n == __rhs._M_n); }
1016 * Compares two %discard_block random number generator objects of
1017 * the same type for inequality.
1019 * @param __lhs A %discard_block random number generator object.
1020 * @param __rhs Another %discard_block random number generator
1023 * @returns true if the two objects are not equal, false otherwise.
1026 operator!=(const discard_block& __lhs, const discard_block& __rhs)
1027 { return !(__lhs == __rhs); }
1030 * Inserts the current state of a %discard_block random number
1031 * generator engine @p __x into the output stream @p __os.
1033 * @param __os An output stream.
1034 * @param __x A %discard_block random number generator engine.
1036 * @returns The output stream with the state of @p __x inserted or in
1039 template<class _UniformRandomNumberGenerator1, int __p1, int __r1,
1040 typename _CharT, typename _Traits>
1041 friend std::basic_ostream<_CharT, _Traits>&
1042 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1043 const discard_block<_UniformRandomNumberGenerator1,
1047 * Extracts the current state of a % subtract_with_carry random number
1048 * generator engine @p __x from the input stream @p __is.
1050 * @param __is An input stream.
1051 * @param __x A %discard_block random number generator engine.
1053 * @returns The input stream with the state of @p __x extracted or in
1056 template<class _UniformRandomNumberGenerator1, int __p1, int __r1,
1057 typename _CharT, typename _Traits>
1058 friend std::basic_istream<_CharT, _Traits>&
1059 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1060 discard_block<_UniformRandomNumberGenerator1,
1070 * James's luxury-level-3 integer adaptation of Luescher's generator.
1072 typedef discard_block<
1073 subtract_with_carry<int, (1 << 24), 10, 24>,
1079 * James's luxury-level-4 integer adaptation of Luescher's generator.
1081 typedef discard_block<
1082 subtract_with_carry<int, (1 << 24), 10, 24>,
1089 * A random number generator adaptor class that combines two random number
1090 * generator engines into a single output sequence.
1092 template<class _UniformRandomNumberGenerator1, int __s1,
1093 class _UniformRandomNumberGenerator2, int __s2>
1096 template<class _UniformRandomNumberGenerator1, int __s1,
1097 class _UniformRandomNumberGenerator2, int __s2,
1098 typename _CharT, typename _Traits>
1099 std::basic_ostream<_CharT, _Traits>&
1100 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1101 const xor_combine<_UniformRandomNumberGenerator1, __s1,
1102 _UniformRandomNumberGenerator2, __s2>& __x);
1104 template<class _UniformRandomNumberGenerator1, int __s1,
1105 class _UniformRandomNumberGenerator2, int __s2,
1106 typename _CharT, typename _Traits>
1107 std::basic_istream<_CharT, _Traits>&
1108 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1109 xor_combine<_UniformRandomNumberGenerator1, __s1,
1110 _UniformRandomNumberGenerator2, __s2>& __x);
1112 template<class _UniformRandomNumberGenerator1, int __s1,
1113 class _UniformRandomNumberGenerator2, int __s2>
1116 // __glibcxx_class_requires(typename _UniformRandomNumberGenerator1::
1117 // result_type, ArithmeticTypeConcept)
1118 // __glibcxx_class_requires(typename _UniformRandomNumberGenerator2::
1119 // result_type, ArithmeticTypeConcept)
1122 /** The type of the the first underlying generator engine. */
1123 typedef _UniformRandomNumberGenerator1 base1_type;
1124 /** The type of the the second underlying generator engine. */
1125 typedef _UniformRandomNumberGenerator2 base2_type;
1128 typedef typename base1_type::result_type _Result_type1;
1129 typedef typename base2_type::result_type _Result_type2;
1132 /** The type of the generated random value. */
1133 typedef typename _Private::_Select<
1134 (sizeof(_Result_type1) > sizeof(_Result_type2)),
1135 _Result_type1, _Result_type2>::_Type result_type;
1138 static const int shift1 = __s1;
1139 static const int shift2 = __s2;
1141 // constructors and member function
1144 xor_combine(const base1_type& __rng1, const base2_type& __rng2)
1145 : _M_b1(__rng1), _M_b2(__rng2) { }
1147 xor_combine(unsigned long __s)
1148 : _M_b1(__s), _M_b2(__s + 1) { }
1150 template<class _Gen>
1151 xor_combine(_Gen& __g)
1152 : _M_b1(__g), _M_b2(__g) { }
1161 template<class _Gen>
1179 { return _M_b1.min() ^ _M_b2.min(); }
1183 { return _M_b1.max() | _M_b2.max(); }
1186 * Gets the next random number in the sequence.
1190 { return ((_M_b1() << shift1) ^ (_M_b2() << shift2)); }
1193 * Compares two %xor_combine random number generator objects of
1194 * the same type for equality.
1196 * @param __lhs A %xor_combine random number generator object.
1197 * @param __rhs Another %xor_combine random number generator
1200 * @returns true if the two objects are equal, false otherwise.
1203 operator==(const xor_combine& __lhs, const xor_combine& __rhs)
1205 return (__lhs.base1() == __rhs.base1())
1206 && (__lhs.base2() == __rhs.base2());
1210 * Compares two %xor_combine random number generator objects of
1211 * the same type for inequality.
1213 * @param __lhs A %xor_combine random number generator object.
1214 * @param __rhs Another %xor_combine random number generator
1217 * @returns true if the two objects are not equal, false otherwise.
1220 operator!=(const xor_combine& __lhs, const xor_combine& __rhs)
1221 { return !(__lhs == __rhs); }
1224 * Inserts the current state of a %xor_combine random number
1225 * generator engine @p __x into the output stream @p __os.
1227 * @param __os An output stream.
1228 * @param __x A %xor_combine random number generator engine.
1230 * @returns The output stream with the state of @p __x inserted or in
1233 template<class _UniformRandomNumberGenerator11, int __s11,
1234 class _UniformRandomNumberGenerator21, int __s21,
1235 typename _CharT, typename _Traits>
1236 friend std::basic_ostream<_CharT, _Traits>&
1237 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1238 const xor_combine<_UniformRandomNumberGenerator11, __s11,
1239 _UniformRandomNumberGenerator21, __s21>& __x);
1242 * Extracts the current state of a %xor_combine random number
1243 * generator engine @p __x from the input stream @p __is.
1245 * @param __is An input stream.
1246 * @param __x A %xor_combine random number generator engine.
1248 * @returns The input stream with the state of @p __x extracted or in
1251 template<class _UniformRandomNumberGenerator11, int __s11,
1252 class _UniformRandomNumberGenerator21, int __s21,
1253 typename _CharT, typename _Traits>
1254 friend std::basic_istream<_CharT, _Traits>&
1255 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1256 xor_combine<_UniformRandomNumberGenerator11, __s11,
1257 _UniformRandomNumberGenerator21, __s21>& __x);
1266 * A standard interface to a platform-specific non-deterministic random number
1267 * generator (if any are available).
1273 typedef unsigned int result_type;
1275 // constructors, destructors and member functions
1277 #ifdef _GLIBCXX_USE_RANDOM_TR1
1280 random_device(const std::string& __token = "/dev/urandom")
1282 if ((__token != "/dev/urandom" && __token != "/dev/random")
1283 || !_M_filebuf.open(__token.c_str(),
1284 std::ios_base::in | std::ios_base::binary))
1285 std::__throw_runtime_error(__N("random_device::"
1286 "random_device(const std::string&)"));
1290 { _M_filebuf.close(); }
1295 random_device(const std::string& __token = "mt19937")
1296 : _M_mt(_M_strtoul(__token)) { }
1299 static unsigned long
1300 _M_strtoul(const std::string& __str)
1302 unsigned long __ret = 5489UL;
1303 if (__str != "mt19937")
1305 const char* __nptr = __str.c_str();
1307 __ret = std::strtoul(__nptr, &__endptr, 0);
1308 if (*__nptr == '\0' || *__endptr != '\0')
1309 std::__throw_runtime_error(__N("random_device::_M_strtoul"
1310 "(const std::string&)"));
1321 { return std::numeric_limits<result_type>::min(); }
1325 { return std::numeric_limits<result_type>::max(); }
1334 #ifdef _GLIBCXX_USE_RANDOM_TR1
1336 _M_filebuf.sgetn(reinterpret_cast<char*>(&__ret), sizeof(result_type));
1344 random_device(const random_device&);
1345 void operator=(const random_device&);
1347 #ifdef _GLIBCXX_USE_RANDOM_TR1
1348 std::filebuf _M_filebuf;
1354 /* @} */ // group tr1_random_generators
1357 * @addtogroup tr1_random_distributions Random Number Distributions
1358 * @ingroup tr1_random
1363 * @addtogroup tr1_random_distributions_discrete Discrete Distributions
1364 * @ingroup tr1_random_distributions
1369 * @brief Uniform discrete distribution for random numbers.
1370 * A discrete random distribution on the range @f$[min, max]@f$ with equal
1371 * probability throughout the range.
1373 template<typename _IntType = int>
1376 template<typename _IntType, typename _CharT, typename _Traits>
1377 std::basic_ostream<_CharT, _Traits>&
1378 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1379 const uniform_int<_IntType>& __x);
1381 template<typename _IntType, typename _CharT, typename _Traits>
1382 std::basic_istream<_CharT, _Traits>&
1383 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1384 uniform_int<_IntType>& __x);
1386 template<typename _IntType>
1389 __glibcxx_class_requires(_IntType, _IntegerConcept)
1392 /** The type of the parameters of the distribution. */
1393 typedef _IntType input_type;
1394 /** The type of the range of the distribution. */
1395 typedef _IntType result_type;
1399 * Constructs a uniform distribution object.
1402 uniform_int(_IntType __min = 0, _IntType __max = 9)
1403 : _M_min(__min), _M_max(__max)
1405 _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max);
1409 * Gets the inclusive lower bound of the distribution range.
1416 * Gets the inclusive upper bound of the distribution range.
1423 * Resets the distribution state.
1425 * Does nothing for the uniform integer distribution.
1431 * Gets a uniformly distributed random number in the range
1434 template<typename _UniformRandomNumberGenerator>
1436 operator()(_UniformRandomNumberGenerator& __urng)
1437 { return (__urng() % (_M_max - _M_min + 1)) + _M_min; }
1440 * Gets a uniform random number in the range @f$[0, n)@f$.
1442 * This function is aimed at use with std::random_shuffle.
1444 template<typename _UniformRandomNumberGenerator>
1446 operator()(_UniformRandomNumberGenerator& __urng, result_type __n)
1447 { return __urng() % __n; }
1450 * Inserts a %uniform_int random number distribution @p __x into the
1451 * output stream @p os.
1453 * @param __os An output stream.
1454 * @param __x A %uniform_int random number distribution.
1456 * @returns The output stream with the state of @p __x inserted or in
1459 template<typename _IntType1, typename _CharT, typename _Traits>
1460 friend std::basic_ostream<_CharT, _Traits>&
1461 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1462 const uniform_int<_IntType1>& __x);
1465 * Extracts a %unform_int random number distribution
1466 * @p __x from the input stream @p __is.
1468 * @param __is An input stream.
1469 * @param __x A %uniform_int random number generator engine.
1471 * @returns The input stream with @p __x extracted or in an error state.
1473 template<typename _IntType1, typename _CharT, typename _Traits>
1474 friend std::basic_istream<_CharT, _Traits>&
1475 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1476 uniform_int<_IntType1>& __x);
1485 * @brief A Bernoulli random number distribution.
1487 * Generates a sequence of true and false values with likelihood @f$ p @f$
1488 * that true will come up and @f$ (1 - p) @f$ that false will appear.
1490 class bernoulli_distribution;
1492 template<typename _CharT, typename _Traits>
1493 std::basic_ostream<_CharT, _Traits>&
1494 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1495 const bernoulli_distribution& __x);
1497 class bernoulli_distribution
1500 typedef int input_type;
1501 typedef bool result_type;
1505 * Constructs a Bernoulli distribution with likelihood @p p.
1507 * @param __p [IN] The likelihood of a true result being returned. Must
1508 * be in the interval @f$ [0, 1] @f$.
1511 bernoulli_distribution(double __p = 0.5)
1514 _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
1518 * Gets the @p p parameter of the distribution.
1525 * Resets the distribution state.
1527 * Does nothing for a bernoulli distribution.
1533 * Gets the next value in the Bernoullian sequence.
1535 template<class UniformRandomNumberGenerator>
1537 operator()(UniformRandomNumberGenerator& __urng)
1539 if (__urng() < _M_p)
1545 * Inserts a %bernoulli_distribution random number distribution
1546 * @p __x into the output stream @p __os.
1548 * @param __os An output stream.
1549 * @param __x A %bernoulli_distribution random number distribution.
1551 * @returns The output stream with the state of @p __x inserted or in
1554 template<typename _CharT, typename _Traits>
1555 friend std::basic_ostream<_CharT, _Traits>&
1556 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1557 const bernoulli_distribution& __x);
1560 * Extracts a %bernoulli_distribution random number distribution
1561 * @p __x from the input stream @p __is.
1563 * @param __is An input stream.
1564 * @param __x A %bernoulli_distribution random number generator engine.
1566 * @returns The input stream with @p __x extracted or in an error state.
1568 template<typename _CharT, typename _Traits>
1569 friend std::basic_istream<_CharT, _Traits>&
1570 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1571 bernoulli_distribution& __x)
1572 { return __is >> __x._M_p; }
1580 * @brief A discrete geometric random number distribution.
1582 * The formula for the geometric probability mass function is
1583 * @f$ p(i) = (1 - p)p^{i-1} @f$ where @f$ p @f$ is the parameter of the
1586 template<typename _IntType = int, typename _RealType = double>
1587 class geometric_distribution;
1589 template<typename _IntType, typename _RealType,
1590 typename _CharT, typename _Traits>
1591 std::basic_ostream<_CharT, _Traits>&
1592 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1593 const geometric_distribution<_IntType, _RealType>& __x);
1595 template<typename _IntType, typename _RealType>
1596 class geometric_distribution
1600 typedef _RealType input_type;
1601 typedef _IntType result_type;
1603 // constructors and member function
1606 geometric_distribution(const _RealType& __p = _RealType(0.5))
1607 : _M_p(__p), _M_log_p(std::log(_M_p))
1609 _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
1613 * Gets the distribution parameter @p p.
1622 template<class _UniformRandomNumberGenerator>
1624 operator()(_UniformRandomNumberGenerator& __urng)
1625 { return result_type(std::ceil(std::log(__urng()) / _M_log_p)); }
1628 * Inserts a %geometric_distribution random number distribution
1629 * @p __x into the output stream @p __os.
1631 * @param __os An output stream.
1632 * @param __x A %geometric_distribution random number distribution.
1634 * @returns The output stream with the state of @p __x inserted or in
1637 template<typename _IntType1, typename _RealType1,
1638 typename _CharT, typename _Traits>
1639 friend std::basic_ostream<_CharT, _Traits>&
1640 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1641 const geometric_distribution<_IntType1, _RealType1>& __x);
1644 * Extracts a %geometric_distribution random number distribution
1645 * @p __x from the input stream @p __is.
1647 * @param __is An input stream.
1648 * @param __x A %geometric_distribution random number generator engine.
1650 * @returns The input stream with @p __x extracted or in an error state.
1652 template<typename _CharT, typename _Traits>
1653 friend std::basic_istream<_CharT, _Traits>&
1654 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1655 geometric_distribution& __x)
1658 __x._M_log_p = std::log(__x._M_p);
1667 /* @} */ // group tr1_random_distributions_discrete
1670 * @addtogroup tr1_random_distributions_continuous Continuous Distributions
1671 * @ingroup tr1_random_distributions
1676 * @brief Uniform continuous distribution for random numbers.
1678 * A continuous random distribution on the range [min, max) with equal
1679 * probability throughout the range. The URNG should be real-valued and
1680 * deliver number in the range [0, 1).
1682 template<typename _RealType = double>
1685 template<typename _RealType, typename _CharT, typename _Traits>
1686 std::basic_ostream<_CharT, _Traits>&
1687 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1688 const uniform_real<_RealType>& __x);
1690 template<typename _RealType, typename _CharT, typename _Traits>
1691 std::basic_istream<_CharT, _Traits>&
1692 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1693 uniform_real<_RealType>& __x);
1695 template<typename _RealType>
1700 typedef _RealType input_type;
1701 typedef _RealType result_type;
1705 * Constructs a uniform_real object.
1707 * @param __min [IN] The lower bound of the distribution.
1708 * @param __max [IN] The upper bound of the distribution.
1711 uniform_real(_RealType __min = _RealType(0),
1712 _RealType __max = _RealType(1))
1713 : _M_min(__min), _M_max(__max)
1715 _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max);
1729 template<class _UniformRandomNumberGenerator>
1731 operator()(_UniformRandomNumberGenerator& __urng)
1732 { return (__urng() * (_M_max - _M_min)) + _M_min; }
1735 * Inserts a %uniform_real random number distribution @p __x into the
1736 * output stream @p __os.
1738 * @param __os An output stream.
1739 * @param __x A %uniform_real random number distribution.
1741 * @returns The output stream with the state of @p __x inserted or in
1744 template<typename _RealType1, typename _CharT, typename _Traits>
1745 friend std::basic_ostream<_CharT, _Traits>&
1746 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1747 const uniform_real<_RealType1>& __x);
1750 * Extracts a %unform_real random number distribution
1751 * @p __x from the input stream @p __is.
1753 * @param __is An input stream.
1754 * @param __x A %uniform_real random number generator engine.
1756 * @returns The input stream with @p __x extracted or in an error state.
1758 template<typename _RealType1, typename _CharT, typename _Traits>
1759 friend std::basic_istream<_CharT, _Traits>&
1760 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1761 uniform_real<_RealType1>& __x);
1770 * @brief An exponential continuous distribution for random numbers.
1772 * The formula for the exponential probability mass function is
1773 * @f$ p(x) = \lambda e^{-\lambda x} @f$.
1775 * <table border=1 cellpadding=10 cellspacing=0>
1776 * <caption align=top>Distribution Statistics</caption>
1777 * <tr><td>Mean</td><td>@f$ \frac{1}{\lambda} @f$</td></tr>
1778 * <tr><td>Median</td><td>@f$ \frac{\ln 2}{\lambda} @f$</td></tr>
1779 * <tr><td>Mode</td><td>@f$ zero @f$</td></tr>
1780 * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
1781 * <tr><td>Standard Deviation</td><td>@f$ \frac{1}{\lambda} @f$</td></tr>
1784 template<typename _RealType = double>
1785 class exponential_distribution;
1787 template<typename _RealType, typename _CharT, typename _Traits>
1788 std::basic_ostream<_CharT, _Traits>&
1789 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1790 const exponential_distribution<_RealType>& __x);
1792 template<typename _RealType>
1793 class exponential_distribution
1797 typedef _RealType input_type;
1798 typedef _RealType result_type;
1802 * Constructs an exponential distribution with inverse scale parameter
1806 exponential_distribution(const result_type& __lambda = result_type(1))
1807 : _M_lambda(__lambda)
1809 _GLIBCXX_DEBUG_ASSERT(_M_lambda > 0);
1813 * Gets the inverse scale parameter of the distribution.
1817 { return _M_lambda; }
1820 * Resets the distribution.
1822 * Has no effect on exponential distributions.
1827 template<class _UniformRandomNumberGenerator>
1829 operator()(_UniformRandomNumberGenerator& __urng)
1830 { return -std::log(__urng()) / _M_lambda; }
1833 * Inserts a %exponential_distribution random number distribution
1834 * @p __x into the output stream @p __os.
1836 * @param __os An output stream.
1837 * @param __x A %exponential_distribution random number distribution.
1839 * @returns The output stream with the state of @p __x inserted or in
1842 template<typename _RealType1, typename _CharT, typename _Traits>
1843 friend std::basic_ostream<_CharT, _Traits>&
1844 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1845 const exponential_distribution<_RealType1>& __x);
1848 * Extracts a %exponential_distribution random number distribution
1849 * @p __x from the input stream @p __is.
1851 * @param __is An input stream.
1852 * @param __x A %exponential_distribution random number generator engine.
1854 * @returns The input stream with @p __x extracted or in an error state.
1856 template<typename _CharT, typename _Traits>
1857 friend std::basic_istream<_CharT, _Traits>&
1858 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1859 exponential_distribution& __x)
1860 { return __is >> __x._M_lambda; }
1863 result_type _M_lambda;
1868 * @brief A normal continuous distribution for random numbers.
1870 * The formula for the normal probability mass function is
1871 * @f$ p(x) = \frac{1}{\sigma \sqrt{2 \pi}}
1872 * e^{- \frac{{x - mean}^ {2}}{2 \sigma ^ {2}} } @f$.
1874 template<typename _RealType = double>
1875 class normal_distribution;
1877 template<typename _RealType, typename _CharT, typename _Traits>
1878 std::basic_ostream<_CharT, _Traits>&
1879 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1880 const normal_distribution<_RealType>& __x);
1882 template<typename _RealType, typename _CharT, typename _Traits>
1883 std::basic_istream<_CharT, _Traits>&
1884 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1885 normal_distribution<_RealType>& __x);
1887 template<typename _RealType>
1888 class normal_distribution
1892 typedef _RealType input_type;
1893 typedef _RealType result_type;
1897 * Constructs a normal distribution with parameters @f$ mean @f$ and
1901 normal_distribution(const result_type& __mean = result_type(0),
1902 const result_type& __sigma = result_type(1))
1903 : _M_mean(__mean), _M_sigma(__sigma), _M_saved_available(false)
1905 _GLIBCXX_DEBUG_ASSERT(_M_sigma > 0);
1909 * Gets the mean of the distribution.
1916 * Gets the @f$ \sigma @f$ of the distribution.
1920 { return _M_sigma; }
1923 * Resets the distribution.
1927 { _M_saved_available = false; }
1929 template<class _UniformRandomNumberGenerator>
1931 operator()(_UniformRandomNumberGenerator& __urng);
1934 * Inserts a %normal_distribution random number distribution
1935 * @p __x into the output stream @p __os.
1937 * @param __os An output stream.
1938 * @param __x A %normal_distribution random number distribution.
1940 * @returns The output stream with the state of @p __x inserted or in
1943 template<typename _RealType1, typename _CharT, typename _Traits>
1944 friend std::basic_ostream<_CharT, _Traits>&
1945 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1946 const normal_distribution<_RealType1>& __x);
1949 * Extracts a %normal_distribution random number distribution
1950 * @p __x from the input stream @p __is.
1952 * @param __is An input stream.
1953 * @param __x A %normal_distribution random number generator engine.
1955 * @returns The input stream with @p __x extracted or in an error state.
1957 template<typename _RealType1, typename _CharT, typename _Traits>
1958 friend std::basic_istream<_CharT, _Traits>&
1959 operator>>(std::basic_istream<_CharT, _Traits>& __is,
1960 normal_distribution<_RealType1>& __x);
1963 result_type _M_mean;
1964 result_type _M_sigma;
1965 result_type _M_saved;
1966 bool _M_saved_available;
1969 /* @} */ // group tr1_random_distributions_continuous
1970 /* @} */ // group tr1_random_distributions
1971 /* @} */ // group tr1_random
1973 _GLIBCXX_END_NAMESPACE
1976 #include <tr1/random.tcc>
1978 #endif // _STD_TR1_RANDOM