137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// random number generation -*- C++ -*- 237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Copyright (C) 2009, 2010 Free Software Foundation, Inc. 437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This file is part of the GNU ISO C++ Library. This library is free 637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// software; you can redistribute it and/or modify it under the 737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// terms of the GNU General Public License as published by the 837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Free Software Foundation; either version 3, or (at your option) 937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// any later version. 1037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// This library is distributed in the hope that it will be useful, 1237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// but WITHOUT ANY WARRANTY; without even the implied warranty of 1337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// GNU General Public License for more details. 1537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// Under Section 7 of GPL version 3, you are granted additional 1737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// permissions described in the GCC Runtime Library Exception, version 1837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// 3.1, as published by the Free Software Foundation. 1937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 2037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// You should have received a copy of the GNU General Public License and 2137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// a copy of the GCC Runtime Library Exception along with this program; 2237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh// <http://www.gnu.org/licenses/>. 2437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 2537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh/** 2637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @file tr1/random.h 2737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This is an internal header file, included by other library headers. 2837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Do not attempt to use it directly. @headername{tr1/random} 2937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 3037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifndef _GLIBCXX_TR1_RANDOM_H 3237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#define _GLIBCXX_TR1_RANDOM_H 1 3337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#pragma GCC system_header 3537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 3637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace std _GLIBCXX_VISIBILITY(default) 3737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{ 3837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsiehnamespace tr1 3937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh{ 4037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // [5.1] Random number generation 4137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 4237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 4337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup tr1_random Random Number Generation 4437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A facility for generating random numbers on selected distributions. 4537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 4637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 4737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 4837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 4937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Implementation-space details. 5037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 5137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh namespace __detail 5237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 5337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_BEGIN_NAMESPACE_VERSION 5437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 5537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, int __w, 5637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool = __w < std::numeric_limits<_UIntType>::digits> 5737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Shift 5837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { static const _UIntType __value = 0; }; 5937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UIntType, int __w> 6137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Shift<_UIntType, __w, true> 6237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { static const _UIntType __value = _UIntType(1) << __w; }; 6337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Tp, _Tp __a, _Tp __c, _Tp __m, bool> 6537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Mod; 6637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 6737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Dispatch based on modulus value to prevent divide-by-zero compile-time 6837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // errors when m == 0. 6937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Tp, _Tp __a, _Tp __c, _Tp __m> 7037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh inline _Tp 7137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __mod(_Tp __x) 7237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _Mod<_Tp, __a, __c, __m, __m == 0>::__calc(__x); } 7337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 7437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef __gnu_cxx::__conditional_type<(sizeof(unsigned) == 4), 7537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh unsigned, unsigned long>::__type _UInt32Type; 7637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 7737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 7837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * An adaptor class for converting the output of any Generator into 7937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the input for a specific Distribution. 8037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 8137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Engine, typename _Distribution> 8237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Adaptor 8337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 8437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename remove_reference<_Engine>::type _BEngine; 8537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _BEngine::result_type _Engine_result_type; 8637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _Distribution::input_type result_type; 8737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 8837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 8937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Adaptor(const _Engine& __g) 9037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_g(__g) { } 9137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 9237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 9337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 9437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 9537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 9637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 9737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 9837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = _M_g.min(); 9937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 10037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(0); 10137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 10237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 10337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 10437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 10537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 10637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 10737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 10837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 10937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 11037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = _M_g.max(); 11137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (!is_integral<result_type>::value) 11237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(1); 11337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 11437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = std::numeric_limits<result_type>::max() - 1; 11537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 11637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 11737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 11837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* 11937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Converts a value generated by the adapted random number generator 12037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * into a value in the input domain for the dependent random number 12137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 12237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 12337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Because the type traits are compile time constants only the 12437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * appropriate clause of the if statements will actually be emitted 12537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * by the compiler. 12637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 12737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 12837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 12937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 13037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 13137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 13237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 13337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = _M_g(); 13437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (!is_integral<_Engine_result_type>::value 13537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !is_integral<result_type>::value) 13637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(_M_g() - _M_g.min()) 13737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / result_type(_M_g.max() - _M_g.min()); 13837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (is_integral<_Engine_result_type>::value 13937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !is_integral<result_type>::value) 14037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(_M_g() - _M_g.min()) 14137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / result_type(_M_g.max() - _M_g.min() + result_type(1)); 14237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 14337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = (((_M_g() - _M_g.min()) 14437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / (_M_g.max() - _M_g.min())) 14537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * std::numeric_limits<result_type>::max()); 14637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 14737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 14837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 14937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 15037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Engine _M_g; 15137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 15237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 15337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Specialization for _Engine*. 15437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Engine, typename _Distribution> 15537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh struct _Adaptor<_Engine*, _Distribution> 15637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 15737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _Engine::result_type _Engine_result_type; 15837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _Distribution::input_type result_type; 15937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 16037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 16137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Adaptor(_Engine* __g) 16237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_g(__g) { } 16337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 16437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 16537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 16637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 16737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 16837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 16937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 17037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = _M_g->min(); 17137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 17237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(0); 17337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 17437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 17537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 17637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 17737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 17837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 17937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 18037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 18137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 18237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = _M_g->max(); 18337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (!is_integral<result_type>::value) 18437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type(1); 18537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 18637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = std::numeric_limits<result_type>::max() - 1; 18737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 18837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 18937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 19037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 19137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 19237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 19337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __return_value; 19437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (is_integral<_Engine_result_type>::value 19537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && is_integral<result_type>::value) 19637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = (*_M_g)(); 19737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (!is_integral<_Engine_result_type>::value 19837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !is_integral<result_type>::value) 19937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type((*_M_g)() - _M_g->min()) 20037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / result_type(_M_g->max() - _M_g->min()); 20137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else if (is_integral<_Engine_result_type>::value 20237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && !is_integral<result_type>::value) 20337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = result_type((*_M_g)() - _M_g->min()) 20437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / result_type(_M_g->max() - _M_g->min() + result_type(1)); 20537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh else 20637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __return_value = ((((*_M_g)() - _M_g->min()) 20737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / (_M_g->max() - _M_g->min())) 20837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * std::numeric_limits<result_type>::max()); 20937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __return_value; 21037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 21137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 21237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 21337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Engine* _M_g; 21437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 21537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 21637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_END_NAMESPACE_VERSION 21737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } // namespace __detail 21837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 21937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_BEGIN_NAMESPACE_VERSION 22037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 22137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 22237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Produces random numbers on a given distribution function using a 22337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * non-uniform random number generation engine. 22437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 22537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @todo the engine_value_type needs to be studied more carefully. 22637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 22737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Engine, typename _Dist> 22837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class variate_generator 22937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 23037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Concept requirements. 23137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __glibcxx_class_requires(_Engine, _CopyConstructibleConcept) 23237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcxx_class_requires(_Engine, _EngineConcept) 23337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcxx_class_requires(_Dist, _EngineConcept) 23437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 23537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 23637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _Engine engine_type; 23737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef __detail::_Adaptor<_Engine, _Dist> engine_value_type; 23837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _Dist distribution_type; 23937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _Dist::result_type result_type; 24037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // tr1:5.1.1 table 5.1 requirement 24237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename __gnu_cxx::__enable_if< 24337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh is_arithmetic<result_type>::value, result_type>::__type _IsValidType; 24437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 24637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a variate generator with the uniform random number 24737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator @p __eng for the random distribution @p __dist. 24837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 24937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @throws Any exceptions which may thrown by the copy constructors of 25037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the @p _Engine or @p _Dist objects. 25137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 25237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh variate_generator(engine_type __eng, distribution_type __dist) 25337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_engine(__eng), _M_dist(__dist) { } 25437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 25537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 25637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next generated value on the distribution. 25737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 25837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 25937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 26037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_dist(_M_engine); } 26137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 26237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 26337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * WTF? 26437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 26537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _Tp> 26637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 26737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_Tp __value) 26837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_dist(_M_engine, __value); } 26937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 27037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 27137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a reference to the underlying uniform random number generator 27237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 27337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 27437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh engine_value_type& 27537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh engine() 27637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_engine; } 27737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 27837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 27937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a const reference to the underlying uniform random number 28037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 28137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 28237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const engine_value_type& 28337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh engine() const 28437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_engine; } 28537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 28637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 28737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a reference to the underlying random distribution. 28837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 28937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh distribution_type& 29037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh distribution() 29137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_dist; } 29237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 29337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 29437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a const reference to the underlying random distribution. 29537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 29637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const distribution_type& 29737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh distribution() const 29837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_dist; } 29937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 30037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 30137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the closed lower bound of the distribution interval. 30237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 30337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 30437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 30537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->distribution().min(); } 30637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 30737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 30837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the closed upper bound of the distribution interval. 30937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 31037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 31137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 31237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->distribution().max(); } 31337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 31437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 31537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh engine_value_type _M_engine; 31637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh distribution_type _M_dist; 31737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 31837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 31937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 32037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 32137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup tr1_random_generators Random Number Generators 32237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup tr1_random 32337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 32437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * These classes define objects which provide random or pseudorandom 32537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * numbers, either from a discrete or a continuous interval. The 32637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator supplied as a part of this library are 32737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * all uniform random number generators which provide a sequence of 32837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number uniformly distributed over their range. 32937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 33037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A number generator is a function object with an operator() that 33137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * takes zero arguments and returns a number. 33237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 33337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A compliant random number generator must satisfy the following 33437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * requirements. <table border=1 cellpadding=10 cellspacing=0> 33537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <caption align=top>Random Number Generator Requirements</caption> 33637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>To be documented.</td></tr> </table> 33737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 33837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 33937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 34037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 34137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 34237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A model of a linear congruential random number generator. 34337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 34437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A random number generator that produces pseudorandom numbers using the 34537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * linear function @f$x_{i+1}\leftarrow(ax_{i} + c) \bmod m @f$. 34637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 34737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The template parameter @p _UIntType must be an unsigned integral type 34837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * large enough to store values up to (__m-1). If the template parameter 34937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __m is 0, the modulus @p __m used is 35037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template 35137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameters @p __a and @p __c must be less than @p __m. 35237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 35337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The size of the state is @f$ 1 @f$. 35437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 35537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> 35637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class linear_congruential 35737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 35837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept) 35937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcpp_class_requires(__a < __m && __c < __m) 36037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 36137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 36237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 36337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 36437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 36537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The multiplier. */ 36637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType multiplier = __a; 36737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** An increment. */ 36837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType increment = __c; 36937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The modulus. */ 37037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType modulus = __m; 37137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 37237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 37337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a %linear_congruential random number generator engine with 37437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seed @p __s. The default seed value is 1. 37537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 37637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s The initial seed value. 37737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 37837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 37937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh linear_congruential(unsigned long __x0 = 1) 38037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { this->seed(__x0); } 38137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 38237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 38337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a %linear_congruential random number generator engine 38437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seeded from the generator function @p __g. 38537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 38637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g The seed generator function. 38737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 38837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 38937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh linear_congruential(_Gen& __g) 39037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { this->seed(__g); } 39137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 39237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 39337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reseeds the %linear_congruential random number generator engine 39437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sequence to the seed @g __s. 39537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 39637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s The new seed. 39737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 39837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 39937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(unsigned long __s = 1); 40037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 40137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 40237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reseeds the %linear_congruential random number generator engine 40337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sequence using values from the generator function @p __g. 40437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 40537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g the seed generator function. 40637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 40737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 40837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 40937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g) 41037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__g, typename is_fundamental<_Gen>::type()); } 41137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 41237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 41337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the smallest possible value in the output range. 41437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 41537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The minimum depends on the @p __c parameter: if it is zero, the 41637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * minimum generated must be > 0, otherwise 0 is allowed. 41737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 41837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 41937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 42037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__detail::__mod<_UIntType, 1, 0, __m>(__c) == 0) ? 1 : 0; } 42137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 42237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 42337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the largest possible value in the output range. 42437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 42537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 42637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 42737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __m - 1; } 42837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 42937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 43037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next random number in the sequence. 43137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 43237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 43337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 43437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 43537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 43637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two linear congruential random number generator 43737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for equality. 43837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 43937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A linear congruential random number generator object. 44037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another linear congruential random number generator obj. 44137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 44237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 44337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 44437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 44537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const linear_congruential& __lhs, 44637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const linear_congruential& __rhs) 44737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __lhs._M_x == __rhs._M_x; } 44837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 44937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 45037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two linear congruential random number generator 45137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * objects of the same type for inequality. 45237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 45337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A linear congruential random number generator object. 45437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another linear congruential random number generator obj. 45537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 45637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 45737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 45837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 45937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const linear_congruential& __lhs, 46037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const linear_congruential& __rhs) 46137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 46237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 46337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 46437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Writes the textual representation of the state x(i) of x to @p __os. 46537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 46637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os The output stream. 46737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lcr A % linear_congruential random number generator. 46837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns __os. 46937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 47037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 47137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __m1, 47237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 47337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 47437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 47537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const linear_congruential<_UIntType1, __a1, __c1, 47637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __m1>& __lcr); 47737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 47837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 47937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Sets the state of the engine by reading its textual 48037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * representation from @p __is. 48137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 48237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The textual representation must have been previously written using an 48337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * output stream whose imbued locale and whose type's template 48437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * specialization arguments _CharT and _Traits were the same as those of 48537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __is. 48637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 48737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is The input stream. 48837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lcr A % linear_congruential random number generator. 48937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns __is. 49037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 49137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1, 49237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __m1, 49337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 49437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 49537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 49637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh linear_congruential<_UIntType1, __a1, __c1, __m1>& __lcr); 49737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 49837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 49937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 50037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 50137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, true_type) 50237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return seed(static_cast<unsigned long>(__g)); } 50337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 50437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 50537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 50637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, false_type); 50737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 50837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x; 50937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 51037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 51137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 51237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller. 51337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 51437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef linear_congruential<unsigned long, 16807, 0, 2147483647> minstd_rand0; 51537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 51637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 51737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * An alternative LCR (Lehmer Generator function) . 51837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 51937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef linear_congruential<unsigned long, 48271, 0, 2147483647> minstd_rand; 52037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 52137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 52237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 52337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A generalized feedback shift register discrete random number generator. 52437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 52537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This algorithm avoids multiplication and division and is designed to be 52637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * friendly to a pipelined architecture. If the parameters are chosen 52737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * correctly, this generator will produce numbers with a very long period and 52837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * fairly good apparent entropy, although still not cryptographically strong. 52937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 53037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The best way to use this generator is with the predefined mt19937 class. 53137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 53237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This algorithm was originally invented by Makoto Matsumoto and 53337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Takuji Nishimura. 53437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 53537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var word_size The number of bits in each element of the state vector. 53637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var state_size The degree of recursion. 53737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var shift_size The period parameter. 53837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var mask_bits The separation point bit index. 53937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var parameter_a The last row of the twist matrix. 54037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_u The first right-shift tempering matrix parameter. 54137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_s The first left-shift tempering matrix parameter. 54237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_b The first left-shift tempering matrix mask. 54337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_t The second left-shift tempering matrix parameter. 54437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_c The second left-shift tempering matrix mask. 54537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var output_l The second right-shift tempering matrix parameter. 54637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 54737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType, int __w, int __n, int __m, int __r, 54837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __a, int __u, int __s, _UIntType __b, int __t, 54937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType __c, int __l> 55037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class mersenne_twister 55137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 55237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept) 55337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 55437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 55537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 55637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UIntType result_type; 55737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 55837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 55937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int word_size = __w; 56037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int state_size = __n; 56137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int shift_size = __m; 56237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int mask_bits = __r; 56337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType parameter_a = __a; 56437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int output_u = __u; 56537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int output_s = __s; 56637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType output_b = __b; 56737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int output_t = __t; 56837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _UIntType output_c = __c; 56937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int output_l = __l; 57037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 57137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 57237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister() 57337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(); } 57437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 57537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 57637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister(unsigned long __value) 57737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__value); } 57837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 57937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 58037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister(_Gen& __g) 58137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__g); } 58237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 58337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 58437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed() 58537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(5489UL); } 58637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 58737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 58837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(unsigned long __value); 58937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 59037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 59137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 59237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g) 59337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__g, typename is_fundamental<_Gen>::type()); } 59437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 59537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 59637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 59737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; }; 59837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 59937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 60037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 60137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __detail::_Shift<_UIntType, __w>::__value - 1; } 60237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 60337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 60437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 60537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 60637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 60737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % mersenne_twister random number generator objects of 60837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for equality. 60937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 61037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % mersenne_twister random number generator object. 61137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % mersenne_twister random number generator 61237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 61337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 61437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 61537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 61637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 61737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const mersenne_twister& __lhs, 61837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const mersenne_twister& __rhs) 61937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x); } 62037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 62137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 62237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % mersenne_twister random number generator objects of 62337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for inequality. 62437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 62537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % mersenne_twister random number generator object. 62637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % mersenne_twister random number generator 62737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 62837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 62937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 63037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 63137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 63237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const mersenne_twister& __lhs, 63337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const mersenne_twister& __rhs) 63437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 63537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 63637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 63737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts the current state of a % mersenne_twister random number 63837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x into the output stream @p __os. 63937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 64037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 64137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % mersenne_twister random number generator engine. 64237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 64337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 64437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 64537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 64637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType1, int __w1, int __n1, int __m1, int __r1, 64737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1, 64837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __c1, int __l1, 64937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 65037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 65137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 65237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1, 65337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x); 65437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 65537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 65637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts the current state of a % mersenne_twister random number 65737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x from the input stream @p __is. 65837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 65937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 66037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % mersenne_twister random number generator engine. 66137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 66237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 66337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 66437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 66537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UIntType1, int __w1, int __n1, int __m1, int __r1, 66637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1, 66737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType1 __c1, int __l1, 66837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 66937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 67037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 67137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1, 67237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x); 67337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 67437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 67537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 67637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 67737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, true_type) 67837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return seed(static_cast<unsigned long>(__g)); } 67937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 68037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 68137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 68237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, false_type); 68337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 68437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x[state_size]; 68537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh int _M_p; 68637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 68737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 68837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 68937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The classic Mersenne Twister. 69037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 69137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reference: 69237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally 69337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions 69437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. 69537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 69637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef mersenne_twister< 69737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh unsigned long, 32, 624, 397, 31, 69837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x9908b0dful, 11, 7, 69937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0x9d2c5680ul, 15, 70037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 0xefc60000ul, 18 70137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > mt19937; 70237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 70337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 70437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 70537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief The Marsaglia-Zaman generator. 70637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 70737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This is a model of a Generalized Fibonacci discrete random number 70837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator, sometimes referred to as the SWC generator. 70937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 71037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A discrete random number generator that produces pseudorandom 71137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * numbers using @f$x_{i}\leftarrow(x_{i - s} - x_{i - r} - 71237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * carry_{i-1}) \bmod m @f$. 71337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 71437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The size of the state is @f$ r @f$ 71537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * and the maximum period of the generator is @f$ m^r - m^s -1 @f$. 71637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 71737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * N1688[4.13] says <em>the template parameter _IntType shall denote 71837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an integral type large enough to store values up to m</em>. 71937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 72037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_x The state of the generator. This is a ring buffer. 72137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_carry The carry. 72237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_p Current index of x(i - r). 72337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 72437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType, _IntType __m, int __s, int __r> 72537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class subtract_with_carry 72637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 72737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __glibcxx_class_requires(_IntType, _IntegerConcept) 72837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 72937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 73037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 73137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 73237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 73337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 73437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const _IntType modulus = __m; 73537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int long_lag = __r; 73637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int short_lag = __s; 73737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 73837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 73937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a default-initialized % subtract_with_carry random number 74037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator. 74137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 74237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry() 74337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { this->seed(); } 74437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 74537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 74637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs an explicitly seeded % subtract_with_carry random number 74737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator. 74837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 74937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 75037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry(unsigned long __value) 75137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { this->seed(__value); } 75237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 75337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 75437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a %subtract_with_carry random number generator engine 75537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seeded from the generator function @p __g. 75637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 75737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g The seed generator function. 75837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 75937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 76037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry(_Gen& __g) 76137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { this->seed(__g); } 76237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 76337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 76437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Seeds the initial state @f$ x_0 @f$ of the random number generator. 76537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 76637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * N1688[4.19] modifies this as follows. If @p __value == 0, 76737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * sets value to 19780503. In any case, with a linear 76837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * congruential generator lcg(i) having parameters @f$ m_{lcg} = 76937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value 77037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m 77137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$ 77237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * set carry to 1, otherwise sets carry to 0. 77337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 77437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 77537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(unsigned long __value = 19780503); 77637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 77737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 77837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry 77937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator. 78037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 78137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 78237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 78337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g) 78437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__g, typename is_fundamental<_Gen>::type()); } 78537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 78637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 78737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the inclusive minimum value of the range of random integers 78837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * returned by this generator. 78937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 79037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 79137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 79237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 79337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 79437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 79537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the inclusive maximum value of the range of random integers 79637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * returned by this generator. 79737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 79837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 79937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 80037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return this->modulus - 1; } 80137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 80237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 80337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next random number in the sequence. 80437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 80537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 80637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 80737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 80837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 80937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % subtract_with_carry random number generator objects of 81037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for equality. 81137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 81237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry random number generator object. 81337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry random number generator 81437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 81537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 81637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 81737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 81837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 81937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const subtract_with_carry& __lhs, 82037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry& __rhs) 82137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x); } 82237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 82337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 82437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % subtract_with_carry random number generator objects of 82537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for inequality. 82637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 82737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry random number generator object. 82837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry random number generator 82937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 83037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 83137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 83237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 83337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 83437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const subtract_with_carry& __lhs, 83537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry& __rhs) 83637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 83737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 83837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 83937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts the current state of a % subtract_with_carry random number 84037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x into the output stream @p __os. 84137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 84237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 84337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry random number generator engine. 84437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 84537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 84637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 84737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 84837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, _IntType1 __m1, int __s1, int __r1, 84937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 85037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 85137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 85237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry<_IntType1, __m1, __s1, 85337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r1>& __x); 85437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 85537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 85637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts the current state of a % subtract_with_carry random number 85737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x from the input stream @p __is. 85837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 85937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 86037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry random number generator engine. 86137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 86237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 86337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 86437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 86537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, _IntType1 __m1, int __s1, int __r1, 86637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 86737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 86837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 86937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry<_IntType1, __m1, __s1, __r1>& __x); 87037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 87137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 87237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 87337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 87437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, true_type) 87537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return seed(static_cast<unsigned long>(__g)); } 87637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 87737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 87837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 87937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, false_type); 88037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 88137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename __gnu_cxx::__add_unsigned<_IntType>::__type _UIntType; 88237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 88337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_x[long_lag]; 88437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UIntType _M_carry; 88537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh int _M_p; 88637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 88737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 88837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 88937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 89037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief The Marsaglia-Zaman generator (floats version). 89137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 89237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_x The state of the generator. This is a ring buffer. 89337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_carry The carry. 89437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_p Current index of x(i - r). 89537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @var _M_npows Precomputed negative powers of 2. 89637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 89737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType, int __w, int __s, int __r> 89837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class subtract_with_carry_01 89937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 90037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 90137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 90237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 90337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 90437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 90537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int word_size = __w; 90637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int long_lag = __r; 90737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int short_lag = __s; 90837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 90937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 91037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a default-initialized % subtract_with_carry_01 random 91137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * number generator. 91237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 91337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01() 91437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 91537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh this->seed(); 91637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_npows(); 91737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 91837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 91937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 92037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs an explicitly seeded % subtract_with_carry_01 random number 92137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator. 92237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 92337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 92437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01(unsigned long __value) 92537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 92637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh this->seed(__value); 92737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_npows(); 92837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 92937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 93037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 93137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a % subtract_with_carry_01 random number generator engine 93237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * seeded from the generator function @p __g. 93337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 93437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g The seed generator function. 93537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 93637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 93737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01(_Gen& __g) 93837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 93937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh this->seed(__g); 94037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_npows(); 94137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 94237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 94337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 94437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Seeds the initial state @f$ x_0 @f$ of the random number generator. 94537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 94637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 94737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(unsigned long __value = 19780503); 94837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 94937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 95037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry_01 95137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator. 95237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 95337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 95437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 95537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g) 95637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { seed(__g, typename is_fundamental<_Gen>::type()); } 95737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 95837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 95937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the minimum value of the range of random floats 96037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * returned by this generator. 96137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 96237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 96337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 96437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0.0; } 96537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 96637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 96737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the maximum value of the range of random floats 96837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * returned by this generator. 96937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 97037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 97137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 97237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 1.0; } 97337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 97437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 97537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next random number in the sequence. 97637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 97737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 97837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 97937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 98037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 98137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % subtract_with_carry_01 random number generator objects 98237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * of the same type for equality. 98337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 98437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry_01 random number 98537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 98637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry_01 random number generator 98737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 98837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 98937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 99037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 99137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 99237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const subtract_with_carry_01& __lhs, 99337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry_01& __rhs) 99437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 99537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh for (int __i = 0; __i < long_lag; ++__i) 99637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (!std::equal(__lhs._M_x[__i], __lhs._M_x[__i] + __n, 99737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __rhs._M_x[__i])) 99837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return false; 99937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return true; 100037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 100137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 100237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 100337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two % subtract_with_carry_01 random number generator objects 100437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * of the same type for inequality. 100537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 100637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A % subtract_with_carry_01 random number 100737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator object. 100837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 100937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another % subtract_with_carry_01 random number generator 101037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 101137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 101237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 101337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 101437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 101537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const subtract_with_carry_01& __lhs, 101637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry_01& __rhs) 101737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 101837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 101937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 102037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts the current state of a % subtract_with_carry_01 random number 102137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x into the output stream @p __os. 102237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 102337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 102437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry_01 random number generator engine. 102537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 102637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 102737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 102837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 102937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, int __w1, int __s1, int __r1, 103037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 103137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 103237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 103337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const subtract_with_carry_01<_RealType1, __w1, __s1, 103437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __r1>& __x); 103537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 103637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 103737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts the current state of a % subtract_with_carry_01 random number 103837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x from the input stream @p __is. 103937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 104037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 104137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A % subtract_with_carry_01 random number generator engine. 104237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 104337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 104437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 104537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 104637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, int __w1, int __s1, int __r1, 104737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 104837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 104937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 105037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01<_RealType1, __w1, __s1, __r1>& __x); 105137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 105237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 105337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 105437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 105537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, true_type) 105637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return seed(static_cast<unsigned long>(__g)); } 105737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 105837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 105937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 106037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g, false_type); 106137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 106237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 106337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_npows(); 106437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 106537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int __n = (__w + 31) / 32; 106637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 106737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef __detail::_UInt32Type _UInt32Type; 106837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UInt32Type _M_x[long_lag][__n]; 106937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_npows[__n]; 107037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UInt32Type _M_carry; 107137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh int _M_p; 107237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 107337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 107437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef subtract_with_carry_01<float, 24, 10, 24> ranlux_base_01; 107537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 107637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // _GLIBCXX_RESOLVE_LIB_DEFECTS 107737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // 508. Bad parameters for ranlux64_base_01. 107837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01; 107937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 108037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 108137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 108237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Produces random numbers from some base engine by discarding blocks of 108337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * data. 108437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 108537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 0 <= @p __r <= @p __p 108637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 108737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator, int __p, int __r> 108837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class discard_block 108937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 109037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcxx_class_requires(typename base_type::result_type, 109137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // ArithmeticTypeConcept) 109237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 109337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 109437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the underlying generator engine. */ 109537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UniformRandomNumberGenerator base_type; 109637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 109737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename base_type::result_type result_type; 109837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 109937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 110037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int block_size = __p; 110137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int used_block = __r; 110237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 110337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 110437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a default %discard_block engine. 110537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 110637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The underlying engine is default constructed as well. 110737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 110837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block() 110937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_n(0) { } 111037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 111137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 111237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copy constructs a %discard_block engine. 111337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 111437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Copies an existing base class random number generator. 111537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param rng An existing (base class) engine object. 111637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 111737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 111837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block(const base_type& __rng) 111937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__rng), _M_n(0) { } 112037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 112137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 112237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Seed constructs a %discard_block engine. 112337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 112437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs the underlying generator engine seeded with @p __s. 112537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __s A seed value for the base class engine. 112637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 112737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 112837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block(unsigned long __s) 112937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__s), _M_n(0) { } 113037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 113137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 113237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Generator construct a %discard_block engine. 113337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 113437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g A seed generator function. 113537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 113637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 113737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block(_Gen& __g) 113837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b(__g), _M_n(0) { } 113937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 114037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 114137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reseeds the %discard_block object with the default seed for the 114237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * underlying base class generator engine. 114337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 114437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void seed() 114537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 114637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(); 114737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_n = 0; 114837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 114937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 115037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 115137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Reseeds the %discard_block object with the given seed generator 115237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * function. 115337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __g A seed generator function. 115437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 115537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 115637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void seed(_Gen& __g) 115737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 115837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b.seed(__g); 115937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_n = 0; 116037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 116137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 116237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 116337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a const reference to the underlying generator engine object. 116437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 116537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const base_type& 116637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base() const 116737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b; } 116837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 116937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 117037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the minimum value in the generated random number range. 117137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 117237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 117337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 117437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b.min(); } 117537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 117637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 117737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the maximum value in the generated random number range. 117837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 117937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 118037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 118137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b.max(); } 118237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 118337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 118437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next value in the generated random number sequence. 118537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 118637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 118737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(); 118837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 118937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 119037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %discard_block random number generator objects of 119137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for equality. 119237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 119337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %discard_block random number generator object. 119437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %discard_block random number generator 119537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 119637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 119737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 119837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 119937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 120037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const discard_block& __lhs, const discard_block& __rhs) 120137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__lhs._M_b == __rhs._M_b) && (__lhs._M_n == __rhs._M_n); } 120237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 120337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 120437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %discard_block random number generator objects of 120537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for inequality. 120637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 120737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %discard_block random number generator object. 120837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %discard_block random number generator 120937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 121037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 121137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 121237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 121337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 121437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const discard_block& __lhs, const discard_block& __rhs) 121537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 121637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 121737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 121837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts the current state of a %discard_block random number 121937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x into the output stream @p __os. 122037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 122137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 122237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discard_block random number generator engine. 122337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 122437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 122537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 122637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 122737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator1, int __p1, int __r1, 122837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 122937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 123037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 123137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const discard_block<_UniformRandomNumberGenerator1, 123237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __p1, __r1>& __x); 123337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 123437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 123537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts the current state of a % subtract_with_carry random number 123637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x from the input stream @p __is. 123737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 123837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 123937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %discard_block random number generator engine. 124037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 124137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 124237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 124337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 124437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator1, int __p1, int __r1, 124537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 124637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 124737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 124837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh discard_block<_UniformRandomNumberGenerator1, 124937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __p1, __r1>& __x); 125037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 125137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 125237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base_type _M_b; 125337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh int _M_n; 125437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 125537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 125637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 125737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 125837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * James's luxury-level-3 integer adaptation of Luescher's generator. 125937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 126037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block< 126137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry<unsigned long, (1UL << 24), 10, 24>, 126237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 223, 126337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24 126437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > ranlux3; 126537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 126637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 126737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * James's luxury-level-4 integer adaptation of Luescher's generator. 126837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 126937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block< 127037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry<unsigned long, (1UL << 24), 10, 24>, 127137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 389, 127237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24 127337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > ranlux4; 127437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 127537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block< 127637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01<float, 24, 10, 24>, 127737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 223, 127837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24 127937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > ranlux3_01; 128037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 128137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef discard_block< 128237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh subtract_with_carry_01<float, 24, 10, 24>, 128337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 389, 128437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 24 128537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > ranlux4_01; 128637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 128737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 128837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 128937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A random number generator adaptor class that combines two random number 129037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engines into a single output sequence. 129137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 129237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator1, int __s1, 129337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class _UniformRandomNumberGenerator2, int __s2> 129437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class xor_combine 129537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 129637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcxx_class_requires(typename _UniformRandomNumberGenerator1:: 129737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // result_type, ArithmeticTypeConcept) 129837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // __glibcxx_class_requires(typename _UniformRandomNumberGenerator2:: 129937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // result_type, ArithmeticTypeConcept) 130037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 130137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 130237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the first underlying generator engine. */ 130337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UniformRandomNumberGenerator1 base1_type; 130437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the second underlying generator engine. */ 130537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _UniformRandomNumberGenerator2 base2_type; 130637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 130737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 130837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename base1_type::result_type _Result_type1; 130937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename base2_type::result_type _Result_type2; 131037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 131137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 131237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the generated random value. */ 131337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename __gnu_cxx::__conditional_type<(sizeof(_Result_type1) 131437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh > sizeof(_Result_type2)), 131537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _Result_type1, _Result_type2>::__type result_type; 131637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 131737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // parameter values 131837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int shift1 = __s1; 131937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static const int shift2 = __s2; 132037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 132137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 132237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh xor_combine() 132337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b1(), _M_b2() 132437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize_max(); } 132537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 132637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh xor_combine(const base1_type& __rng1, const base2_type& __rng2) 132737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b1(__rng1), _M_b2(__rng2) 132837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize_max(); } 132937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 133037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh xor_combine(unsigned long __s) 133137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b1(__s), _M_b2(__s + 1) 133237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize_max(); } 133337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 133437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 133537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh xor_combine(_Gen& __g) 133637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_b1(__g), _M_b2(__g) 133737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_initialize_max(); } 133837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 133937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 134037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed() 134137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 134237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b1.seed(); 134337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b2.seed(); 134437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 134537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 134637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _Gen> 134737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 134837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh seed(_Gen& __g) 134937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 135037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b1.seed(__g); 135137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_b2.seed(__g); 135237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 135337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 135437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const base1_type& 135537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base1() const 135637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b1; } 135737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 135837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const base2_type& 135937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base2() const 136037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_b2; } 136137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 136237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 136337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 136437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0; } 136537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 136637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 136737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 136837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_max; } 136937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 137037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 137137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next random number in the sequence. 137237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 137337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // NB: Not exactly the TR1 formula, per N2079 instead. 137437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 137537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 137637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 137737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return ((result_type(_M_b1() - _M_b1.min()) << shift1) 137837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ^ (result_type(_M_b2() - _M_b2.min()) << shift2)); 137937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 138037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 138137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 138237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %xor_combine random number generator objects of 138337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for equality. 138437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 138537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %xor_combine random number generator object. 138637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %xor_combine random number generator 138737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 138837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 138937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are equal, false otherwise. 139037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 139137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 139237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator==(const xor_combine& __lhs, const xor_combine& __rhs) 139337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 139437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return (__lhs.base1() == __rhs.base1()) 139537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh && (__lhs.base2() == __rhs.base2()); 139637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 139737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 139837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 139937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Compares two %xor_combine random number generator objects of 140037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * the same type for inequality. 140137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 140237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __lhs A %xor_combine random number generator object. 140337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __rhs Another %xor_combine random number generator 140437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * object. 140537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 140637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns true if the two objects are not equal, false otherwise. 140737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 140837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend bool 140937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator!=(const xor_combine& __lhs, const xor_combine& __rhs) 141037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return !(__lhs == __rhs); } 141137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 141237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 141337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts the current state of a %xor_combine random number 141437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x into the output stream @p __os. 141537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 141637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 141737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %xor_combine random number generator engine. 141837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 141937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 142037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 142137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 142237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator11, int __s11, 142337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class _UniformRandomNumberGenerator21, int __s21, 142437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 142537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 142637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 142737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const xor_combine<_UniformRandomNumberGenerator11, __s11, 142837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UniformRandomNumberGenerator21, __s21>& __x); 142937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 143037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 143137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts the current state of a %xor_combine random number 143237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine @p __x from the input stream @p __is. 143337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 143437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 143537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %xor_combine random number generator engine. 143637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 143737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with the state of @p __x extracted or in 143837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 143937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 144037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator11, int __s11, 144137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class _UniformRandomNumberGenerator21, int __s21, 144237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 144337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 144437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 144537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh xor_combine<_UniformRandomNumberGenerator11, __s11, 144637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UniformRandomNumberGenerator21, __s21>& __x); 144737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 144837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 144937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 145037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_max(); 145137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 145237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 145337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize_max_aux(result_type, result_type, int); 145437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 145537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base1_type _M_b1; 145637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh base2_type _M_b2; 145737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_max; 145837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 145937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 146037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 146137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 146237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A standard interface to a platform-specific non-deterministic 146337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * random number generator (if any are available). 146437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 146537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class random_device 146637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 146737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 146837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 146937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef unsigned int result_type; 147037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 147137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors, destructors and member functions 147237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 147337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 147437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 147537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 147637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const std::string& __token = "/dev/urandom") 147737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 147837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if ((__token != "/dev/urandom" && __token != "/dev/random") 147937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh || !(_M_file = std::fopen(__token.c_str(), "rb"))) 148037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::__throw_runtime_error(__N("random_device::" 148137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "random_device(const std::string&)")); 148237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 148337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 148437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh ~random_device() 148537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { std::fclose(_M_file); } 148637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 148737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 148837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 148937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 149037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const std::string& __token = "mt19937") 149137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mt(_M_strtoul(__token)) { } 149237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 149337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 149437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh static unsigned long 149537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_strtoul(const std::string& __str) 149637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 149737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh unsigned long __ret = 5489UL; 149837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (__str != "mt19937") 149937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 150037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const char* __nptr = __str.c_str(); 150137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh char* __endptr; 150237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __ret = std::strtoul(__nptr, &__endptr, 0); 150337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if (*__nptr == '\0' || *__endptr != '\0') 150437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::__throw_runtime_error(__N("random_device::_M_strtoul" 150537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh "(const std::string&)")); 150637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 150737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __ret; 150837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 150937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 151137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 151337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 151537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 151637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::min(); } 151737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 151837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 151937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 152037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return std::numeric_limits<result_type>::max(); } 152137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 152237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 152337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh entropy() const 152437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return 0.0; } 152537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 152637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 152737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()() 152837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 152937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 153037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __ret; 153137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type), 153237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 1, _M_file); 153337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __ret; 153437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 153537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_mt(); 153637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 153737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 153837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 153937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 154037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh random_device(const random_device&); 154137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void operator=(const random_device&); 154237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 154337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#ifdef _GLIBCXX_USE_RANDOM_TR1 154437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh FILE* _M_file; 154537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#else 154637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mt19937 _M_mt; 154737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 154837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 154937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 155037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group tr1_random_generators 155137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 155237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 155337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup tr1_random_distributions Random Number Distributions 155437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup tr1_random 155537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 155637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 155737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 155837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 155937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup tr1_random_distributions_discrete Discrete Distributions 156037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup tr1_random_distributions 156137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 156237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 156337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 156437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 156537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Uniform discrete distribution for random numbers. 156637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A discrete random distribution on the range @f$[min, max]@f$ with equal 156737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * probability throughout the range. 156837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 156937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int> 157037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class uniform_int 157137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 157237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __glibcxx_class_requires(_IntType, _IntegerConcept) 157337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 157437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 157537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the parameters of the distribution. */ 157637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType input_type; 157737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** The type of the range of the distribution. */ 157837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 157937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 158037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 158137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 158237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a uniform distribution object. 158337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 158437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 158537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_int(_IntType __min = 0, _IntType __max = 9) 158637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_min(__min), _M_max(__max) 158737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 158837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max); 158937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 159037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 159137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 159237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the inclusive lower bound of the distribution range. 159337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 159437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 159537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 159637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_min; } 159737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 159837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 159937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the inclusive upper bound of the distribution range. 160037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 160137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 160237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 160337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_max; } 160437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 160537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 160637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution state. 160737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 160837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for the uniform integer distribution. 160937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 161037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 161137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 161237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 161337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 161437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a uniformly distributed random number in the range 161537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$(min, max)@f$. 161637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 161737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 161837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 161937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 162037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 162137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _UniformRandomNumberGenerator::result_type 162237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UResult_type; 162337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_call(__urng, _M_min, _M_max, 162437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename is_integral<_UResult_type>::type()); 162537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 162637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 162737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 162837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets a uniform random number in the range @f$[0, n)@f$. 162937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 163037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * This function is aimed at use with std::random_shuffle. 163137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 163237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 163337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 163437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng, result_type __n) 163537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 163637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef typename _UniformRandomNumberGenerator::result_type 163737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _UResult_type; 163837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return _M_call(__urng, 0, __n - 1, 163937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename is_integral<_UResult_type>::type()); 164037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 164137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 164237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 164337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %uniform_int random number distribution @p __x into the 164437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * output stream @p os. 164537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 164637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 164737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_int random number distribution. 164837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 164937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 165037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 165137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 165237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 165337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 165437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 165537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const uniform_int<_IntType1>& __x); 165637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 165737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 165837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %uniform_int random number distribution 165937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 166037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 166137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 166237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_int random number generator engine. 166337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 166437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 166537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 166637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _CharT, typename _Traits> 166737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 166837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 166937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_int<_IntType1>& __x); 167037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 167137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 167237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 167337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 167437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_call(_UniformRandomNumberGenerator& __urng, 167537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __min, result_type __max, true_type); 167637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 167737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _UniformRandomNumberGenerator> 167837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 167937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_call(_UniformRandomNumberGenerator& __urng, 168037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type __min, result_type __max, false_type) 168137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 168237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return result_type((__urng() - __urng.min()) 168337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh / (__urng.max() - __urng.min()) 168437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * (__max - __min + 1)) + __min; 168537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 168637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 168737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_min; 168837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_max; 168937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 169037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 169137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 169237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 169337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A Bernoulli random number distribution. 169437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 169537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Generates a sequence of true and false values with likelihood @f$ p @f$ 169637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * that true will come up and @f$ (1 - p) @f$ that false will appear. 169737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 169837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class bernoulli_distribution 169937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 170037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 170137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef int input_type; 170237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef bool result_type; 170337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 170437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 170537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 170637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a Bernoulli distribution with likelihood @p p. 170737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 170837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __p [IN] The likelihood of a true result being returned. Must 170937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * be in the interval @f$ [0, 1] @f$. 171037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 171137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 171237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bernoulli_distribution(double __p = 0.5) 171337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_p(__p) 171437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 171537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0)); 171637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 171737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 171837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 171937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the @p p parameter of the distribution. 172037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 172137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double 172237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 172337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 172437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 172537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 172637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution state. 172737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 172837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Does nothing for a Bernoulli distribution. 172937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 173037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 173137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 173237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 173337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 173437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the next value in the Bernoullian sequence. 173537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 173637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 173737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 173837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 173937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 174037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh if ((__urng() - __urng.min()) < _M_p * (__urng.max() - __urng.min())) 174137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return true; 174237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return false; 174337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 174437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 174537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 174637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %bernoulli_distribution random number distribution 174737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 174837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 174937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 175037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %bernoulli_distribution random number distribution. 175137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 175237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 175337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 175437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 175537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 175637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 175737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 175837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const bernoulli_distribution& __x); 175937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 176037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 176137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %bernoulli_distribution random number distribution 176237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 176337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 176437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 176537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %bernoulli_distribution random number generator engine. 176637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 176737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 176837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 176937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 177037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 177137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 177237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bernoulli_distribution& __x) 177337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __is >> __x._M_p; } 177437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 177537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 177637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh double _M_p; 177737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 177837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 177937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 178037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 178137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete geometric random number distribution. 178237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 178337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the geometric probability mass function is 178437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(i) = (1 - p)p^{i-1} @f$ where @f$ p @f$ is the parameter of the 178537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * distribution. 178637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 178737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int, typename _RealType = double> 178837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class geometric_distribution 178937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 179037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 179137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 179237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 179337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 179437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 179537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 179637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 179737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh geometric_distribution(const _RealType& __p = _RealType(0.5)) 179837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_p(__p) 179937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 180037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0)); 180137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 180237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 180337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 180437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 180537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the distribution parameter @p p. 180637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 180737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 180837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 180937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 181037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 181237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 181337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 181537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 181637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 181737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 181837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 181937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %geometric_distribution random number distribution 182037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 182137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 182237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 182337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %geometric_distribution random number distribution. 182437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 182537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 182637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 182737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 182837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _RealType1, 182937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 183037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 183137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 183237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const geometric_distribution<_IntType1, _RealType1>& __x); 183337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 183437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 183537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %geometric_distribution random number distribution 183637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 183737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 183837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 183937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %geometric_distribution random number generator engine. 184037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 184137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 184237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 184337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 184437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 184537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 184637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh geometric_distribution& __x) 184737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 184837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __is >> __x._M_p; 184937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __x._M_initialize(); 185037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __is; 185137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 185237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 185337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 185437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 185537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize() 185637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_log_p = std::log(_M_p); } 185737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 185837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_p; 185937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_log_p; 186037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 186137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 186237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 186337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType> 186437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class normal_distribution; 186537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 186637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 186737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete Poisson random number distribution. 186837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 186937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the Poisson probability mass function is 187037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(i) = \frac{mean^i}{i!} e^{-mean} @f$ where @f$ mean @f$ is the 187137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * parameter of the distribution. 187237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 187337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int, typename _RealType = double> 187437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class poisson_distribution 187537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 187637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 187737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 187837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 187937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 188037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 188137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 188237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 188337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh poisson_distribution(const _RealType& __mean = _RealType(1)) 188437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mean(__mean), _M_nd() 188537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 188637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); 188737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 188837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 188937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 189037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 189137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the distribution parameter @p mean. 189237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 189337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 189437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 189537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_mean; } 189637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 189737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 189837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 189937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 190037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 190137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 190237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 190337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 190437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 190537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 190637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %poisson_distribution random number distribution 190737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 190837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 190937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 191037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %poisson_distribution random number distribution. 191137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 191237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 191337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 191437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 191537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _RealType1, 191637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 191737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 191837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 191937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const poisson_distribution<_IntType1, _RealType1>& __x); 192037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 192137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 192237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %poisson_distribution random number distribution 192337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 192437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 192537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 192637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %poisson_distribution random number generator engine. 192737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 192837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 192937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 193037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _RealType1, 193137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 193237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 193337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 193437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh poisson_distribution<_IntType1, _RealType1>& __x); 193537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 193637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 193737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 193837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 193937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 194037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 194137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution<_RealType> _M_nd; 194237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 194337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_mean; 194437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 194537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Hosts either log(mean) or the threshold of the simple method. 194637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_lm_thr; 194737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 194837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb; 194937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 195037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 195137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 195237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 195337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 195437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A discrete binomial random number distribution. 195537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 195637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the binomial probability mass function is 195737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(i) = \binom{n}{i} p^i (1 - p)^{t - i} @f$ where @f$ t @f$ 195837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * and @f$ p @f$ are the parameters of the distribution. 195937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 196037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType = int, typename _RealType = double> 196137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class binomial_distribution 196237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 196337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 196437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 196537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 196637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _IntType result_type; 196737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 196837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // constructors and member function 196937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 197037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh binomial_distribution(_IntType __t = 1, 197137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const _RealType& __p = _RealType(0.5)) 197237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_t(__t), _M_p(__p), _M_nd() 197337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 197437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT((_M_t >= 0) && (_M_p >= 0.0) && (_M_p <= 1.0)); 197537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 197637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 197737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 197837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 197937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the distribution @p t parameter. 198037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 198137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType 198237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh t() const 198337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_t; } 198437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 198537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 198637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the distribution @p p parameter. 198737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 198837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 198937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh p() const 199037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_p; } 199137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 199237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 199337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 199437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_nd.reset(); } 199537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 199637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 199737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 199837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 199937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 200037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 200137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %binomial_distribution random number distribution 200237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 200337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 200437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 200537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %binomial_distribution random number distribution. 200637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 200737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 200837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 200937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 201037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _RealType1, 201137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 201237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 201337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 201437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const binomial_distribution<_IntType1, _RealType1>& __x); 201537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 201637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 201737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %binomial_distribution random number distribution 201837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 201937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 202037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 202137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %binomial_distribution random number generator engine. 202237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 202337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 202437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 202537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _IntType1, typename _RealType1, 202637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typename _CharT, typename _Traits> 202737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 202837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 202937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh binomial_distribution<_IntType1, _RealType1>& __x); 203037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 203137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 203237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 203337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 203437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 203537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 203637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 203737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t); 203837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 203937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined. 204037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution<_RealType> _M_nd; 204137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 204237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_q; 204337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#if _GLIBCXX_USE_C99_MATH_TR1 204437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_d1, _M_d2, _M_s1, _M_s2, _M_c, 204537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p; 204637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif 204737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_p; 204837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _IntType _M_t; 204937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 205037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool _M_easy; 205137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 205237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 205337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group tr1_random_distributions_discrete 205437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 205537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 205637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @addtogroup tr1_random_distributions_continuous Continuous Distributions 205737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @ingroup tr1_random_distributions 205837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @{ 205937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 206037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 206137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 206237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief Uniform continuous distribution for random numbers. 206337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 206437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * A continuous random distribution on the range [min, max) with equal 206537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * probability throughout the range. The URNG should be real-valued and 206637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * deliver number in the range [0, 1). 206737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 206837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 206937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class uniform_real 207037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 207137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 207237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 207337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 207437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 207537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 207637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 207737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 207837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a uniform_real object. 207937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 208037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __min [IN] The lower bound of the distribution. 208137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __max [IN] The upper bound of the distribution. 208237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 208337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 208437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_real(_RealType __min = _RealType(0), 208537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType __max = _RealType(1)) 208637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_min(__min), _M_max(__max) 208737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 208837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max); 208937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 209037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 209137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 209237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh min() const 209337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_min; } 209437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 209537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 209637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh max() const 209737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_max; } 209837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 209937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 210037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 210137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 210237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 210337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 210437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 210537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return (__urng() * (_M_max - _M_min)) + _M_min; } 210637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 210737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 210837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %uniform_real random number distribution @p __x into the 210937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * output stream @p __os. 211037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 211137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 211237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_real random number distribution. 211337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 211437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 211537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 211637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 211737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 211837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 211937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 212037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const uniform_real<_RealType1>& __x); 212137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 212237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 212337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %uniform_real random number distribution 212437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 212537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 212637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 212737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %uniform_real random number generator engine. 212837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 212937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 213037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 213137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 213237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 213337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 213437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh uniform_real<_RealType1>& __x); 213537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 213637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 213737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_min; 213837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType _M_max; 213937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 214037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 214137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 214237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 214337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief An exponential continuous distribution for random numbers. 214437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 214537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the exponential probability mass function is 214637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(x) = \lambda e^{-\lambda x} @f$. 214737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 214837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <table border=1 cellpadding=10 cellspacing=0> 214937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <caption align=top>Distribution Statistics</caption> 215037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Mean</td><td>@f$ \frac{1}{\lambda} @f$</td></tr> 215137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Median</td><td>@f$ \frac{\ln 2}{\lambda} @f$</td></tr> 215237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Mode</td><td>@f$ zero @f$</td></tr> 215337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr> 215437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * <tr><td>Standard Deviation</td><td>@f$ \frac{1}{\lambda} @f$</td></tr> 215537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * </table> 215637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 215737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 215837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class exponential_distribution 215937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 216037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 216137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 216237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 216337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 216437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 216537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 216637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 216737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs an exponential distribution with inverse scale parameter 216837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ \lambda @f$. 216937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 217037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 217137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh exponential_distribution(const result_type& __lambda = result_type(1)) 217237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_lambda(__lambda) 217337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 217437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_lambda > 0); 217537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 217637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 217737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 217837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the inverse scale parameter of the distribution. 217937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 218037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 218137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh lambda() const 218237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_lambda; } 218337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 218437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 218537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution. 218637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 218737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Has no effect on exponential distributions. 218837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 218937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 219037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 219137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 219237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 219337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 219437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng) 219537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return -std::log(__urng()) / _M_lambda; } 219637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 219737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 219837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %exponential_distribution random number distribution 219937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 220037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 220137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 220237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %exponential_distribution random number distribution. 220337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 220437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 220537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 220637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 220737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 220837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 220937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 221037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const exponential_distribution<_RealType1>& __x); 221137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 221237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 221337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %exponential_distribution random number distribution 221437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 221537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 221637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 221737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %exponential_distribution random number 221837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * generator engine. 221937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 222037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 222137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 222237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 222337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 222437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 222537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh exponential_distribution& __x) 222637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return __is >> __x._M_lambda; } 222737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 222837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 222937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_lambda; 223037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 223137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 223237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 223337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 223437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A normal continuous distribution for random numbers. 223537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 223637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the normal probability mass function is 223737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(x) = \frac{1}{\sigma \sqrt{2 \pi}} 223837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * e^{- \frac{{x - mean}^ {2}}{2 \sigma ^ {2}} } @f$. 223937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 224037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 224137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class normal_distribution 224237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 224337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 224437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 224537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 224637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 224737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 224837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 224937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 225037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a normal distribution with parameters @f$ mean @f$ and 225137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ \sigma @f$. 225237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 225337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 225437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution(const result_type& __mean = result_type(0), 225537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const result_type& __sigma = result_type(1)) 225637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_mean(__mean), _M_sigma(__sigma), _M_saved_available(false) 225737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 225837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_sigma > 0); 225937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 226037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 226137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 226237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the mean of the distribution. 226337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 226437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 226537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh mean() const 226637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_mean; } 226737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 226837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 226937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the @f$ \sigma @f$ of the distribution. 227037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 227137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 227237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh sigma() const 227337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_sigma; } 227437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 227537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 227637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution. 227737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 227837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 227937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() 228037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { _M_saved_available = false; } 228137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 228237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 228337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 228437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 228537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 228637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 228737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %normal_distribution random number distribution 228837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 228937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 229037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 229137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %normal_distribution random number distribution. 229237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 229337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 229437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 229537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 229637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 229737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 229837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 229937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const normal_distribution<_RealType1>& __x); 230037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 230137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 230237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %normal_distribution random number distribution 230337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 230437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 230537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 230637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %normal_distribution random number generator engine. 230737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 230837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 230937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 231037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 231137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 231237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 231337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh normal_distribution<_RealType1>& __x); 231437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 231537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 231637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_mean; 231737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_sigma; 231837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_saved; 231937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh bool _M_saved_available; 232037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 232137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 232237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 232337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 232437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @brief A gamma continuous distribution for random numbers. 232537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 232637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * The formula for the gamma probability mass function is 232737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @f$ p(x) = \frac{1}{\Gamma(\alpha)} x^{\alpha - 1} e^{-x} @f$. 232837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 232937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType = double> 233037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh class gamma_distribution 233137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 233237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 233337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // types 233437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType input_type; 233537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh typedef _RealType result_type; 233637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 233737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh public: 233837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 233937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Constructs a gamma distribution with parameters @f$ \alpha @f$. 234037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 234137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh explicit 234237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh gamma_distribution(const result_type& __alpha_val = result_type(1)) 234337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh : _M_alpha(__alpha_val) 234437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 234537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _GLIBCXX_DEBUG_ASSERT(_M_alpha > 0); 234637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 234737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 234837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 234937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 235037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Gets the @f$ \alpha @f$ of the distribution. 235137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 235237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _RealType 235337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh alpha() const 235437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { return _M_alpha; } 235537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 235637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 235737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Resets the distribution. 235837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 235937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 236037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh reset() { } 236137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 236237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<class _UniformRandomNumberGenerator> 236337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type 236437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator()(_UniformRandomNumberGenerator& __urng); 236537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 236637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 236737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Inserts a %gamma_distribution random number distribution 236837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x into the output stream @p __os. 236937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 237037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __os An output stream. 237137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %gamma_distribution random number distribution. 237237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 237337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The output stream with the state of @p __x inserted or in 237437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * an error state. 237537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 237637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _RealType1, typename _CharT, typename _Traits> 237737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_ostream<_CharT, _Traits>& 237837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator<<(std::basic_ostream<_CharT, _Traits>& __os, 237937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh const gamma_distribution<_RealType1>& __x); 238037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 238137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /** 238237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * Extracts a %gamma_distribution random number distribution 238337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @p __x from the input stream @p __is. 238437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 238537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __is An input stream. 238637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @param __x A %gamma_distribution random number generator engine. 238737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * 238837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh * @returns The input stream with @p __x extracted or in an error state. 238937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh */ 239037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh template<typename _CharT, typename _Traits> 239137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh friend std::basic_istream<_CharT, _Traits>& 239237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh operator>>(std::basic_istream<_CharT, _Traits>& __is, 239337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh gamma_distribution& __x) 239437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh { 239537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __is >> __x._M_alpha; 239637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh __x._M_initialize(); 239737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh return __is; 239837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh } 239937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 240037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh private: 240137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh void 240237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh _M_initialize(); 240337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 240437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_alpha; 240537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 240637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh // Hosts either lambda of GB or d of modified Vaduva's. 240737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh result_type _M_l_d; 240837f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh }; 240937f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 241037f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group tr1_random_distributions_continuous 241137f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group tr1_random_distributions 241237f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh /* @} */ // group tr1_random 241337f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh_GLIBCXX_END_NAMESPACE_VERSION 241437f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} 241537f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh} 241637f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh 241737f12739251d2637c9405c75951962b5e27bbceeAndrew Hsieh#endif // _GLIBCXX_TR1_RANDOM_H 2418