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