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