111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// random number generation -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2009-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @file bits/random.h
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{random}
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _RANDOM_H
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _RANDOM_H 1
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <vector>
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // [26.4] Random number generation
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @defgroup random Random Number Generation
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup numerics
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A facility for generating random numbers on selected distributions.
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A function template for converting the output of a (integral)
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * uniform random number generator to a floatng point result in the range
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * [0-1).
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, size_t __bits,
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _UniformRandomNumberGenerator>
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _RealType
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    generate_canonical(_UniformRandomNumberGenerator& __g);
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /*
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Implementation-space details.
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  namespace __detail
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _GLIBCXX_BEGIN_NAMESPACE_VERSION
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _UIntType, size_t __w,
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     bool = __w < static_cast<size_t>
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			  (std::numeric_limits<_UIntType>::digits)>
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Shift
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { static const _UIntType __value = 0; };
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _UIntType, size_t __w>
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Shift<_UIntType, __w, true>
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { static const _UIntType __value = _UIntType(1) << __w; };
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<int __s,
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     int __which = ((__s <= __CHAR_BIT__ * sizeof (int))
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    + (__s <= __CHAR_BIT__ * sizeof (long))
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    + (__s <= __CHAR_BIT__ * sizeof (long long))
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    /* assume long long no bigger than __int128 */
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    + (__s <= 128))>
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Select_uint_least_t
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static_assert(__which < 0, /* needs to be dependent */
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      "sorry, would be too much trouble for a slow result");
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<int __s>
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Select_uint_least_t<__s, 4>
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { typedef unsigned int type; };
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<int __s>
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Select_uint_least_t<__s, 3>
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { typedef unsigned long type; };
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<int __s>
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Select_uint_least_t<__s, 2>
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { typedef unsigned long long type; };
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_INT128
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<int __s>
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Select_uint_least_t<__s, 1>
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { typedef unsigned __int128 type; };
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Assume a != 0, a < m, c < m, x < m.
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Tp, _Tp __m, _Tp __a, _Tp __c,
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     bool __big_enough = (!(__m & (__m - 1))
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				  || (_Tp(-1) - __c) / __a >= __m - 1),
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             bool __schrage_ok = __m % __a < __m / __a>
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Mod
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef typename _Select_uint_least_t<std::__lg(__a)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					      + std::__lg(__m) + 2>::type _Tp2;
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static _Tp
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__calc(_Tp __x)
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return static_cast<_Tp>((_Tp2(__a) * __x + __c) % __m); }
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Schrage.
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Tp, _Tp __m, _Tp __a, _Tp __c>
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Mod<_Tp, __m, __a, __c, false, true>
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static _Tp
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__calc(_Tp __x);
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Special cases:
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // - for m == 2^n or m == 0, unsigned integer overflow is safe.
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // - a * (m - 1) + c fits in _Tp, there is no overflow.
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool __s>
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Mod<_Tp, __m, __a, __c, true, __s>
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static _Tp
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__calc(_Tp __x)
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _Tp __res = __a * __x + __c;
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (__m)
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __res %= __m;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return __res;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Tp, _Tp __m, _Tp __a = 1, _Tp __c = 0>
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      inline _Tp
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __mod(_Tp __x)
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _Mod<_Tp, __m, __a, __c>::__calc(__x); }
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /* Determine whether number is a power of 2.  */
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Tp>
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      inline bool
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Power_of_2(_Tp __x)
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return ((__x - 1) & __x) == 0;
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /*
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * An adaptor class for converting the output of any Generator into
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * the input for a specific Distribution.
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _Engine, typename _DInputType>
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Adaptor
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static_assert(std::is_floating_point<_DInputType>::value,
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      "template argument not a floating point type");
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      public:
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_Adaptor(_Engine& __g)
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_g(__g) { }
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_DInputType
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	min() const
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _DInputType(0); }
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_DInputType
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	max() const
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _DInputType(1); }
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/*
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 * Converts a value generated by the adapted random number generator
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 * into a value in the input domain for the dependent random number
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 * distribution.
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 */
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_DInputType
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()()
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return std::generate_canonical<_DInputType,
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	                            std::numeric_limits<_DInputType>::digits,
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	                            _Engine>(_M_g);
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_Engine& _M_g;
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _GLIBCXX_END_NAMESPACE_VERSION
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } // namespace __detail
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_generators Random Number Generators
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * These classes define objects which provide random or pseudorandom
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * numbers, either from a discrete or a continuous interval.  The
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * random number generator supplied as a part of this library are
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * all uniform random number generators which provide a sequence of
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * random number uniformly distributed over their range.
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A number generator is a function object with an operator() that
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * takes zero arguments and returns a number.
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A compliant random number generator must satisfy the following
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * requirements.  <table border=1 cellpadding=10 cellspacing=0>
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <caption align=top>Random Number Generator Requirements</caption>
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>To be documented.</td></tr> </table>
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A model of a linear congruential random number generator.
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A random number generator that produces pseudorandom numbers via
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * linear function:
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     x_{i+1}\leftarrow(ax_{i} + c) \bmod m
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The template parameter @p _UIntType must be an unsigned integral type
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * large enough to store values up to (__m-1). If the template parameter
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __m is 0, the modulus @p __m used is
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * parameters @p __a and @p __c must be less than @p __m.
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The size of the state is @f$1@f$.
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class linear_congruential_engine
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "substituting _UIntType not an unsigned integral type");
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__m == 0u || (__a < __m && __c < __m),
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __m out of bounds");
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _UIntType result_type;
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The multiplier. */
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type multiplier   = __a;
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** An increment. */
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type increment    = __c;
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The modulus. */
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type modulus      = __m;
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type default_seed = 1u;
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a %linear_congruential_engine random number
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generator engine with seed @p __s.  The default seed value
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        is 1.
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __s The initial seed value.
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      linear_congruential_engine(result_type __s = default_seed)
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { seed(__s); }
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a %linear_congruential_engine random number
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generator engine seeded from the seed sequence @p __q.
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q the seed sequence.
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value>
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ::type>
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        linear_congruential_engine(_Sseq& __q)
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { seed(__q); }
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %linear_congruential_engine random number generator
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        engine sequence to the seed @p __s.
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __s The new seed.
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __s = default_seed);
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %linear_congruential_engine random number generator
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        engine
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * sequence using values from the seed sequence @p __q.
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q the seed sequence.
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typename std::enable_if<std::is_class<_Sseq>::value>::type
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q);
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the smallest possible value in the output range.
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * The minimum depends on the @p __c parameter: if it is zero, the
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * minimum generated must be > 0, otherwise 0 is allowed.
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __c == 0u ? 1u : 0u; }
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the largest possible value in the output range.
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __m - 1u; }
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Discard a sequence of random numbers.
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z)
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (; __z != 0ULL; --__z)
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  (*this)();
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the next random number in the sequence.
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()()
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x);
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_x;
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Compares two linear congruential random number generator
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * objects of the same type for equality.
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A linear congruential random number generator object.
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another linear congruential random number generator
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const linear_congruential_engine& __lhs,
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const linear_congruential_engine& __rhs)
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __lhs._M_x == __rhs._M_x; }
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Writes the textual representation of the state x(i) of x to
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __os.
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os  The output stream.
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lcr A % linear_congruential_engine random number generator.
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns __os.
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __m1, typename _CharT, typename _Traits>
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::linear_congruential_engine<_UIntType1,
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __a1, __c1, __m1>& __lcr);
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the state of the engine by reading its textual
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        representation from @p __is.
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * The textual representation must have been previously written using
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an output stream whose imbued locale and whose type's template
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * specialization arguments _CharT and _Traits were the same as those
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * of @p __is.
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is  The input stream.
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lcr A % linear_congruential_engine random number generator.
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns __is.
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __m1, typename _CharT, typename _Traits>
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::linear_congruential_engine<_UIntType1, __a1,
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __c1, __m1>& __lcr);
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _UIntType _M_x;
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Compares two linear congruential random number generator
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * objects of the same type for inequality.
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A linear congruential random number generator object.
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another linear congruential random number generator
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::linear_congruential_engine<_UIntType, __a,
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __c, __m>& __lhs,
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::linear_congruential_engine<_UIntType, __a,
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __c, __m>& __rhs)
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A generalized feedback shift register discrete random number generator.
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * This algorithm avoids multiplication and division and is designed to be
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * friendly to a pipelined architecture.  If the parameters are chosen
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * correctly, this generator will produce numbers with a very long period and
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * fairly good apparent entropy, although still not cryptographically strong.
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The best way to use this generator is with the predefined mt19937 class.
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * This algorithm was originally invented by Makoto Matsumoto and
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Takuji Nishimura.
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __w  Word size, the number of bits in each element of
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              the state vector.
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __n  The degree of recursion.
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __m  The period parameter.
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __r  The separation point bit index.
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __a  The last row of the twist matrix.
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __u  The first right-shift tempering matrix parameter.
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __d  The first right-shift tempering matrix mask.
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __s  The first left-shift tempering matrix parameter.
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __b  The first left-shift tempering matrix mask.
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __t  The second left-shift tempering matrix parameter.
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __c  The second left-shift tempering matrix mask.
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __l  The second right-shift tempering matrix parameter.
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @tparam __f  Initialization multiplier.
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, size_t __w,
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   size_t __n, size_t __m, size_t __r,
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __b, size_t __t,
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __c, size_t __l, _UIntType __f>
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class mersenne_twister_engine
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "substituting _UIntType not an unsigned integral type");
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(1u <= __m && __m <= __n,
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __m out of bounds");
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__r <= __w, "template argument substituting "
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__r out of bound");
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__u <= __w, "template argument substituting "
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__u out of bound");
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__s <= __w, "template argument substituting "
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__s out of bound");
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__t <= __w, "template argument substituting "
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__t out of bound");
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__l <= __w, "template argument substituting "
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__l out of bound");
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__w <= std::numeric_limits<_UIntType>::digits,
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __w out of bound");
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1),
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __a out of bound");
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1),
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __b out of bound");
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1),
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __c out of bound");
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1),
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __d out of bound");
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1),
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __f out of bound");
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _UIntType result_type;
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // parameter values
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      word_size                 = __w;
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      state_size                = __n;
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      shift_size                = __m;
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      mask_bits                 = __r;
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type xor_mask                  = __a;
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      tempering_u               = __u;
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type tempering_d               = __d;
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      tempering_s               = __s;
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type tempering_b               = __b;
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      tempering_t               = __t;
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type tempering_c               = __c;
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      tempering_l               = __l;
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type initialization_multiplier = __f;
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type default_seed = 5489u;
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // constructors and member function
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mersenne_twister_engine(result_type __sd = default_seed)
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { seed(__sd); }
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a %mersenne_twister_engine random number generator
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        engine seeded from the seed sequence @p __q.
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q the seed sequence.
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value>
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ::type>
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        mersenne_twister_engine(_Sseq& __q)
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { seed(__q); }
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __sd = default_seed);
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typename std::enable_if<std::is_class<_Sseq>::value>::type
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q);
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the smallest possible value in the output range.
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0; };
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the largest possible value in the output range.
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Discard a sequence of random numbers.
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z);
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()();
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Compares two % mersenne_twister_engine random number generator
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        objects of the same type for equality.
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A % mersenne_twister_engine random number generator
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another % mersenne_twister_engine random number
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              generator object.
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const mersenne_twister_engine& __lhs,
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const mersenne_twister_engine& __rhs)
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x)
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __lhs._M_p == __rhs._M_p); }
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts the current state of a % mersenne_twister_engine
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x into the output stream
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __os.
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A % mersenne_twister_engine random number generator
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             engine.
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1,
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       size_t __w1, size_t __n1,
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       size_t __m1, size_t __r1,
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __a1, size_t __u1,
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __d1, size_t __s1,
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __b1, size_t __t1,
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::mersenne_twister_engine<_UIntType1, __w1, __n1,
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __l1, __f1>& __x);
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts the current state of a % mersenne_twister_engine
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x from the input stream
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __is.
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A % mersenne_twister_engine random number generator
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             engine.
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with the state of @p __x extracted or in
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1,
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       size_t __w1, size_t __n1,
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       size_t __m1, size_t __r1,
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __a1, size_t __u1,
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __d1, size_t __s1,
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __b1, size_t __t1,
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1,
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __l1, __f1>& __x);
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void _M_gen_rand();
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _UIntType _M_x[state_size];
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t    _M_p;
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Compares two % mersenne_twister_engine random number generator
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        objects of the same type for inequality.
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A % mersenne_twister_engine random number generator
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another % mersenne_twister_engine random number
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              generator object.
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, size_t __w,
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   size_t __n, size_t __m, size_t __r,
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __a, size_t __u, _UIntType __d, size_t __s,
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __b, size_t __t,
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   _UIntType __c, size_t __l, _UIntType __f>
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs,
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs)
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief The Marsaglia-Zaman generator.
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * This is a model of a Generalized Fibonacci discrete random number
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * generator, sometimes referred to as the SWC generator.
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A discrete random number generator that produces pseudorandom
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * numbers using:
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The size of the state is @f$r@f$
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * and the maximum period of the generator is @f$(m^r - m^s - 1)@f$.
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @var _M_x     The state of the generator.  This is a ring buffer.
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @var _M_carry The carry.
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @var _M_p     Current index of x(i - r).
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class subtract_with_carry_engine
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "substituting _UIntType not an unsigned integral type");
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(0u < __s && __s < __r,
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __s out of bounds");
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __w out of bounds");
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _UIntType result_type;
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // parameter values
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      word_size    = __w;
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      short_lag    = __s;
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t      long_lag     = __r;
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type default_seed = 19780503u;
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs an explicitly seeded % subtract_with_carry_engine
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator.
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      subtract_with_carry_engine(result_type __sd = default_seed)
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { seed(__sd); }
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a %subtract_with_carry_engine random number engine
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seeded from the seed sequence @p __q.
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q the seed sequence.
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value>
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ::type>
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        subtract_with_carry_engine(_Sseq& __q)
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { seed(__q); }
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Seeds the initial state @f$x_0@f$ of the random number
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generator.
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * N1688[4.19] modifies this as follows.  If @p __value == 0,
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * sets value to 19780503.  In any case, with a linear
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * congruential generator lcg(i) having parameters @f$ m_{lcg} =
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * \dots lcg(r) \bmod m @f$ respectively.  If @f$ x_{-1} = 0 @f$
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * set carry to 1, otherwise sets carry to 0.
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __sd = default_seed);
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Seeds the initial state @f$x_0@f$ of the
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * % subtract_with_carry_engine random number generator.
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typename std::enable_if<std::is_class<_Sseq>::value>::type
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q);
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the inclusive minimum value of the range of random
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * integers returned by this generator.
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0; }
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the inclusive maximum value of the range of random
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * integers returned by this generator.
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Discard a sequence of random numbers.
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z)
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (; __z != 0ULL; --__z)
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  (*this)();
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the next random number in the sequence.
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()();
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Compares two % subtract_with_carry_engine random number
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generator objects of the same type for equality.
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A % subtract_with_carry_engine random number generator
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another % subtract_with_carry_engine random number
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              generator object.
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const subtract_with_carry_engine& __lhs,
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const subtract_with_carry_engine& __rhs)
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x)
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __lhs._M_carry == __rhs._M_carry
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __lhs._M_p == __rhs._M_p); }
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts the current state of a % subtract_with_carry_engine
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x into the output stream
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __os.
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A % subtract_with_carry_engine random number generator
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             engine.
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>&,
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::subtract_with_carry_engine<_UIntType1, __w1,
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __s1, __r1>&);
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts the current state of a % subtract_with_carry_engine
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x from the input stream
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __is.
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A % subtract_with_carry_engine random number generator
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             engine.
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with the state of @p __x extracted or in
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UIntType1, size_t __w1, size_t __s1, size_t __r1,
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>&,
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::subtract_with_carry_engine<_UIntType1, __w1,
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __s1, __r1>&);
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _UIntType  _M_x[long_lag];
82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _UIntType  _M_carry;
82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t     _M_p;
82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Compares two % subtract_with_carry_engine random number
83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        generator objects of the same type for inequality.
83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A % subtract_with_carry_engine random number generator
83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another % subtract_with_carry_engine random number
83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              generator object.
83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _UIntType, size_t __w, size_t __s, size_t __r>
84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::subtract_with_carry_engine<_UIntType, __w,
84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __s, __r>& __lhs,
84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::subtract_with_carry_engine<_UIntType, __w,
84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __s, __r>& __rhs)
84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Produces random numbers from some base engine by discarding blocks of
85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * data.
85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * 0 <= @p __r <= @p __p
85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __p, size_t __r>
85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class discard_block_engine
85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(1 <= __r && __r <= __p,
85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __r out of bounds");
86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _RandomNumberEngine::result_type result_type;
86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // parameter values
86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t block_size = __p;
86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t used_block = __r;
86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a default %discard_block_engine engine.
87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * The underlying engine is default constructed as well.
87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard_block_engine()
87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(), _M_n(0) { }
87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Copy constructs a %discard_block_engine engine.
87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard_block_engine(const _RandomNumberEngine& __rng)
88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__rng), _M_n(0) { }
88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Move constructs a %discard_block_engine engine.
88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard_block_engine(_RandomNumberEngine&& __rng)
89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(std::move(__rng)), _M_n(0) { }
89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Seed constructs a %discard_block_engine engine.
89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Constructs the underlying generator engine seeded with @p __s.
90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __s A seed value for the base class engine.
90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard_block_engine(result_type __s)
90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__s), _M_n(0) { }
90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generator construct a %discard_block_engine engine.
90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed sequence.
91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value
91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ::type>
91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        discard_block_engine(_Sseq& __q)
91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_b(__q), _M_n(0)
91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { }
92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %discard_block_engine object with the default
92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seed for the underlying base class generator engine.
92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed()
92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_b.seed();
92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_n = 0;
93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %discard_block_engine object with the default
93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seed for the underlying base class generator engine.
93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __s)
93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_b.seed(__s);
94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_n = 0;
94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %discard_block_engine object with the given seed
94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        sequence.
94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed generator function.
94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        void
95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q)
95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_b.seed(__q);
95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_n = 0;
95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets a const reference to the underlying generator engine
95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        object.
95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _RandomNumberEngine&
96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      base() const noexcept
96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_b; }
96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the minimum value in the generated random number range.
96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _RandomNumberEngine::min(); }
97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the maximum value in the generated random number range.
97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _RandomNumberEngine::max(); }
97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Discard a sequence of random numbers.
98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z)
98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (; __z != 0ULL; --__z)
98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  (*this)();
98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the next value in the generated random number sequence.
99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()();
99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Compares two %discard_block_engine random number generator
99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        objects of the same type for equality.
99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A %discard_block_engine random number generator object.
99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another %discard_block_engine random number generator
100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const discard_block_engine& __lhs,
100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const discard_block_engine& __rhs)
100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; }
100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts the current state of a %discard_block_engine random
101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        number generator engine @p __x into the output stream
101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __os.
101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %discard_block_engine random number generator engine.
101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::discard_block_engine<_RandomNumberEngine1,
102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __p1, __r1>& __x);
102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts the current state of a % subtract_with_carry_engine
103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x from the input stream
103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __is.
103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %discard_block_engine random number generator engine.
103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with the state of @p __x extracted or in
103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RandomNumberEngine1, size_t __p1, size_t __r1,
104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::discard_block_engine<_RandomNumberEngine1,
104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __p1, __r1>& __x);
104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RandomNumberEngine _M_b;
104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t _M_n;
104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Compares two %discard_block_engine random number generator
105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        objects of the same type for inequality.
105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A %discard_block_engine random number generator object.
105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another %discard_block_engine random number generator
105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __p, size_t __r>
106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::discard_block_engine<_RandomNumberEngine, __p,
106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __r>& __lhs,
106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::discard_block_engine<_RandomNumberEngine, __p,
106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __r>& __rhs)
106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Produces random numbers by combining random numbers from some base
107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * engine to produce random numbers with a specifies number of bits @p __w.
107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class independent_bits_engine
107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_unsigned<_UIntType>::value, "template argument "
107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "substituting _UIntType not an unsigned integral type");
108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument substituting __w out of bounds");
108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
108411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _UIntType result_type;
108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a default %independent_bits_engine engine.
108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
109011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * The underlying engine is default constructed as well.
109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      independent_bits_engine()
109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b() { }
109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
109611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Copy constructs a %independent_bits_engine engine.
109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
110211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      independent_bits_engine(const _RandomNumberEngine& __rng)
110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__rng) { }
110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Move constructs a %independent_bits_engine engine.
110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
110811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      independent_bits_engine(_RandomNumberEngine&& __rng)
111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(std::move(__rng)) { }
111411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Seed constructs a %independent_bits_engine engine.
111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Constructs the underlying generator engine seeded with @p __s.
111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __s A seed value for the base class engine.
112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
112111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      independent_bits_engine(result_type __s)
112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__s) { }
112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generator construct a %independent_bits_engine engine.
112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
112811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed sequence.
112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value
113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               ::type>
113411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        independent_bits_engine(_Sseq& __q)
113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        : _M_b(__q)
113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { }
113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
114011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %independent_bits_engine object with the default
114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seed for the underlying base class generator engine.
114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed()
114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_b.seed(); }
114611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %independent_bits_engine object with the default
114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seed for the underlying base class generator engine.
115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
115211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __s)
115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_b.seed(__s); }
115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %independent_bits_engine object with the given
115711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        seed sequence.
115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed generator function.
115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        void
116211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q)
116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { _M_b.seed(__q); }
116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets a const reference to the underlying generator engine
116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        object.
116811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _RandomNumberEngine&
117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      base() const noexcept
117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_b; }
117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
117411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the minimum value in the generated random number range.
117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0U; }
117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
118111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the maximum value in the generated random number range.
118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __detail::_Shift<_UIntType, __w>::__value - 1; }
118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
118711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Discard a sequence of random numbers.
118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z)
119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
119311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (; __z != 0ULL; --__z)
119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  (*this)();
119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Gets the next value in the generated random number sequence.
119911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()();
120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Compares two %independent_bits_engine random number generator
120511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * objects of the same type for equality.
120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A %independent_bits_engine random number generator
120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another %independent_bits_engine random number generator
121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
121111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const independent_bits_engine& __lhs,
121711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const independent_bits_engine& __rhs)
121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __lhs._M_b == __rhs._M_b; }
121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts the current state of a % subtract_with_carry_engine
122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x from the input stream
122311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __is.
122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %independent_bits_engine random number generator
122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             engine.
122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
122911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with the state of @p __x extracted or in
123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          an error state.
123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _CharT, typename _Traits>
123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
123511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::independent_bits_engine<_RandomNumberEngine,
123611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __w, _UIntType>& __x)
123711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
123811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __is >> __x._M_b;
123911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return __is;
124011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
124111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
124211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
124311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RandomNumberEngine _M_b;
124411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
124511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
124611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
124711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Compares two %independent_bits_engine random number generator
124811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * objects of the same type for inequality.
124911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
125011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A %independent_bits_engine random number generator
125111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
125211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another %independent_bits_engine random number generator
125311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
125411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
125511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
125611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
125711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
125811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __w, typename _UIntType>
125911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
126011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w,
126111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType>& __lhs,
126211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::independent_bits_engine<_RandomNumberEngine, __w,
126311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _UIntType>& __rhs)
126411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
126511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
126611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
126711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts the current state of a %independent_bits_engine random
126811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        number generator engine @p __x into the output stream @p __os.
126911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
127011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
127111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %independent_bits_engine random number generator engine.
127211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
127311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
127411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          an error state.
127511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
127611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __w, typename _UIntType,
127711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _CharT, typename _Traits>
127811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
127911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
128011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::independent_bits_engine<_RandomNumberEngine,
128111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __w, _UIntType>& __x)
128211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
128311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __os << __x.base();
128411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return __os;
128511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
128611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
128711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
128811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
128911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Produces random numbers by combining random numbers from some
129011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * base engine to produce random numbers with a specifies number of bits
129111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __w.
129211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
129311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __k>
129411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class shuffle_order_engine
129511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
129611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(1u <= __k, "template argument substituting "
129711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "__k out of bound");
129811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
129911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
130011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the generated random value. */
130111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _RandomNumberEngine::result_type result_type;
130211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
130311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr size_t table_size = __k;
130411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
130511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
130611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a default %shuffle_order_engine engine.
130711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
130811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * The underlying engine is default constructed as well.
130911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
131011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      shuffle_order_engine()
131111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b()
131211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize(); }
131311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
131411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
131511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Copy constructs a %shuffle_order_engine engine.
131611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
131711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
131811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
131911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
132011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
132111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      shuffle_order_engine(const _RandomNumberEngine& __rng)
132211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__rng)
132311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize(); }
132411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
132511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
132611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Move constructs a %shuffle_order_engine engine.
132711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
132811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Copies an existing base class random number generator.
132911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rng An existing (base class) engine object.
133011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
133111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
133211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      shuffle_order_engine(_RandomNumberEngine&& __rng)
133311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(std::move(__rng))
133411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize(); }
133511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
133611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
133711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Seed constructs a %shuffle_order_engine engine.
133811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
133911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Constructs the underlying generator engine seeded with @p __s.
134011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __s A seed value for the base class engine.
134111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
134211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
134311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      shuffle_order_engine(result_type __s)
134411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_b(__s)
134511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize(); }
134611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
134711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
134811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generator construct a %shuffle_order_engine engine.
134911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
135011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed sequence.
135111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
135211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq, typename = typename
135311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value
135411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
135511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ::type>
135611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        explicit
135711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        shuffle_order_engine(_Sseq& __q)
135811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        : _M_b(__q)
135911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { _M_initialize(); }
136011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
136111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
136211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %shuffle_order_engine object with the default seed
136311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                for the underlying base class generator engine.
136411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
136511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
136611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed()
136711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
136811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_b.seed();
136911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
137011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
137111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
137211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
137311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %shuffle_order_engine object with the default seed
137411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        for the underlying base class generator engine.
137511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
137611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
137711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed(result_type __s)
137811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
137911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_b.seed(__s);
138011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
138111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
138211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
138311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
138411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Reseeds the %shuffle_order_engine object with the given seed
138511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        sequence.
138611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __q A seed generator function.
138711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
138811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Sseq>
138911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        void
139011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        seed(_Sseq& __q)
139111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
139211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_b.seed(__q);
139311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_initialize();
139411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
139511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
139611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
139711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Gets a const reference to the underlying generator engine object.
139811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
139911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _RandomNumberEngine&
140011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      base() const noexcept
140111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_b; }
140211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
140311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
140411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Gets the minimum value in the generated random number range.
140511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
140611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
140711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min()
140811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _RandomNumberEngine::min(); }
140911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
141011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
141111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Gets the maximum value in the generated random number range.
141211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
141311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static constexpr result_type
141411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max()
141511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _RandomNumberEngine::max(); }
141611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
141711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
141811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Discard a sequence of random numbers.
141911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
142011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
142111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discard(unsigned long long __z)
142211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
142311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (; __z != 0ULL; --__z)
142411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  (*this)();
142511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
142611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
142711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
142811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Gets the next value in the generated random number sequence.
142911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
143011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
143111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()();
143211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
143311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
143411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Compares two %shuffle_order_engine random number generator objects
143511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * of the same type for equality.
143611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
143711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __lhs A %shuffle_order_engine random number generator object.
143811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __rhs Another %shuffle_order_engine random number generator
143911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *              object.
144011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
144111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns true if the infinite sequences of generated values
144211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          would be equal, false otherwise.
144311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
144411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
144511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const shuffle_order_engine& __lhs,
144611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const shuffle_order_engine& __rhs)
144711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__lhs._M_b == __rhs._M_b
144811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v)
144911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __lhs._M_y == __rhs._M_y); }
145011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
145111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
145211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts the current state of a %shuffle_order_engine random
145311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        number generator engine @p __x into the output stream
145411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	@p __os.
145511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
145611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
145711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %shuffle_order_engine random number generator engine.
145811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
145911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
146011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
146111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
146211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RandomNumberEngine1, size_t __k1,
146311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
146411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
146511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
146611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::shuffle_order_engine<_RandomNumberEngine1,
146711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   __k1>& __x);
146811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
146911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
147011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts the current state of a % subtract_with_carry_engine
147111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        random number generator engine @p __x from the input stream
147211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        @p __is.
147311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
147411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
147511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %shuffle_order_engine random number generator engine.
147611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
147711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with the state of @p __x extracted or in
147811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
147911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
148011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RandomNumberEngine1, size_t __k1,
148111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
148211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
148311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
148411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x);
148511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
148611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
148711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void _M_initialize()
148811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
148911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (size_t __i = 0; __i < __k; ++__i)
149011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_v[__i] = _M_b();
149111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_y = _M_b();
149211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
149311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
149411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RandomNumberEngine _M_b;
149511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type _M_v[__k];
149611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type _M_y;
149711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
149811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
149911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
150011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Compares two %shuffle_order_engine random number generator objects
150111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * of the same type for inequality.
150211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
150311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __lhs A %shuffle_order_engine random number generator object.
150411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __rhs Another %shuffle_order_engine random number generator
150511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              object.
150611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
150711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns true if the infinite sequences of generated values
150811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          would be different, false otherwise.
150911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
151011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomNumberEngine, size_t __k>
151111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
151211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::shuffle_order_engine<_RandomNumberEngine,
151311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __k>& __lhs,
151411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::shuffle_order_engine<_RandomNumberEngine,
151511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       __k>& __rhs)
151611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__lhs == __rhs); }
151711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
151811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
151911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
152011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
152111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
152211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL>
152311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  minstd_rand0;
152411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
152511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
152611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * An alternative LCR (Lehmer Generator function).
152711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
152811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL>
152911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  minstd_rand;
153011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
153111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
153211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The classic Mersenne Twister.
153311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
153411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Reference:
153511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally
153611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions
153711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
153811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
153911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef mersenne_twister_engine<
154011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uint_fast32_t,
154111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    32, 624, 397, 31,
154211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0x9908b0dfUL, 11,
154311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0xffffffffUL, 7,
154411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0x9d2c5680UL, 15,
154511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0xefc60000UL, 18, 1812433253UL> mt19937;
154611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
154711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
154811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * An alternative Mersenne Twister.
154911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
155011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef mersenne_twister_engine<
155111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uint_fast64_t,
155211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    64, 312, 156, 31,
155311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0xb5026f5aa96619e9ULL, 29,
155411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0x5555555555555555ULL, 17,
155511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0x71d67fffeda60000ULL, 37,
155611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    0xfff7eee000000000ULL, 43,
155711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    6364136223846793005ULL> mt19937_64;
155811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
155911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>
156011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ranlux24_base;
156111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
156211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>
156311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ranlux48_base;
156411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
156511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
156611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
156711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
156811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
156911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
157011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
157111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef minstd_rand0 default_random_engine;
157211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
157311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
157411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A standard interface to a platform-specific non-deterministic
157511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * random number generator (if any are available).
157611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
157711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class random_device
157811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
157911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
158011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /** The type of the generated random value. */
158111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef unsigned int result_type;
158211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
158311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // constructors, destructors and member functions
158411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
158511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_RANDOM_TR1
158611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
158711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    explicit
158811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    random_device(const std::string& __token = "default")
158911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
159011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_init(__token);
159111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
159211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
159311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ~random_device()
159411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { _M_fini(); }
159511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
159611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
159711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
159811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    explicit
159911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    random_device(const std::string& __token = "mt19937")
160011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { _M_init_pretr1(__token); }
160111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
160211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
160311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
160411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
160511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
160611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static constexpr result_type
160711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    min()
160811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::numeric_limits<result_type>::min(); }
160911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
161011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static constexpr result_type
161111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    max()
161211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::numeric_limits<result_type>::max(); }
161311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
161411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double
161511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    entropy() const noexcept
161611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return 0.0; }
161711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
161811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    result_type
161911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator()()
162011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
162111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_RANDOM_TR1
162211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return this->_M_getval();
162311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
162411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return this->_M_getval_pretr1();
162511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
162611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
162711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
162811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // No copy functions.
162911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    random_device(const random_device&) = delete;
163011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void operator=(const random_device&) = delete;
163111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
163211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  private:
163311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
163411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void _M_init(const std::string& __token);
163511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void _M_init_pretr1(const std::string& __token);
163611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void _M_fini();
163711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
163811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    result_type _M_getval();
163911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    result_type _M_getval_pretr1();
164011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
164111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    union
164211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
164311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void*      _M_file;
164411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mt19937    _M_mt;
164511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
164611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
164711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
164811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_generators
164911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
165011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
165111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_distributions Random Number Distributions
165211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random
165311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
165411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
165511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
165611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
165711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_distributions_uniform Uniform Distributions
165811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random_distributions
165911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
166011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
166111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
166211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
166311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Uniform discrete distribution for random numbers.
166411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A discrete random distribution on the range @f$[min, max]@f$ with equal
166511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * probability throughout the range.
166611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
166711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
166811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class uniform_int_distribution
166911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
167011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
167111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
167211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
167311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
167411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
167511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType result_type;
167611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
167711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
167811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
167911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef uniform_int_distribution<_IntType> distribution_type;
168011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
168111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
168211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_IntType __a = 0,
168311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _IntType __b = std::numeric_limits<_IntType>::max())
168411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_a(__a), _M_b(__b)
168511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
168611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
168711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
168811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
168911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
169011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	a() const
169111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_a; }
169211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
169311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
169411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	b() const
169511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_b; }
169611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
169711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
169811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
169911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
170011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
170111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
170211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType _M_a;
170311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType _M_b;
170411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
170511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
170611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
170711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
170811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a uniform distribution object.
170911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
171011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
171111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uniform_int_distribution(_IntType __a = 0,
171211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _IntType __b = std::numeric_limits<_IntType>::max())
171311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__a, __b)
171411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
171511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
171611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
171711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uniform_int_distribution(const param_type& __p)
171811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
171911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
172011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
172111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
172211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
172311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
172411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Does nothing for the uniform integer distribution.
172511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
172611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
172711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset() { }
172811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
172911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
173011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      a() const
173111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.a(); }
173211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
173311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
173411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      b() const
173511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.b(); }
173611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
173711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
173811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
173911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
174011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
174111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
174211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
174311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
174411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
174511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
174611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
174711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
174811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
174911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
175011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
175111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
175211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
175311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the inclusive lower bound of the distribution range.
175411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
175511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
175611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
175711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->a(); }
175811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
175911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
176011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the inclusive upper bound of the distribution range.
176111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
176211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
176311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
176411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->b(); }
176511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
176611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
176711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
176811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
176911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
177011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
177111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
177211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return this->operator()(__urng, _M_param); }
177311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
177411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
177511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
177611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
177711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
177811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
177911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
178011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
178111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
178211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
178311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
178411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
178511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
178611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
178711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
178811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
178911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
179011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
179111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
179211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
179311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
179411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
179511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
179611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
179711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
179811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
179911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
180011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
180111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
180211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two uniform integer distributions have
180311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters.
180411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
180511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
180611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const uniform_int_distribution& __d1,
180711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const uniform_int_distribution& __d2)
180811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
180911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
181011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
181111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
181211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
181311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
181411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
181511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
181611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
181711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
181811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
181911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
182011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
182111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
182211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two uniform integer distributions have
182311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        different parameters.
182411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
182511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
182611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
182711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::uniform_int_distribution<_IntType>& __d1,
182811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::uniform_int_distribution<_IntType>& __d2)
182911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
183011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
183111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
183211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %uniform_int_distribution random number
183311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        distribution @p __x into the output stream @p os.
183411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
183511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
183611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %uniform_int_distribution random number distribution.
183711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
183811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
183911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
184011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
184111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType, typename _CharT, typename _Traits>
184211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
184311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>&,
184411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::uniform_int_distribution<_IntType>&);
184511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
184611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
184711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %uniform_int_distribution random number distribution
184811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
184911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
185011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
185111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %uniform_int_distribution random number generator engine.
185211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
185311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
185411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
185511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType, typename _CharT, typename _Traits>
185611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
185711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>&,
185811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::uniform_int_distribution<_IntType>&);
185911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
186011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
186111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
186211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Uniform continuous distribution for random numbers.
186311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
186411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * A continuous random distribution on the range [min, max) with equal
186511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * probability throughout the range.  The URNG should be real-valued and
186611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * deliver number in the range [0, 1).
186711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
186811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
186911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class uniform_real_distribution
187011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
187111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
187211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
187311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
187411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
187511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
187611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
187711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
187811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
187911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
188011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef uniform_real_distribution<_RealType> distribution_type;
188111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
188211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
188311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __a = _RealType(0),
188411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __b = _RealType(1))
188511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_a(__a), _M_b(__b)
188611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
188711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
188811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
188911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
189011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
189111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	a() const
189211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_a; }
189311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
189411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
189511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	b() const
189611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_b; }
189711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
189811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
189911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
190011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
190111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
190211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
190311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_a;
190411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_b;
190511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
190611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
190711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
190811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
190911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a uniform_real_distribution object.
191011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
191111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __a [IN]  The lower bound of the distribution.
191211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __b [IN]  The upper bound of the distribution.
191311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
191411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
191511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uniform_real_distribution(_RealType __a = _RealType(0),
191611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				_RealType __b = _RealType(1))
191711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__a, __b)
191811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
191911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
192011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
192111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uniform_real_distribution(const param_type& __p)
192211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
192311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
192411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
192511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
192611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
192711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
192811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Does nothing for the uniform real distribution.
192911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
193011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
193111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset() { }
193211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
193311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
193411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      a() const
193511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.a(); }
193611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
193711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
193811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      b() const
193911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.b(); }
194011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
194111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
194211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
194311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
194411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
194511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
194611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
194711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
194811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
194911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
195011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
195111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
195211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
195311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
195411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
195511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
195611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
195711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the inclusive lower bound of the distribution range.
195811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
195911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
196011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
196111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->a(); }
196211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
196311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
196411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the inclusive upper bound of the distribution range.
196511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
196611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
196711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
196811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->b(); }
196911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
197011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
197111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
197211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
197311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
197411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
197511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
197611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return this->operator()(__urng, _M_param); }
197711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
197811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
197911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
198011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
198111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
198211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
198311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
198411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __aurng(__urng);
198511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return (__aurng() * (__p.b() - __p.a())) + __p.a();
198611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
198711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
198811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
198911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
199011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
199111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
199211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
199311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
199411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
199511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
199611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
199711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
199811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
199911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
200011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
200111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
200211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
200311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
200411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
200511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
200611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
200711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
200811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
200911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
201011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
201111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two uniform real distributions have
201211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters.
201311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
201411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
201511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const uniform_real_distribution& __d1,
201611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const uniform_real_distribution& __d2)
201711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
201811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
201911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
202011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
202111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
202211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
202311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
202411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
202511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
202611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
202711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
202811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
202911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
203011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
203111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two uniform real distributions have
203211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        different parameters.
203311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
203411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
203511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
203611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::uniform_real_distribution<_IntType>& __d1,
203711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::uniform_real_distribution<_IntType>& __d2)
203811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
203911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
204011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
204111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %uniform_real_distribution random number
204211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        distribution @p __x into the output stream @p __os.
204311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
204411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
204511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %uniform_real_distribution random number distribution.
204611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
204711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
204811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          an error state.
204911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
205011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
205111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
205211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>&,
205311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::uniform_real_distribution<_RealType>&);
205411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
205511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
205611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %uniform_real_distribution random number distribution
205711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
205811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
205911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
206011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %uniform_real_distribution random number generator engine.
206111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
206211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
206311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
206411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
206511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
206611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>&,
206711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::uniform_real_distribution<_RealType>&);
206811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
206911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_distributions_uniform
207011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
207111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
207211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_distributions_normal Normal Distributions
207311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random_distributions
207411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
207511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
207611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
207711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
207811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A normal continuous distribution for random numbers.
207911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
208011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability density function is
208111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
208211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}}
208311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *            e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} }
208411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
208511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
208611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
208711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class normal_distribution
208811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
208911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
209011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
209111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
209211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
209311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
209411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
209511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
209611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
209711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
209811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef normal_distribution<_RealType> distribution_type;
209911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
210011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
210111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __mean = _RealType(0),
210211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __stddev = _RealType(1))
210311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_mean(__mean), _M_stddev(__stddev)
210411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
210511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0));
210611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
210711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
210811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
210911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	mean() const
211011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_mean; }
211111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
211211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
211311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	stddev() const
211411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_stddev; }
211511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
211611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
211711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
211811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return (__p1._M_mean == __p2._M_mean
211911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  && __p1._M_stddev == __p2._M_stddev); }
212011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
212111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
212211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_mean;
212311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_stddev;
212411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
212511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
212611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
212711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
212811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Constructs a normal distribution with parameters @f$mean@f$ and
212911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * standard deviation.
213011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
213111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
213211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      normal_distribution(result_type __mean = result_type(0),
213311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			  result_type __stddev = result_type(1))
213411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__mean, __stddev), _M_saved_available(false)
213511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
213611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
213711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
213811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      normal_distribution(const param_type& __p)
213911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_saved_available(false)
214011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
214111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
214211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
214311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
214411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
214511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
214611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
214711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_saved_available = false; }
214811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
214911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
215011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the mean of the distribution.
215111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
215211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
215311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mean() const
215411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.mean(); }
215511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
215611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
215711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the standard deviation of the distribution.
215811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
215911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
216011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      stddev() const
216111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.stddev(); }
216211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
216311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
216411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
216511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
216611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
216711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
216811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
216911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
217011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
217111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
217211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
217311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
217411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
217511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
217611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
217711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
217811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
217911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
218011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
218111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
218211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
218311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::lowest(); }
218411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
218511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
218611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
218711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
218811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
218911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
219011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
219111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
219211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
219311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
219411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
219511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
219611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
219711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
219811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
219911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
220011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
220111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
220211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
220311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
220411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
220511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
220611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
220711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
220811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
220911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
221011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
221111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
221211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
221311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
221411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
221511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
221611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
221711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
221811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
221911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
222011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
222111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
222211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
222311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
222411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
222511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
222611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
222711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
222811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two normal distributions have
222911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would
223011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        be generated are equal.
223111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
223211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1>
223311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
223411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator==(const std::normal_distribution<_RealType1>& __d1,
223511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::normal_distribution<_RealType1>& __d2);
223611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
223711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
223811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %normal_distribution random number distribution
223911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
224011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
224111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
224211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %normal_distribution random number distribution.
224311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
224411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
224511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
224611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
224711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
224811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
224911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
225011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::normal_distribution<_RealType1>& __x);
225111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
225211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
225311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %normal_distribution random number distribution
225411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
225511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
225611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
225711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %normal_distribution random number generator engine.
225811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
225911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
226011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
226111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
226211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
226311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
226411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
226511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::normal_distribution<_RealType1>& __x);
226611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
226711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
226811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
226911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
227011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
227111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
227211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
227311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
227411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
227511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type  _M_param;
227611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type _M_saved;
227711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool        _M_saved_available;
227811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
227911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
228011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
228111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two normal distributions are different.
228211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
228311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
228411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
228511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::normal_distribution<_RealType>& __d1,
228611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::normal_distribution<_RealType>& __d2)
228711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
228811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
228911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
229011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
229111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A lognormal_distribution random number distribution.
229211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
229311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is
229411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
229511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|m,s) = \frac{1}{sx\sqrt{2\pi}}
229611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                \exp{-\frac{(\ln{x} - m)^2}{2s^2}}
229711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
229811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
229911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
230011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class lognormal_distribution
230111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
230211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
230311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
230411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
230511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
230611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
230711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
230811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
230911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
231011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
231111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef lognormal_distribution<_RealType> distribution_type;
231211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
231311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
231411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __m = _RealType(0),
231511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __s = _RealType(1))
231611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_m(__m), _M_s(__s)
231711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
231811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
231911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
232011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	m() const
232111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_m; }
232211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
232311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
232411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	s() const
232511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_s; }
232611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
232711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
232811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
232911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; }
233011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
233111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
233211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_m;
233311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_s;
233411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
233511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
233611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
233711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      lognormal_distribution(_RealType __m = _RealType(0),
233811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			     _RealType __s = _RealType(1))
233911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__m, __s), _M_nd()
234011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
234111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
234211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
234311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      lognormal_distribution(const param_type& __p)
234411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_nd()
234511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
234611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
234711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
234811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Resets the distribution state.
234911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
235011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
235111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
235211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_nd.reset(); }
235311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
235411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
235511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
235611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
235711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
235811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      m() const
235911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.m(); }
236011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
236111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
236211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      s() const
236311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.s(); }
236411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
236511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
236611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
236711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
236811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
236911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
237011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
237111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
237211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
237311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
237411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
237511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
237611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
237711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
237811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
237911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
238011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
238111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
238211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
238311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
238411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
238511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
238611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
238711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
238811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
238911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
239011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
239111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
239211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
239311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
239411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
239511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
239611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
239711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
239811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
239911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
240011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return this->operator()(__urng, _M_param); }
240111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
240211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
240311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
240411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
240511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
240611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); }
240711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
240811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
240911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
241011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
241111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
241211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
241311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
241411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
241511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
241611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
241711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
241811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
241911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
242011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
242111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
242211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
242311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
242411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
242511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
242611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
242711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
242811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
242911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
243011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
243111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two lognormal distributions have
243211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would
243311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        be generated are equal.
243411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
243511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
243611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const lognormal_distribution& __d1,
243711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const lognormal_distribution& __d2)
243811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__d1._M_param == __d2._M_param
243911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __d1._M_nd == __d2._M_nd); }
244011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
244111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
244211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %lognormal_distribution random number distribution
244311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
244411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
244511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
244611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %lognormal_distribution random number distribution.
244711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
244811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
244911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
245011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
245111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
245211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
245311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
245411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::lognormal_distribution<_RealType1>& __x);
245511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
245611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
245711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %lognormal_distribution random number distribution
245811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
245911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
246011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
246111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %lognormal_distribution random number
246211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
246311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
246411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
246511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
246611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
246711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
246811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
246911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::lognormal_distribution<_RealType1>& __x);
247011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
247111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
247211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
247311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
247411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
247511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
247611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
247711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
247811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
247911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
248011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
248111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::normal_distribution<result_type> _M_nd;
248211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
248311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
248411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
248511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two lognormal distributions are different.
248611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
248711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
248811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
248911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::lognormal_distribution<_RealType>& __d1,
249011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::lognormal_distribution<_RealType>& __d2)
249111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
249211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
249311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
249411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
249511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A gamma continuous distribution for random numbers.
249611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
249711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the gamma probability density function is:
249811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
249911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)}
250011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                         (x/\beta)^{\alpha - 1} e^{-x/\beta}
250111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
250211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
250311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
250411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class gamma_distribution
250511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
250611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
250711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
250811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
250911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
251011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
251111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
251211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
251311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
251411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
251511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef gamma_distribution<_RealType> distribution_type;
251611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class gamma_distribution<_RealType>;
251711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
251811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
251911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __alpha_val = _RealType(1),
252011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __beta_val = _RealType(1))
252111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_alpha(__alpha_val), _M_beta(__beta_val)
252211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
252311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0));
252411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_initialize();
252511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
252611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
252711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
252811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	alpha() const
252911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_alpha; }
253011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
253111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
253211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	beta() const
253311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_beta; }
253411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
253511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
253611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
253711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return (__p1._M_alpha == __p2._M_alpha
253811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  && __p1._M_beta == __p2._M_beta); }
253911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
254011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
254111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
254211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
254311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
254411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_alpha;
254511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_beta;
254611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
254711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_malpha, _M_a2;
254811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
254911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
255011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
255111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
255211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs a gamma distribution with parameters
255311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @f$\alpha@f$ and @f$\beta@f$.
255411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
255511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
255611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      gamma_distribution(_RealType __alpha_val = _RealType(1),
255711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 _RealType __beta_val = _RealType(1))
255811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__alpha_val, __beta_val), _M_nd()
255911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
256011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
256111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
256211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      gamma_distribution(const param_type& __p)
256311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_nd()
256411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
256511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
256611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
256711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
256811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
256911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
257011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
257111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_nd.reset(); }
257211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
257311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
257411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the @f$\alpha@f$ of the distribution.
257511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
257611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
257711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      alpha() const
257811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.alpha(); }
257911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
258011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
258111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the @f$\beta@f$ of the distribution.
258211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
258311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
258411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      beta() const
258511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.beta(); }
258611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
258711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
258811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
258911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
259011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
259111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
259211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
259311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
259411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
259511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
259611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
259711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
259811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
259911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
260011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
260111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
260211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
260311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
260411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
260511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
260611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
260711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
260811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
260911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
261011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
261111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
261211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
261311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
261411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
261511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
261611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
261711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
261811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
261911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
262011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
262111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
262211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
262311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
262411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
262511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
262611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
262711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
262811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
262911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
263011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
263111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
263211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
263311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
263411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
263511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
263611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
263711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
263811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
263911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
264011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
264111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
264211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
264311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
264411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
264511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
264611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
264711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
264811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
264911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
265011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
265111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
265211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two gamma distributions have the same
265311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameters and the sequences that would be generated
265411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        are equal.
265511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
265611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
265711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const gamma_distribution& __d1,
265811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const gamma_distribution& __d2)
265911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__d1._M_param == __d2._M_param
266011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __d1._M_nd == __d2._M_nd); }
266111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
266211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
266311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %gamma_distribution random number distribution
266411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
266511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
266611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
266711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %gamma_distribution random number distribution.
266811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
266911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
267011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
267111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
267211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
267311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
267411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
267511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::gamma_distribution<_RealType1>& __x);
267611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
267711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
267811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %gamma_distribution random number distribution
267911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
268011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
268111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
268211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %gamma_distribution random number generator engine.
268311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
268411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
268511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
268611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
268711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
268811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
268911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::gamma_distribution<_RealType1>& __x);
269011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
269111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
269211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
269311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
269411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
269511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
269611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
269711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
269811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
269911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
270011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
270111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::normal_distribution<result_type> _M_nd;
270211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
270311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
270411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
270511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two gamma distributions are different.
270611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
270711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   template<typename _RealType>
270811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     inline bool
270911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     operator!=(const std::gamma_distribution<_RealType>& __d1,
271011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		const std::gamma_distribution<_RealType>& __d2)
271111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
271211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
271311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
271411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
271511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A chi_squared_distribution random number distribution.
271611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
271711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is
271811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$
271911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
272011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
272111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class chi_squared_distribution
272211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
272311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
272411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
272511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
272611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
272711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
272811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
272911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
273011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
273111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
273211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef chi_squared_distribution<_RealType> distribution_type;
273311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
273411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
273511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __n = _RealType(1))
273611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_n(__n)
273711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
273811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
273911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
274011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	n() const
274111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_n; }
274211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
274311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
274411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
274511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_n == __p2._M_n; }
274611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
274711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
274811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_n;
274911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
275011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
275111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
275211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      chi_squared_distribution(_RealType __n = _RealType(1))
275311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__n), _M_gd(__n / 2)
275411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
275511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
275611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
275711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      chi_squared_distribution(const param_type& __p)
275811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_gd(__p.n() / 2)
275911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
276011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
276111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
276211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
276311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
276411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
276511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
276611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_gd.reset(); }
276711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
276811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
276911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
277011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
277111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
277211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      n() const
277311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.n(); }
277411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
277511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
277611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
277711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
277811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
277911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
278011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
278111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
278211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
278311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
278411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
278511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
278611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
278711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
278811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
278911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
279011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
279111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
279211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
279311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
279411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
279511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
279611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
279711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
279811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
279911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
280011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
280111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
280211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
280311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
280411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
280511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
280611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
280711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
280811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
280911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
281011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return 2 * _M_gd(__urng); }
281111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
281211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
281311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
281411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
281511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
281611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
281711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename std::gamma_distribution<result_type>::param_type
281811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    param_type;
281911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return 2 * _M_gd(__urng, param_type(__p.n() / 2));
282011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
282111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
282211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
282311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
282411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
282511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
282611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
282711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { this->__generate_impl(__f, __t, __urng); }
282811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
282911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
283011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
283111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
283211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
283311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
283411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
283511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ typename std::gamma_distribution<result_type>::param_type
283611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __p2(__p.n() / 2);
283711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  this->__generate_impl(__f, __t, __urng, __p2); }
283811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
283911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
284011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
284111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
284211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
284311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { this->__generate_impl(__f, __t, __urng); }
284411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
284511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
284611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
284711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
284811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
284911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
285011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ typename std::gamma_distribution<result_type>::param_type
285111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __p2(__p.n() / 2);
285211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  this->__generate_impl(__f, __t, __urng, __p2); }
285311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
285411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
285511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two Chi-squared distributions have
285611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would be
285711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generated are equal.
285811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
285911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
286011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const chi_squared_distribution& __d1,
286111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const chi_squared_distribution& __d2)
286211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; }
286311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
286411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
286511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %chi_squared_distribution random number distribution
286611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
286711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
286811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
286911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %chi_squared_distribution random number distribution.
287011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
287111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
287211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
287311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
287411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
287511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
287611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
287711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::chi_squared_distribution<_RealType1>& __x);
287811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
287911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
288011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %chi_squared_distribution random number distribution
288111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
288211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
288311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
288411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %chi_squared_distribution random number
288511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
288611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
288711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
288811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
288911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
289011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
289111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
289211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::chi_squared_distribution<_RealType1>& __x);
289311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
289411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
289511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
289611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
289711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
289811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
289911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng);
290011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
290111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
290211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
290311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
290411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
290511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
290611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const typename
290711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			std::gamma_distribution<result_type>::param_type& __p);
290811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
290911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
291011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
291111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::gamma_distribution<result_type> _M_gd;
291211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
291311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
291411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
291511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Chi-squared distributions are different.
291611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
291711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
291811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
291911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::chi_squared_distribution<_RealType>& __d1,
292011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::chi_squared_distribution<_RealType>& __d2)
292111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
292211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
292311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
292411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
292511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A cauchy_distribution random number distribution.
292611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
292711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is
292811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$
292911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
293011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
293111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class cauchy_distribution
293211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
293311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
293411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
293511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
293611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
293711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
293811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
293911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
294011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
294111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
294211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef cauchy_distribution<_RealType> distribution_type;
294311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
294411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
294511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __a = _RealType(0),
294611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __b = _RealType(1))
294711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_a(__a), _M_b(__b)
294811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
294911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
295011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
295111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	a() const
295211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_a; }
295311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
295411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
295511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	b() const
295611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_b; }
295711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
295811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
295911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
296011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
296111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
296211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
296311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_a;
296411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_b;
296511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
296611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
296711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
296811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      cauchy_distribution(_RealType __a = _RealType(0),
296911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			  _RealType __b = _RealType(1))
297011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__a, __b)
297111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
297211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
297311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
297411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      cauchy_distribution(const param_type& __p)
297511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
297611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
297711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
297811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
297911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
298011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
298111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
298211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
298311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
298411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
298511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
298611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
298711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
298811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
298911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      a() const
299011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.a(); }
299111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
299211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
299311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      b() const
299411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.b(); }
299511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
299611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
299711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
299811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
299911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
300011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
300111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
300211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
300311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
300411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
300511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
300611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
300711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
300811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
300911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
301011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
301111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
301211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
301311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
301411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
301511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
301611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::lowest(); }
301711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
301811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
301911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
302011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
302111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
302211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
302311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
302411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
302511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
302611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
302711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
302811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
302911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
303011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
303111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
303211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
303311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
303411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
303511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
303611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
303711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
303811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
303911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
304011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
304111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
304211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
304311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
304411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
304511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
304611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
304711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
304811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
304911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
305011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
305111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
305211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
305311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
305411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
305511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
305611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
305711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
305811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
305911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
306011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
306111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two Cauchy distributions have
306211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters.
306311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
306411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
306511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const cauchy_distribution& __d1,
306611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const cauchy_distribution& __d2)
306711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
306811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
306911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
307011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
307111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
307211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
307311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
307411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
307511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
307611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
307711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
307811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
307911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
308011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
308111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Cauchy distributions have
308211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        different parameters.
308311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
308411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
308511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
308611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::cauchy_distribution<_RealType>& __d1,
308711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::cauchy_distribution<_RealType>& __d2)
308811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
308911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
309011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
309111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %cauchy_distribution random number distribution
309211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
309311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
309411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
309511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %cauchy_distribution random number distribution.
309611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
309711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
309811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
309911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
310011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
310111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
310211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
310311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::cauchy_distribution<_RealType>& __x);
310411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
310511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
310611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %cauchy_distribution random number distribution
310711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
310811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
310911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
311011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x A %cauchy_distribution random number
311111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *            generator engine.
311211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
311311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
311411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
311511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
311611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
311711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
311811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::cauchy_distribution<_RealType>& __x);
311911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
312011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
312111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
312211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A fisher_f_distribution random number distribution.
312311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
312411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is
312511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
312611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)}
312711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                (\frac{m}{n})^{m/2} x^{(m/2)-1}
312811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                (1 + \frac{mx}{n})^{-(m+n)/2}
312911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
313011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
313111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
313211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class fisher_f_distribution
313311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
313411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
313511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
313611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
313711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
313811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
313911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
314011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
314111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
314211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
314311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef fisher_f_distribution<_RealType> distribution_type;
314411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
314511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
314611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __m = _RealType(1),
314711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __n = _RealType(1))
314811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_m(__m), _M_n(__n)
314911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
315011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
315111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
315211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	m() const
315311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_m; }
315411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
315511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
315611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	n() const
315711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_n; }
315811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
315911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
316011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
316111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; }
316211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
316311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
316411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_m;
316511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_n;
316611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
316711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
316811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
316911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      fisher_f_distribution(_RealType __m = _RealType(1),
317011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    _RealType __n = _RealType(1))
317111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2)
317211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
317311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
317411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
317511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      fisher_f_distribution(const param_type& __p)
317611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2)
317711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
317811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
317911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
318011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
318111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
318211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
318311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
318411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
318511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_gd_x.reset();
318611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_gd_y.reset();
318711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
318811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
318911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
319011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
319111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
319211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
319311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      m() const
319411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.m(); }
319511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
319611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
319711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      n() const
319811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.n(); }
319911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
320011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
320111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
320211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
320311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
320411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
320511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
320611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
320711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
320811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
320911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
321011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
321111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
321211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
321311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
321411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
321511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
321611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
321711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
321811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
321911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
322011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
322111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
322211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
322311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
322411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
322511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
322611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
322711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
322811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
322911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
323011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
323111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
323211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
323311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
323411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
323511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); }
323611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
323711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
323811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
323911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
324011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
324111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
324211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename std::gamma_distribution<result_type>::param_type
324311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    param_type;
324411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n())
324511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m()));
324611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
324711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
324811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
324911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
325011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
325111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
325211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
325311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
325411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
325511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
325611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
325711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
325811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
325911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
326011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
326111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
326211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
326311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
326411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
326511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
326611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
326711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
326811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
326911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
327011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
327111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
327211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
327311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
327411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
327511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
327611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
327711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two Fisher f distributions have
327811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would
327911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        be generated are equal.
328011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
328111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
328211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const fisher_f_distribution& __d1,
328311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const fisher_f_distribution& __d2)
328411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__d1._M_param == __d2._M_param
328511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __d1._M_gd_x == __d2._M_gd_x
328611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __d1._M_gd_y == __d2._M_gd_y); }
328711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
328811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
328911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %fisher_f_distribution random number distribution
329011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
329111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
329211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
329311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %fisher_f_distribution random number distribution.
329411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
329511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
329611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
329711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
329811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
329911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
330011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
330111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::fisher_f_distribution<_RealType1>& __x);
330211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
330311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
330411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %fisher_f_distribution random number distribution
330511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
330611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
330711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
330811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %fisher_f_distribution random number
330911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
331011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
331111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
331211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
331311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
331411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
331511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
331611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::fisher_f_distribution<_RealType1>& __x);
331711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
331811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
331911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
332011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
332111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
332211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
332311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng);
332411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
332511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
332611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
332711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
332811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
332911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
333011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
333111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
333211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
333311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
333411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::gamma_distribution<result_type> _M_gd_x, _M_gd_y;
333511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
333611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
333711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
333811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Fisher f distributions are different.
333911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
334011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
334111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
334211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::fisher_f_distribution<_RealType>& __d1,
334311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::fisher_f_distribution<_RealType>& __d2)
334411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
334511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
334611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
334711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A student_t_distribution random number distribution.
334811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
334911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is:
335011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
335111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)}
335211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *              (1 + \frac{x^2}{n}) ^{-(n+1)/2}
335311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
335411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
335511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
335611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class student_t_distribution
335711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
335811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
335911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
336011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
336111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
336211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
336311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
336411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
336511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
336611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
336711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef student_t_distribution<_RealType> distribution_type;
336811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
336911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
337011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __n = _RealType(1))
337111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_n(__n)
337211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
337311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
337411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
337511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	n() const
337611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_n; }
337711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
337811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
337911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
338011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_n == __p2._M_n; }
338111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
338211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
338311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_n;
338411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
338511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
338611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
338711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      student_t_distribution(_RealType __n = _RealType(1))
338811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2)
338911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
339011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
339111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
339211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      student_t_distribution(const param_type& __p)
339311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2)
339411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
339511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
339611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
339711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
339811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
339911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
340011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
340111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
340211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_nd.reset();
340311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_gd.reset();
340411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
340511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
340611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
340711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
340811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
340911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
341011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      n() const
341111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.n(); }
341211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
341311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
341411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
341511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
341611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
341711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
341811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
341911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
342011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
342111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
342211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
342311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
342411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
342511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
342611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
342711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
342811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
342911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
343011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
343111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
343211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
343311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::lowest(); }
343411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
343511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
343611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
343711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
343811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
343911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
344011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
344111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
344211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
344311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
344411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
344511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
344611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
344711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator()(_UniformRandomNumberGenerator& __urng)
344811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); }
344911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
345011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
345111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
345211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
345311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
345411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
345511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename std::gamma_distribution<result_type>::param_type
345611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    param_type;
345711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
345811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2));
345911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return _M_nd(__urng) * std::sqrt(__p.n() / __g);
346011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
346111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
346211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
346311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
346411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
346511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
346611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
346711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
346811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
346911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
347011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
347111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
347211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
347311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
347411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
347511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
347611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
347711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
347811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
347911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
348011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
348111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
348211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
348311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
348411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
348511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
348611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
348711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
348811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
348911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
349011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
349111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two Student t distributions have
349211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would
349311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        be generated are equal.
349411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
349511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
349611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const student_t_distribution& __d1,
349711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const student_t_distribution& __d2)
349811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return (__d1._M_param == __d2._M_param
349911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		&& __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); }
350011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
350111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
350211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %student_t_distribution random number distribution
350311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
350411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
350511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
350611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %student_t_distribution random number distribution.
350711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
350811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
350911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
351011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
351111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
351211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
351311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
351411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::student_t_distribution<_RealType1>& __x);
351511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
351611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
351711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %student_t_distribution random number distribution
351811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
351911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
352011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
352111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %student_t_distribution random number
352211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
352311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
352411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
352511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
352611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
352711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
352811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
352911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::student_t_distribution<_RealType1>& __x);
353011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
353111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
353211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
353311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
353411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
353511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
353611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng);
353711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
353811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
353911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
354011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
354111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
354211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
354311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
354411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
354511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
354611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::normal_distribution<result_type> _M_nd;
354711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::gamma_distribution<result_type> _M_gd;
354811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
354911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
355011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
355111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Student t distributions are different.
355211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
355311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
355411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
355511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::student_t_distribution<_RealType>& __d1,
355611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::student_t_distribution<_RealType>& __d2)
355711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
355811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
355911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
356011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_distributions_normal
356111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
356211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
356311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_distributions_bernoulli Bernoulli Distributions
356411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random_distributions
356511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
356611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
356711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
356811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
356911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A Bernoulli random number distribution.
357011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
357111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Generates a sequence of true and false values with likelihood @f$p@f$
357211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * that true will come up and @f$(1 - p)@f$ that false will appear.
357311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
357411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class bernoulli_distribution
357511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
357611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
357711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /** The type of the range of the distribution. */
357811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef bool result_type;
357911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /** Parameter type. */
358011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct param_type
358111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
358211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef bernoulli_distribution distribution_type;
358311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
358411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
358511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type(double __p = 0.5)
358611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_p(__p)
358711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
358811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
358911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
359011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
359111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double
359211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      p() const
359311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_p; }
359411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
359511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
359611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const param_type& __p1, const param_type& __p2)
359711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __p1._M_p == __p2._M_p; }
359811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
359911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
360011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double _M_p;
360111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
360211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
360311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
360411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
360511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Constructs a Bernoulli distribution with likelihood @p p.
360611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     *
360711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @param __p  [IN]  The likelihood of a true result being returned.
360811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     *                   Must be in the interval @f$[0, 1]@f$.
360911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
361011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    explicit
361111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bernoulli_distribution(double __p = 0.5)
361211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_param(__p)
361311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { }
361411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
361511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    explicit
361611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bernoulli_distribution(const param_type& __p)
361711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_param(__p)
361811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { }
361911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
362011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
362111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Resets the distribution state.
362211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     *
362311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * Does nothing for a Bernoulli distribution.
362411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
362511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
362611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    reset() { }
362711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
362811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
362911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Returns the @p p parameter of the distribution.
363011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
363111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    double
363211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    p() const
363311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return _M_param.p(); }
363411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
363511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
363611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Returns the parameter set of the distribution.
363711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
363811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    param_type
363911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    param() const
364011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return _M_param; }
364111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
364211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
364311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Sets the parameter set of the distribution.
364411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @param __param The new parameter set of the distribution.
364511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
364611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
364711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    param(const param_type& __param)
364811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { _M_param = __param; }
364911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
365011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
365111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Returns the greatest lower bound value of the distribution.
365211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
365311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    result_type
365411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    min() const
365511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::numeric_limits<result_type>::min(); }
365611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
365711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
365811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Returns the least upper bound value of the distribution.
365911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
366011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    result_type
366111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    max() const
366211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::numeric_limits<result_type>::max(); }
366311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
366411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
366511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Generating functions.
366611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
366711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _UniformRandomNumberGenerator>
366811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
366911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_UniformRandomNumberGenerator& __urng)
367011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->operator()(__urng, _M_param); }
367111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
367211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _UniformRandomNumberGenerator>
367311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
367411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_UniformRandomNumberGenerator& __urng,
367511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const param_type& __p)
367611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
367711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__detail::_Adaptor<_UniformRandomNumberGenerator, double>
367811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __aurng(__urng);
367911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if ((__aurng() - __aurng.min())
368011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     < __p.p() * (__aurng.max() - __aurng.min()))
368111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return true;
368211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return false;
368311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
368411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
368511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _ForwardIterator,
368611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     typename _UniformRandomNumberGenerator>
368711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
368811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __generate(_ForwardIterator __f, _ForwardIterator __t,
368911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 _UniformRandomNumberGenerator& __urng)
369011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { this->__generate(__f, __t, __urng, _M_param); }
369111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
369211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _ForwardIterator,
369311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     typename _UniformRandomNumberGenerator>
369411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
369511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __generate(_ForwardIterator __f, _ForwardIterator __t,
369611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 _UniformRandomNumberGenerator& __urng, const param_type& __p)
369711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { this->__generate_impl(__f, __t, __urng, __p); }
369811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
369911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _UniformRandomNumberGenerator>
370011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
370111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __generate(result_type* __f, result_type* __t,
370211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 _UniformRandomNumberGenerator& __urng,
370311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const param_type& __p)
370411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { this->__generate_impl(__f, __t, __urng, __p); }
370511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
370611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /**
370711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     * @brief Return true if two Bernoulli distributions have
370811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     *        the same parameters.
370911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     */
371011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    friend bool
371111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator==(const bernoulli_distribution& __d1,
371211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const bernoulli_distribution& __d2)
371311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return __d1._M_param == __d2._M_param; }
371411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
371511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  private:
371611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _ForwardIterator,
371711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     typename _UniformRandomNumberGenerator>
371811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
371911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
372011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      _UniformRandomNumberGenerator& __urng,
372111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      const param_type& __p);
372211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
372311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    param_type _M_param;
372411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
372511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
372611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
372711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Bernoulli distributions have
372811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        different parameters.
372911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
373011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  inline bool
373111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator!=(const std::bernoulli_distribution& __d1,
373211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     const std::bernoulli_distribution& __d2)
373311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { return !(__d1 == __d2); }
373411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
373511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
373611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %bernoulli_distribution random number distribution
373711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
373811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
373911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
374011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %bernoulli_distribution random number distribution.
374111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
374211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
374311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
374411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
374511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _Traits>
374611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
374711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
374811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::bernoulli_distribution& __x);
374911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
375011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
375111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %bernoulli_distribution random number distribution
375211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
375311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
375411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
375511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %bernoulli_distribution random number generator engine.
375611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
375711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
375811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
375911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _Traits>
376011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
376111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
376211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::bernoulli_distribution& __x)
376311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
376411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double __p;
376511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __is >> __p;
376611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __x.param(bernoulli_distribution::param_type(__p));
376711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return __is;
376811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
376911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
377011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
377111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
377211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A discrete binomial random number distribution.
377311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
377411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the binomial probability density function is
377511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(i|t,p) = \binom{t}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
377611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * and @f$p@f$ are the parameters of the distribution.
377711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
377811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
377911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class binomial_distribution
378011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
378111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
378211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
378311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
378411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
378511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
378611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType result_type;
378711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
378811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
378911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
379011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef binomial_distribution<_IntType> distribution_type;
379111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class binomial_distribution<_IntType>;
379211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
379311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
379411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_IntType __t = _IntType(1), double __p = 0.5)
379511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_t(__t), _M_p(__p)
379611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
379711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0))
379811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				&& (_M_p >= 0.0)
379911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				&& (_M_p <= 1.0));
380011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_initialize();
380111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
380211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
380311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType
380411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	t() const
380511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_t; }
380611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
380711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double
380811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	p() const
380911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_p; }
381011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
381111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
381211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
381311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; }
381411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
381511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
381611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
381711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
381811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
381911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType _M_t;
382011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_p;
382111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
382211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_q;
382311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _GLIBCXX_USE_C99_MATH_TR1
382411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
382511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
382611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
382711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	bool   _M_easy;
382811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
382911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
383011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // constructors and member function
383111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
383211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      binomial_distribution(_IntType __t = _IntType(1),
383311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    double __p = 0.5)
383411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__t, __p), _M_nd()
383511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
383611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
383711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
383811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      binomial_distribution(const param_type& __p)
383911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_nd()
384011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
384111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
384211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
384311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
384411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
384511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
384611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
384711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_nd.reset(); }
384811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
384911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
385011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the distribution @p t parameter.
385111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
385211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _IntType
385311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      t() const
385411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.t(); }
385511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
385611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
385711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the distribution @p p parameter.
385811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
385911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double
386011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      p() const
386111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.p(); }
386211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
386311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
386411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
386511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
386611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
386711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
386811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
386911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
387011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
387111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
387211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
387311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
387411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
387511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
387611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
387711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
387811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
387911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
388011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
388111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
388211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
388311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0; }
388411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
388511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
388611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
388711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
388811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
388911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
389011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.t(); }
389111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
389211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
389311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
389411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
389511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
389611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
389711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
389811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
389911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
390011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
390111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
390211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
390311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
390411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
390511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
390611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
390711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
390811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
390911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
391011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
391111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
391211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
391311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
391411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
391511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
391611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
391711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
391811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
391911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
392011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
392111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
392211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
392311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
392411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
392511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
392611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
392711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
392811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two binomial distributions have
392911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would
393011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        be generated are equal.
393111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
393211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
393311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator==(const binomial_distribution& __d1,
393411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const binomial_distribution& __d2)
393511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_C99_MATH_TR1
393611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; }
393711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
393811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return __d1._M_param == __d2._M_param; }
393911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
394011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
394111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
394211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %binomial_distribution random number distribution
394311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
394411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
394511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
394611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %binomial_distribution random number distribution.
394711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
394811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
394911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
395011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
395111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1,
395211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
395311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
395411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
395511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::binomial_distribution<_IntType1>& __x);
395611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
395711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
395811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %binomial_distribution random number distribution
395911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
396011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
396111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
396211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %binomial_distribution random number generator engine.
396311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
396411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
396511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
396611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
396711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1,
396811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _CharT, typename _Traits>
396911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
397011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
397111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::binomial_distribution<_IntType1>& __x);
397211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
397311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
397411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
397511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
397611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
397711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
397811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
397911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
398011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
398111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
398211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
398311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_waiting(_UniformRandomNumberGenerator& __urng,
398411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _IntType __t, double __q);
398511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
398611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
398711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
398811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
398911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::normal_distribution<double> _M_nd;
399011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
399111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
399211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
399311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two binomial distributions are different.
399411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
399511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
399611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
399711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::binomial_distribution<_IntType>& __d1,
399811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::binomial_distribution<_IntType>& __d2)
399911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
400011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
400111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
400211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
400311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A discrete geometric random number distribution.
400411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
400511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the geometric probability density function is
400611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
400711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * distribution.
400811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
400911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
401011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class geometric_distribution
401111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
401211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
401311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
401411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
401511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
401611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
401711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType  result_type;
401811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
401911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
402011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
402111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef geometric_distribution<_IntType> distribution_type;
402211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class geometric_distribution<_IntType>;
402311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
402411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
402511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(double __p = 0.5)
402611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_p(__p)
402711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
402811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
402911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_initialize();
403011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
403111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
403211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double
403311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	p() const
403411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_p; }
403511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
403611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
403711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
403811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_p == __p2._M_p; }
403911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
404011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
404111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
404211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize()
404311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ _M_log_1_p = std::log(1.0 - _M_p); }
404411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
404511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_p;
404611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
404711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_log_1_p;
404811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
404911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
405011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // constructors and member function
405111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
405211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      geometric_distribution(double __p = 0.5)
405311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
405411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
405511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
405611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
405711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      geometric_distribution(const param_type& __p)
405811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
405911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
406011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
406111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
406211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
406311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
406411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Does nothing for the geometric distribution.
406511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
406611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
406711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset() { }
406811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
406911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
407011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the distribution parameter @p p.
407111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
407211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double
407311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      p() const
407411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.p(); }
407511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
407611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
407711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
407811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
407911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
408011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
408111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
408211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
408311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
408411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
408511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
408611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
408711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
408811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
408911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
409011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
409111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
409211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
409311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
409411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
409511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
409611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0; }
409711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
409811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
409911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
410011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
410111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
410211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
410311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
410411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
410511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
410611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
410711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
410811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
410911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
411011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
411111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
411211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
411311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
411411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
411511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
411611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
411711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
411811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
411911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
412011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
412111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
412211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
412311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
412411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
412511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
412611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
412711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
412811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
412911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
413011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
413111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
413211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
413311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
413411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
413511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
413611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
413711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
413811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
413911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
414011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
414111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two geometric distributions have
414211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters.
414311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
414411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
414511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const geometric_distribution& __d1,
414611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const geometric_distribution& __d2)
414711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
414811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
414911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
415011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
415111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
415211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
415311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
415411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
415511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
415611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
415711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
415811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
415911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
416011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
416111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two geometric distributions have
416211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        different parameters.
416311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
416411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
416511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
416611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::geometric_distribution<_IntType>& __d1,
416711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::geometric_distribution<_IntType>& __d2)
416811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
416911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
417011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
417111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %geometric_distribution random number distribution
417211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
417311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
417411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
417511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %geometric_distribution random number distribution.
417611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
417711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
417811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
417911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
418011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType,
418111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _CharT, typename _Traits>
418211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
418311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
418411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::geometric_distribution<_IntType>& __x);
418511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
418611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
418711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %geometric_distribution random number distribution
418811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
418911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
419011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
419111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %geometric_distribution random number generator engine.
419211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
419311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
419411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
419511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType,
419611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _CharT, typename _Traits>
419711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
419811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
419911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::geometric_distribution<_IntType>& __x);
420011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
420111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
420211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
420311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A negative_binomial_distribution random number distribution.
420411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
420511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the negative binomial probability mass function is
420611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
420711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * and @f$p@f$ are the parameters of the distribution.
420811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
420911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
421011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class negative_binomial_distribution
421111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
421211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
421311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
421411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
421511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
421611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
421711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType result_type;
421811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
421911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
422011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
422111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef negative_binomial_distribution<_IntType> distribution_type;
422211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
422311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
422411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_IntType __k = 1, double __p = 0.5)
422511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_k(__k), _M_p(__p)
422611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
422711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0));
422811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
422911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
423011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType
423111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	k() const
423211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_k; }
423311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
423411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double
423511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	p() const
423611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_p; }
423711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
423811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
423911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
424011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; }
424111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
424211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
424311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_IntType _M_k;
424411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_p;
424511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
424611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
424711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
424811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
424911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
425011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
425111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
425211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
425311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      negative_binomial_distribution(const param_type& __p)
425411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
425511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
425611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
425711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
425811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
425911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
426011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
426111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
426211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_gd.reset(); }
426311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
426411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
426511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$k@f$ parameter of the distribution.
426611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
426711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _IntType
426811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      k() const
426911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.k(); }
427011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
427111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
427211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$p@f$ parameter of the distribution.
427311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
427411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double
427511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      p() const
427611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.p(); }
427711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
427811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
427911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
428011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
428111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
428211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
428311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
428411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
428511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
428611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
428711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
428811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
428911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
429011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
429111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
429211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
429311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
429411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
429511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
429611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
429711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
429811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
429911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
430011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
430111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
430211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
430311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
430411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
430511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
430611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
430711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
430811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
430911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
431011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
431111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
431211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator()(_UniformRandomNumberGenerator& __urng);
431311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
431411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
431511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
431611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
431711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
431811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
431911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
432011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
432111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
432211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
432311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
432411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
432511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
432611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
432711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
432811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
432911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
433011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
433111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
433211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
433311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
433411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
433511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
433611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
433711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
433811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng); }
433911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
434011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
434111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
434211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
434311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
434411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
434511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
434611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
434711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
434811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two negative binomial distributions have
434911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        the same parameters and the sequences that would be
435011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        generated are equal.
435111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
435211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
435311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const negative_binomial_distribution& __d1,
435411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const negative_binomial_distribution& __d2)
435511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; }
435611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
435711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
435811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %negative_binomial_distribution random
435911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        number distribution @p __x into the output stream @p __os.
436011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
436111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
436211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %negative_binomial_distribution random number
436311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             distribution.
436411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
436511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
436611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          an error state.
436711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
436811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
436911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
437011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
437111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::negative_binomial_distribution<_IntType1>& __x);
437211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
437311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
437411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %negative_binomial_distribution random number
437511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        distribution @p __x from the input stream @p __is.
437611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
437711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
437811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %negative_binomial_distribution random number
437911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
438011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
438111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error state.
438211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
438311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
438411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
438511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
438611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::negative_binomial_distribution<_IntType1>& __x);
438711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
438811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
438911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
439011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
439111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
439211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
439311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng);
439411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
439511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
439611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
439711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
439811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
439911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
440011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
440111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
440211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
440311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::gamma_distribution<double> _M_gd;
440411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
440511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
440611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
440711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two negative binomial distributions are different.
440811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
440911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
441011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
441111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::negative_binomial_distribution<_IntType>& __d1,
441211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::negative_binomial_distribution<_IntType>& __d2)
441311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
441411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
441511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
441611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_distributions_bernoulli
441711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
441811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
441911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_distributions_poisson Poisson Distributions
442011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random_distributions
442111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
442211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
442311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
442411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
442511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A discrete Poisson random number distribution.
442611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
442711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the Poisson probability density function is
442811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the
442911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * parameter of the distribution.
443011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
443111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
443211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class poisson_distribution
443311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
443411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
443511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
443611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
443711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
443811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
443911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType  result_type;
444011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
444111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
444211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
444311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef poisson_distribution<_IntType> distribution_type;
444411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class poisson_distribution<_IntType>;
444511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
444611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
444711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(double __mean = 1.0)
444811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_mean(__mean)
444911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
445011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
445111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_initialize();
445211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
445311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
445411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double
445511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	mean() const
445611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_mean; }
445711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
445811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
445911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
446011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_mean == __p2._M_mean; }
446111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
446211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
446311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// Hosts either log(mean) or the threshold of the simple method.
446411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
446511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
446611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
446711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_mean;
446811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
446911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_lm_thr;
447011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _GLIBCXX_USE_C99_MATH_TR1
447111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
447211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
447311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
447411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
447511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // constructors and member function
447611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
447711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      poisson_distribution(double __mean = 1.0)
447811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__mean), _M_nd()
447911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
448011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
448111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
448211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      poisson_distribution(const param_type& __p)
448311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p), _M_nd()
448411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
448511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
448611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
448711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
448811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
448911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
449011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
449111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_nd.reset(); }
449211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
449311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
449411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the distribution parameter @p mean.
449511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
449611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      double
449711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mean() const
449811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.mean(); }
449911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
450011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
450111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
450211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
450311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
450411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
450511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
450611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
450711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
450811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
450911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
451011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
451111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
451211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
451311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
451411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
451511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
451611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
451711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
451811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
451911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
452011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return 0; }
452111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
452211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
452311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
452411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
452511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
452611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
452711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
452811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
452911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
453011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
453111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
453211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
453311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
453411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
453511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
453611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
453711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
453811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
453911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
454011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
454111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
454211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
454311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
454411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
454511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
454611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
454711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
454811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
454911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
455011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
455111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
455211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
455311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
455411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
455511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
455611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
455711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
455811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
455911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
456011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
456111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
456211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
456311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
456411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       /**
456511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	* @brief Return true if two Poisson distributions have the same
456611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	*        parameters and the sequences that would be generated
456711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	*        are equal.
456811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	*/
456911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
457011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const poisson_distribution& __d1,
457111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const poisson_distribution& __d2)
457211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_C99_MATH_TR1
457311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; }
457411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
457511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
457611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
457711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
457811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
457911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %poisson_distribution random number distribution
458011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
458111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
458211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
458311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %poisson_distribution random number distribution.
458411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
458511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
458611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
458711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
458811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
458911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
459011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
459111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::poisson_distribution<_IntType1>& __x);
459211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
459311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
459411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %poisson_distribution random number distribution
459511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
459611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
459711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
459811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %poisson_distribution random number generator engine.
459911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
460011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
460111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
460211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
460311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
460411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
460511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
460611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::poisson_distribution<_IntType1>& __x);
460711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
460811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
460911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
461011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
461111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
461211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
461311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
461411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
461511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
461611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
461711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
461811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
461911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::normal_distribution<double> _M_nd;
462011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
462111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
462211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
462311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two Poisson distributions are different.
462411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
462511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
462611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
462711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::poisson_distribution<_IntType>& __d1,
462811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::poisson_distribution<_IntType>& __d2)
462911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
463011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
463111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
463211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
463311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief An exponential continuous distribution for random numbers.
463411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
463511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the exponential probability density function is
463611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$.
463711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
463811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <table border=1 cellpadding=10 cellspacing=0>
463911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <caption align=top>Distribution Statistics</caption>
464011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
464111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr>
464211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>Mode</td><td>@f$zero@f$</td></tr>
464311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
464411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
464511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * </table>
464611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
464711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
464811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class exponential_distribution
464911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
465011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
465111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
465211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
465311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
465411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
465511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
465611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
465711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
465811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
465911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef exponential_distribution<_RealType> distribution_type;
466011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
466111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
466211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __lambda = _RealType(1))
466311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_lambda(__lambda)
466411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
466511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0));
466611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
466711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
466811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
466911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	lambda() const
467011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_lambda; }
467111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
467211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
467311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
467411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_lambda == __p2._M_lambda; }
467511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
467611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
467711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_lambda;
467811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
467911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
468011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
468111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
468211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Constructs an exponential distribution with inverse scale
468311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameter @f$\lambda@f$.
468411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
468511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
468611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      exponential_distribution(const result_type& __lambda = result_type(1))
468711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__lambda)
468811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
468911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
469011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
469111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      exponential_distribution(const param_type& __p)
469211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
469311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
469411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
469511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
469611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
469711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
469811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Has no effect on exponential distributions.
469911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
470011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
470111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset() { }
470211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
470311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
470411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the inverse scale parameter of the distribution.
470511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
470611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
470711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      lambda() const
470811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.lambda(); }
470911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
471011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
471111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
471211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
471311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
471411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
471511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
471611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
471711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
471811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
471911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
472011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
472111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
472211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
472311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
472411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
472511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
472611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
472711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
472811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
472911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
473011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
473111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
473211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
473311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
473411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
473511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
473611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
473711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
473811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
473911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
474011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
474111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
474211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
474311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
474411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
474511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return this->operator()(__urng, _M_param); }
474611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
474711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
474811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
474911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
475011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
475111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
475211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
475311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __aurng(__urng);
475411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return -std::log(result_type(1) - __aurng()) / __p.lambda();
475511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
475611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
475711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
475811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
475911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
476011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
476111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
476211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
476311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
476411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
476511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
476611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
476711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
476811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
476911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
477011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
477111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
477211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
477311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
477411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
477511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
477611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
477711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
477811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
477911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
478011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two exponential distributions have the same
478111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameters.
478211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
478311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
478411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const exponential_distribution& __d1,
478511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const exponential_distribution& __d2)
478611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
478711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
478811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
478911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
479011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
479111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
479211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
479311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
479411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
479511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
479611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
479711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
479811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
479911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
480011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Return true if two exponential distributions have different
480111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        parameters.
480211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
480311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
480411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
480511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::exponential_distribution<_RealType>& __d1,
480611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::exponential_distribution<_RealType>& __d2)
480711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
480811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
480911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
481011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %exponential_distribution random number distribution
481111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
481211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
481311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
481411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %exponential_distribution random number distribution.
481511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
481611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
481711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
481811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
481911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
482011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
482111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
482211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::exponential_distribution<_RealType>& __x);
482311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
482411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
482511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %exponential_distribution random number distribution
482611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
482711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
482811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
482911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x A %exponential_distribution random number
483011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *            generator engine.
483111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
483211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
483311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
483411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
483511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
483611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
483711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::exponential_distribution<_RealType>& __x);
483811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
483911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
484011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
484111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A weibull_distribution random number distribution.
484211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
484311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability density function is:
484411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
484511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1}
484611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                         \exp{(-(\frac{x}{\beta})^\alpha)}
484711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
484811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
484911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
485011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class weibull_distribution
485111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
485211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
485311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
485411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
485511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
485611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
485711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
485811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
485911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
486011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
486111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef weibull_distribution<_RealType> distribution_type;
486211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
486311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
486411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __a = _RealType(1),
486511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __b = _RealType(1))
486611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_a(__a), _M_b(__b)
486711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
486811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
486911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
487011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	a() const
487111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_a; }
487211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
487311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
487411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	b() const
487511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_b; }
487611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
487711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
487811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
487911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
488011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
488111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
488211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_a;
488311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_b;
488411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
488511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
488611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
488711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      weibull_distribution(_RealType __a = _RealType(1),
488811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _RealType __b = _RealType(1))
488911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__a, __b)
489011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
489111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
489211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
489311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      weibull_distribution(const param_type& __p)
489411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
489511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
489611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
489711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
489811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
489911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
490011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
490111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
490211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
490311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
490411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
490511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$a@f$ parameter of the distribution.
490611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
490711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
490811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      a() const
490911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.a(); }
491011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
491111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
491211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$b@f$ parameter of the distribution.
491311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
491411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
491511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      b() const
491611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.b(); }
491711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
491811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
491911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
492011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
492111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
492211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
492311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
492411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
492511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
492611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
492711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
492811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
492911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
493011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
493111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
493211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
493311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
493411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
493511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
493611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
493711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
493811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
493911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
494011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
494111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
494211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
494311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
494411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
494511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
494611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
494711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
494811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
494911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
495011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
495111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
495211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
495311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
495411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
495511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
495611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
495711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
495811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
495911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
496011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
496111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
496211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
496311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
496411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
496511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
496611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
496711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
496811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
496911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
497011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
497111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
497211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
497311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
497411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
497511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
497611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
497711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
497811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
497911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
498011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
498111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
498211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
498311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two Weibull distributions have the same
498411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameters.
498511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
498611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
498711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const weibull_distribution& __d1,
498811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const weibull_distribution& __d2)
498911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
499011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
499111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
499211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
499311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
499411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
499511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
499611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
499711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
499811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
499911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
500011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
500111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
500211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   /**
500311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    * @brief Return true if two Weibull distributions have different
500411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *        parameters.
500511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    */
500611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
500711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
500811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::weibull_distribution<_RealType>& __d1,
500911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::weibull_distribution<_RealType>& __d2)
501011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
501111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
501211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
501311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %weibull_distribution random number distribution
501411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
501511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
501611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
501711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %weibull_distribution random number distribution.
501811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
501911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
502011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
502111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
502211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
502311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
502411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
502511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::weibull_distribution<_RealType>& __x);
502611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
502711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
502811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %weibull_distribution random number distribution
502911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x from the input stream @p __is.
503011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
503111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
503211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x A %weibull_distribution random number
503311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *            generator engine.
503411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
503511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
503611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
503711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
503811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
503911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
504011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::weibull_distribution<_RealType>& __x);
504111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
504211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
504311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
504411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A extreme_value_distribution random number distribution.
504511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
504611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the normal probability mass function is
504711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f[
504811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *     p(x|a,b) = \frac{1}{b}
504911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *                \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b}))
505011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @f]
505111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
505211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
505311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class extreme_value_distribution
505411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
505511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
505611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
505711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
505811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
505911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
506011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
506111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
506211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
506311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
506411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef extreme_value_distribution<_RealType> distribution_type;
506511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
506611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	explicit
506711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(_RealType __a = _RealType(0),
506811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _RealType __b = _RealType(1))
506911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_a(__a), _M_b(__b)
507011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
507111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
507211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
507311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	a() const
507411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_a; }
507511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
507611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType
507711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	b() const
507811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_b; }
507911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
508011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
508111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
508211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
508311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
508411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
508511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_a;
508611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_RealType _M_b;
508711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
508811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
508911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
509011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      extreme_value_distribution(_RealType __a = _RealType(0),
509111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				 _RealType __b = _RealType(1))
509211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__a, __b)
509311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
509411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
509511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
509611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      extreme_value_distribution(const param_type& __p)
509711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
509811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
509911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
510011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
510111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
510211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
510311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
510411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
510511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
510611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
510711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
510811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$a@f$ parameter of the distribution.
510911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
511011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
511111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      a() const
511211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.a(); }
511311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
511411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
511511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the @f$b@f$ parameter of the distribution.
511611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
511711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RealType
511811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      b() const
511911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param.b(); }
512011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
512111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
512211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
512311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
512411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
512511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
512611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
512711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
512811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
512911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
513011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
513111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
513211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
513311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
513411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
513511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
513611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
513711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
513811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
513911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
514011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
514111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::lowest(); }
514211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
514311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
514411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
514511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
514611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
514711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
514811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return std::numeric_limits<result_type>::max(); }
514911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
515011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
515111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
515211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
515311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
515411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
515511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
515611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
515711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
515811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
515911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
516011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
516111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
516211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
516311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
516411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
516511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
516611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
516711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
516811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
516911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
517011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
517111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
517211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
517311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
517411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
517511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
517611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
517711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
517811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
517911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
518011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
518111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
518211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
518311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
518411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
518511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
518611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two extreme value distributions have the same
518711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameters.
518811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
518911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
519011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const extreme_value_distribution& __d1,
519111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const extreme_value_distribution& __d2)
519211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
519311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
519411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
519511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
519611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
519711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
519811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
519911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
520011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
520111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
520211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
520311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
520411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
520511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
520611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    * @brief Return true if two extreme value distributions have different
520711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *        parameters.
520811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
520911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
521011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
521111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::extreme_value_distribution<_RealType>& __d1,
521211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::extreme_value_distribution<_RealType>& __d2)
521311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
521411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
521511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
521611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Inserts a %extreme_value_distribution random number distribution
521711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @p __x into the output stream @p __os.
521811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
521911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __os An output stream.
522011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x  A %extreme_value_distribution random number distribution.
522111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
522211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The output stream with the state of @p __x inserted or in
522311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * an error state.
522411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
522511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
522611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_ostream<_CharT, _Traits>&
522711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
522811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::extreme_value_distribution<_RealType>& __x);
522911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
523011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
523111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Extracts a %extreme_value_distribution random number
523211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        distribution @p __x from the input stream @p __is.
523311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
523411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __is An input stream.
523511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @param __x A %extreme_value_distribution random number
523611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *            generator engine.
523711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
523811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @returns The input stream with @p __x extracted or in an error state.
523911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
524011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType, typename _CharT, typename _Traits>
524111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::basic_istream<_CharT, _Traits>&
524211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator>>(std::basic_istream<_CharT, _Traits>& __is,
524311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       std::extreme_value_distribution<_RealType>& __x);
524411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
524511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
524611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
524711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A discrete_distribution random number distribution.
524811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
524911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the discrete probability mass function is
525011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
525111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
525211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType = int>
525311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class discrete_distribution
525411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
525511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_integral<_IntType>::value,
525611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not an integral type");
525711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
525811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
525911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
526011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IntType result_type;
526111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
526211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
526311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
526411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef discrete_distribution<_IntType> distribution_type;
526511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class discrete_distribution<_IntType>;
526611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
526711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type()
526811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_prob(), _M_cp()
526911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
527011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
527111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _InputIterator>
527211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(_InputIterator __wbegin,
527311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _InputIterator __wend)
527411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  : _M_prob(__wbegin, __wend), _M_cp()
527511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  { _M_initialize(); }
527611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
527711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(initializer_list<double> __wil)
527811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_prob(__wil.begin(), __wil.end()), _M_cp()
527911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ _M_initialize(); }
528011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
528111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _Func>
528211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(size_t __nw, double __xmin, double __xmax,
528311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _Func __fw);
528411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
528511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
528611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(const param_type&) = default;
528711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type& operator=(const param_type&) = default;
528811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
528911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double>
529011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	probabilities() const
529111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; }
529211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
529311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
529411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
529511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_prob == __p2._M_prob; }
529611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
529711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
529811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
529911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
530011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
530111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_prob;
530211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_cp;
530311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
530411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
530511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discrete_distribution()
530611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param()
530711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
530811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
530911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _InputIterator>
531011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	discrete_distribution(_InputIterator __wbegin,
531111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator __wend)
531211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__wbegin, __wend)
531311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
531411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
531511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discrete_distribution(initializer_list<double> __wl)
531611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__wl)
531711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
531811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
531911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Func>
532011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	discrete_distribution(size_t __nw, double __xmin, double __xmax,
532111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _Func __fw)
532211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__nw, __xmin, __xmax, __fw)
532311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
532411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
532511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
532611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      discrete_distribution(const param_type& __p)
532711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
532811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
532911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
533011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
533111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
533211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
533311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
533411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
533511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
533611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
533711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
533811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the probabilities of the distribution.
533911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
534011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<double>
534111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      probabilities() const
534211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
534311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_prob.empty()
534411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? std::vector<double>(1, 1.0) : _M_param._M_prob;
534511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
534611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
534711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
534811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
534911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
535011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
535111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
535211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
535311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
535411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
535511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
535611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
535711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
535811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
535911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
536011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
536111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
536211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
536311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
536411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
536511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
536611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
536711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return result_type(0); }
536811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
536911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
537011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
537111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
537211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
537311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
537411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
537511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_prob.empty()
537611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
537711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
537811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
537911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
538011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
538111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
538211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
538311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
538411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
538511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
538611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
538711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
538811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
538911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
539011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
539111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
539211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
539311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
539411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
539511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
539611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
539711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
539811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
539911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
540011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
540111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
540211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
540311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
540411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
540511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
540611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
540711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
540811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
540911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
541011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
541111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
541211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
541311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
541411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
541511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two discrete distributions have the same
541611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        parameters.
541711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
541811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
541911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const discrete_distribution& __d1,
542011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const discrete_distribution& __d2)
542111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
542211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
542311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
542411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %discrete_distribution random number distribution
542511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x into the output stream @p __os.
542611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
542711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
542811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %discrete_distribution random number distribution.
542911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
543011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
543111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
543211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
543311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
543411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
543511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
543611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::discrete_distribution<_IntType1>& __x);
543711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
543811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
543911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %discrete_distribution random number distribution
544011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @p __x from the input stream @p __is.
544111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
544211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
544311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %discrete_distribution random number
544411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
544511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
544611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
544711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
544811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
544911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _IntType1, typename _CharT, typename _Traits>
545011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
545111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
545211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::discrete_distribution<_IntType1>& __x);
545311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
545411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
545511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
545611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
545711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
545811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
545911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
546011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
546111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
546211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
546311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
546411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
546511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
546611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    * @brief Return true if two discrete distributions have different
546711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *        parameters.
546811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    */
546911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _IntType>
547011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
547111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::discrete_distribution<_IntType>& __d1,
547211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::discrete_distribution<_IntType>& __d2)
547311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
547411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
547511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
547611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
547711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A piecewise_constant_distribution random number distribution.
547811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
547911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the piecewise constant probability mass function is
548011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
548111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
548211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
548311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class piecewise_constant_distribution
548411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
548511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
548611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
548711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
548811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
548911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
549011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
549111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
549211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
549311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
549411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef piecewise_constant_distribution<_RealType> distribution_type;
549511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class piecewise_constant_distribution<_RealType>;
549611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
549711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type()
549811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_int(), _M_den(), _M_cp()
549911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
550011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
550111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _InputIteratorB, typename _InputIteratorW>
550211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(_InputIteratorB __bfirst,
550311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _InputIteratorB __bend,
550411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _InputIteratorW __wbegin);
550511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
550611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _Func>
550711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(initializer_list<_RealType> __bi, _Func __fw);
550811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
550911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _Func>
551011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
551111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _Func __fw);
551211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
551311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
551411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(const param_type&) = default;
551511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type& operator=(const param_type&) = default;
551611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
551711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<_RealType>
551811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	intervals() const
551911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
552011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (_M_int.empty())
552111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
552211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::vector<_RealType> __tmp(2);
552311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __tmp[1] = _RealType(1);
552411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      return __tmp;
552511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
552611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  else
552711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    return _M_int;
552811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
552911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
553011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double>
553111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	densities() const
553211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; }
553311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
553411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
553511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
553611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; }
553711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
553811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
553911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
554011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
554111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
554211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<_RealType> _M_int;
554311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_den;
554411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_cp;
554511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
554611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
554711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
554811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      piecewise_constant_distribution()
554911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param()
555011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
555111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
555211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _InputIteratorB, typename _InputIteratorW>
555311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_constant_distribution(_InputIteratorB __bfirst,
555411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_InputIteratorB __bend,
555511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_InputIteratorW __wbegin)
555611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__bfirst, __bend, __wbegin)
555711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
555811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
555911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Func>
556011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_constant_distribution(initializer_list<_RealType> __bl,
556111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_Func __fw)
556211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__bl, __fw)
556311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
556411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
556511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Func>
556611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_constant_distribution(size_t __nw,
556711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_RealType __xmin, _RealType __xmax,
556811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_Func __fw)
556911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__nw, __xmin, __xmax, __fw)
557011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
557111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
557211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
557311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      piecewise_constant_distribution(const param_type& __p)
557411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
557511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
557611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
557711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
557811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Resets the distribution state.
557911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
558011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
558111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
558211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
558311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
558411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
558511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns a vector of the intervals.
558611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
558711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<_RealType>
558811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      intervals() const
558911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
559011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (_M_param._M_int.empty())
559111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  {
559211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    std::vector<_RealType> __tmp(2);
559311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __tmp[1] = _RealType(1);
559411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    return __tmp;
559511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  }
559611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	else
559711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return _M_param._M_int;
559811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
559911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
560011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
560111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns a vector of the probability densities.
560211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
560311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<double>
560411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      densities() const
560511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
560611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_den.empty()
560711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? std::vector<double>(1, 1.0) : _M_param._M_den;
560811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
560911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
561011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
561111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
561211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
561311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
561411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
561511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
561611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
561711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
561811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
561911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
562011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
562111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
562211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
562311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
562411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
562511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
562611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
562711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
562811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
562911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
563011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
563111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_int.empty()
563211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? result_type(0) : _M_param._M_int.front();
563311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
563411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
563511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
563611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
563711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
563811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
563911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
564011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
564111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_int.empty()
564211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? result_type(1) : _M_param._M_int.back();
564311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
564411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
564511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
564611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
564711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
564811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
564911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
565011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
565111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
565211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
565311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
565411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
565511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
565611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
565711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
565811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
565911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
566011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
566111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
566211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
566311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
566411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
566511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
566611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
566711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
566811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
566911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
567011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
567111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
567211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
567311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
567411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
567511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
567611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
567711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
567811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
567911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
568011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
568111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two piecewise constant distributions have the
568211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        same parameters.
568311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
568411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
568511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const piecewise_constant_distribution& __d1,
568611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const piecewise_constant_distribution& __d2)
568711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
568811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
568911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
569011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %piecewise_constant_distribution random
569111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        number distribution @p __x into the output stream @p __os.
569211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
569311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
569411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %piecewise_constant_distribution random number
569511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             distribution.
569611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
569711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
569811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * an error state.
569911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
570011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
570111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
570211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
570311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::piecewise_constant_distribution<_RealType1>& __x);
570411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
570511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
570611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %piecewise_constant_distribution random
570711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        number distribution @p __x from the input stream @p __is.
570811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
570911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
571011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x A %piecewise_constant_distribution random number
571111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *            generator engine.
571211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
571311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
571411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
571511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
571611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
571711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
571811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
571911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::piecewise_constant_distribution<_RealType1>& __x);
572011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
572111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
572211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
572311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
572411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
572511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
572611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
572711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
572811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
572911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
573011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
573111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
573211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
573311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    * @brief Return true if two piecewise constant distributions have
573411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *        different parameters.
573511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
573611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
573711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
573811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::piecewise_constant_distribution<_RealType>& __d1,
573911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::piecewise_constant_distribution<_RealType>& __d2)
574011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
574111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
574211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
574311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
574411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief A piecewise_linear_distribution random number distribution.
574511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
574611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The formula for the piecewise linear probability mass function is
574711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
574811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
574911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType = double>
575011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class piecewise_linear_distribution
575111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
575211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static_assert(std::is_floating_point<_RealType>::value,
575311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    "template argument not a floating point type");
575411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
575511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
575611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** The type of the range of the distribution. */
575711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RealType result_type;
575811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** Parameter type. */
575911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct param_type
576011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
576111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	typedef piecewise_linear_distribution<_RealType> distribution_type;
576211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend class piecewise_linear_distribution<_RealType>;
576311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
576411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type()
576511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_int(), _M_den(), _M_cp(), _M_m()
576611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
576711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
576811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _InputIteratorB, typename _InputIteratorW>
576911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(_InputIteratorB __bfirst,
577011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _InputIteratorB __bend,
577111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _InputIteratorW __wbegin);
577211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
577311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _Func>
577411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(initializer_list<_RealType> __bl, _Func __fw);
577511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
577611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	template<typename _Func>
577711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
577811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     _Func __fw);
577911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
578011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
578111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type(const param_type&) = default;
578211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	param_type& operator=(const param_type&) = default;
578311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
578411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<_RealType>
578511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	intervals() const
578611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
578711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (_M_int.empty())
578811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
578911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::vector<_RealType> __tmp(2);
579011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __tmp[1] = _RealType(1);
579111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      return __tmp;
579211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
579311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  else
579411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    return _M_int;
579511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
579611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
579711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double>
579811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	densities() const
579911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; }
580011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
580111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend bool
580211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator==(const param_type& __p1, const param_type& __p2)
580311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return (__p1._M_int == __p2._M_int
580411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  && __p1._M_den == __p2._M_den); }
580511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
580611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      private:
580711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
580811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_initialize();
580911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
581011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<_RealType> _M_int;
581111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_den;
581211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_cp;
581311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::vector<double> _M_m;
581411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      };
581511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
581611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
581711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      piecewise_linear_distribution()
581811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param()
581911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
582011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
582111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _InputIteratorB, typename _InputIteratorW>
582211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_linear_distribution(_InputIteratorB __bfirst,
582311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				      _InputIteratorB __bend,
582411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				      _InputIteratorW __wbegin)
582511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__bfirst, __bend, __wbegin)
582611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
582711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
582811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Func>
582911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_linear_distribution(initializer_list<_RealType> __bl,
583011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				      _Func __fw)
583111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__bl, __fw)
583211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
583311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
583411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _Func>
583511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	piecewise_linear_distribution(size_t __nw,
583611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				      _RealType __xmin, _RealType __xmax,
583711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				      _Func __fw)
583811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	: _M_param(__nw, __xmin, __xmax, __fw)
583911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ }
584011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
584111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
584211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      piecewise_linear_distribution(const param_type& __p)
584311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_param(__p)
584411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
584511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
584611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
584711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * Resets the distribution state.
584811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
584911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
585011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      reset()
585111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
585211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
585311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
585411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return the intervals of the distribution.
585511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
585611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<_RealType>
585711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      intervals() const
585811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
585911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (_M_param._M_int.empty())
586011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  {
586111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    std::vector<_RealType> __tmp(2);
586211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __tmp[1] = _RealType(1);
586311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    return __tmp;
586411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  }
586511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	else
586611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return _M_param._M_int;
586711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
586811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
586911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
587011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return a vector of the probability densities of the
587111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        distribution.
587211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
587311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<double>
587411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      densities() const
587511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
587611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_den.empty()
587711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? std::vector<double>(2, 1.0) : _M_param._M_den;
587811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
587911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
588011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
588111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the parameter set of the distribution.
588211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
588311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type
588411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param() const
588511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_param; }
588611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
588711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
588811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Sets the parameter set of the distribution.
588911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __param The new parameter set of the distribution.
589011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
589111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
589211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(const param_type& __param)
589311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_param = __param; }
589411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
589511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
589611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the greatest lower bound value of the distribution.
589711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
589811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
589911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      min() const
590011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
590111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_int.empty()
590211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? result_type(0) : _M_param._M_int.front();
590311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
590411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
590511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
590611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Returns the least upper bound value of the distribution.
590711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
590811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      result_type
590911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      max() const
591011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
591111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_param._M_int.empty()
591211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ? result_type(1) : _M_param._M_int.back();
591311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
591411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
591511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
591611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Generating functions.
591711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
591811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
591911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
592011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng)
592111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ return this->operator()(__urng, _M_param); }
592211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
592311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
592411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	result_type
592511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator()(_UniformRandomNumberGenerator& __urng,
592611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p);
592711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
592811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
592911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
593011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
593111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
593211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng)
593311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate(__f, __t, __urng, _M_param); }
593411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
593511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
593611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
593711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
593811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(_ForwardIterator __f, _ForwardIterator __t,
593911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
594011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
594111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
594211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
594311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _UniformRandomNumberGenerator>
594411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
594511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate(result_type* __f, result_type* __t,
594611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   _UniformRandomNumberGenerator& __urng,
594711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const param_type& __p)
594811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{ this->__generate_impl(__f, __t, __urng, __p); }
594911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
595011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
595111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Return true if two piecewise linear distributions have the
595211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        same parameters.
595311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
595411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend bool
595511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator==(const piecewise_linear_distribution& __d1,
595611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 const piecewise_linear_distribution& __d2)
595711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __d1._M_param == __d2._M_param; }
595811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
595911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
596011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Inserts a %piecewise_linear_distribution random number
596111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        distribution @p __x into the output stream @p __os.
596211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
596311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __os An output stream.
596411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %piecewise_linear_distribution random number
596511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             distribution.
596611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
596711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The output stream with the state of @p __x inserted or in
596811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          an error state.
596911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
597011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
597111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_ostream<_CharT, _Traits>&
597211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator<<(std::basic_ostream<_CharT, _Traits>& __os,
597311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   const std::piecewise_linear_distribution<_RealType1>& __x);
597411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
597511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
597611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @brief Extracts a %piecewise_linear_distribution random number
597711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *        distribution @p __x from the input stream @p __is.
597811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
597911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __is An input stream.
598011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @param __x  A %piecewise_linear_distribution random number
598111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *             generator engine.
598211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
598311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       * @returns The input stream with @p __x extracted or in an error
598411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *          state.
598511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
598611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _RealType1, typename _CharT, typename _Traits>
598711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	friend std::basic_istream<_CharT, _Traits>&
598811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator>>(std::basic_istream<_CharT, _Traits>& __is,
598911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   std::piecewise_linear_distribution<_RealType1>& __x);
599011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
599111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
599211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator,
599311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       typename _UniformRandomNumberGenerator>
599411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
599511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__generate_impl(_ForwardIterator __f, _ForwardIterator __t,
599611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			_UniformRandomNumberGenerator& __urng,
599711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const param_type& __p);
599811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
599911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param_type _M_param;
600011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
600111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
600211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
600311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    * @brief Return true if two piecewise linear distributions have
600411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    *        different parameters.
600511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
600611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RealType>
600711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline bool
600811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator!=(const std::piecewise_linear_distribution<_RealType>& __d1,
600911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       const std::piecewise_linear_distribution<_RealType>& __d2)
601011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return !(__d1 == __d2); }
601111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
601211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
601311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_distributions_poisson
601411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
601511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_distributions
601611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
601711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
601811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup random_utilities Random Number Utilities
601911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup random
602011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
602111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
602211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
602311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
602411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief The seed_seq class generates sequences of seeds for random
602511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *        number generators.
602611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
602711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class seed_seq
602811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
602911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
603011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
603111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /** The type of the seed vales. */
603211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef uint_least32_t result_type;
603311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
603411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    /** Default constructor. */
603511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    seed_seq()
603611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_v()
603711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { }
603811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
603911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _IntType>
604011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed_seq(std::initializer_list<_IntType> il);
604111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
604211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _InputIterator>
604311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      seed_seq(_InputIterator __begin, _InputIterator __end);
604411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
604511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // generating functions
604611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename _RandomAccessIterator>
604711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
604811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      generate(_RandomAccessIterator __begin, _RandomAccessIterator __end);
604911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
605011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // property functions
605111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    size_t size() const
605211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return _M_v.size(); }
605311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
605411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    template<typename OutputIterator>
605511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
605611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      param(OutputIterator __dest) const
605711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { std::copy(_M_v.begin(), _M_v.end(), __dest); }
605811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
605911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  private:
606011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ///
606111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::vector<result_type> _M_v;
606211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
606311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
606411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random_utilities
606511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
606611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /* @} */ // group random
606711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
606811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
606911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace std
607011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
607111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6072