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