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
36namespace 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