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