]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/libstdc++/include/tr1/random
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / libstdc++ / include / tr1 / random
1 // random number generation -*- C++ -*-
2
3 // Copyright (C) 2006 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19 // USA.
20
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
29
30 /**
31  * @file tr1/random
32  * This is a TR1 C++ Library header. 
33  */
34
35 #ifndef _TR1_RANDOM
36 #define _TR1_RANDOM 1
37
38 #include <cmath>
39 #include <cstdio>
40 #include <string>
41 #include <iosfwd>
42 #include <limits>
43 #include <tr1/type_traits>
44 #include <tr1/cmath>
45 #include <ext/type_traits.h>
46 #include <ext/numeric_traits.h>
47 #include <bits/concept_check.h>
48 #include <debug/debug.h>
49
50 namespace std
51 {
52 _GLIBCXX_BEGIN_NAMESPACE(tr1)
53
54   // [5.1] Random number generation
55
56   /**
57    * @addtogroup tr1_random Random Number Generation
58    * A facility for generating random numbers on selected distributions.
59    * @{
60    */
61
62   /*
63    * Implementation-space details.
64    */
65   namespace __detail
66   {
67     template<typename _UIntType, int __w, 
68              bool = __w < std::numeric_limits<_UIntType>::digits>
69       struct _Shift
70       { static const _UIntType __value = 0; };
71
72     template<typename _UIntType, int __w>
73       struct _Shift<_UIntType, __w, true>
74       { static const _UIntType __value = _UIntType(1) << __w; };
75
76     template<typename _Tp, _Tp __a, _Tp __c, _Tp __m, bool>
77       struct _Mod;
78
79     // Dispatch based on modulus value to prevent divide-by-zero compile-time
80     // errors when m == 0.
81     template<typename _Tp, _Tp __a, _Tp __c, _Tp __m>
82       inline _Tp
83       __mod(_Tp __x)
84       { return _Mod<_Tp, __a, __c, __m, __m == 0>::__calc(__x); }
85
86     typedef __gnu_cxx::__conditional_type<(sizeof(unsigned) == 4),
87                     unsigned, unsigned long>::__type _UInt32Type;
88
89     /*
90      * An adaptor class for converting the output of any Generator into
91      * the input for a specific Distribution.
92      */
93     template<typename _Engine, typename _Distribution>
94       struct _Adaptor
95       { 
96         typedef typename _Engine::result_type        _Engine_result_type;
97         typedef typename _Distribution::input_type   result_type;
98
99       public:
100         _Adaptor(const _Engine& __g)
101         : _M_g(__g) { }
102
103         result_type
104         min() const
105         {
106           result_type __return_value = 0;
107           if (is_integral<_Engine_result_type>::value
108               && is_integral<result_type>::value)
109             __return_value = _M_g.min();
110           else if (!is_integral<result_type>::value)
111             __return_value = result_type(0);
112           return __return_value;
113         }
114
115         result_type
116         max() const
117         {
118           result_type __return_value = 0;
119           if (is_integral<_Engine_result_type>::value
120               && is_integral<result_type>::value)
121             __return_value = _M_g.max();
122           else if (!is_integral<result_type>::value)
123             __return_value = result_type(1);
124           return __return_value;
125         }
126
127         result_type
128         operator()();
129
130       private:
131         _Engine _M_g;
132       };
133
134     /*
135      * Converts a value generated by the adapted random number generator into a
136      * value in the input domain for the dependent random number distribution.
137      *
138      * Because the type traits are compile time constants only the appropriate
139      * clause of the if statements will actually be emitted by the compiler.
140      */
141     template<typename _Engine, typename _Distribution>
142       typename _Adaptor<_Engine, _Distribution>::result_type
143       _Adaptor<_Engine, _Distribution>::
144       operator()()
145       {
146         result_type __return_value = 0;
147         if (is_integral<_Engine_result_type>::value
148             && is_integral<result_type>::value)
149           __return_value = _M_g();
150         else if (is_integral<_Engine_result_type>::value
151                  && !is_integral<result_type>::value)
152           __return_value = result_type(_M_g() - _M_g.min())
153             / result_type(_M_g.max() - _M_g.min() + result_type(1));
154         else if (!is_integral<_Engine_result_type>::value
155                  && !is_integral<result_type>::value)
156           __return_value = result_type(_M_g() - _M_g.min())
157             / result_type(_M_g.max() - _M_g.min());
158         return __return_value;
159       }
160   } // namespace __detail
161
162   /**
163    * Produces random numbers on a given disribution function using a un uniform
164    * random number generation engine.
165    *
166    * @todo the engine_value_type needs to be studied more carefully.
167    */
168   template<typename _Engine, typename _Dist>
169     class variate_generator
170     {
171       // Concept requirements.
172       __glibcxx_class_requires(_Engine, _CopyConstructibleConcept)
173       //  __glibcxx_class_requires(_Engine, _EngineConcept)
174       //  __glibcxx_class_requires(_Dist, _EngineConcept)
175
176     public:
177       typedef _Engine                                engine_type;
178       typedef __detail::_Adaptor<_Engine, _Dist>     engine_value_type;
179       typedef _Dist                                  distribution_type;
180       typedef typename _Dist::result_type            result_type;
181
182       // tr1:5.1.1 table 5.1 requirement
183       typedef typename __gnu_cxx::__enable_if<
184         is_arithmetic<result_type>::value, result_type>::__type _IsValidType;
185
186       /**
187        * Constructs a variate generator with the uniform random number
188        * generator @p __eng for the random distribution @p __dist.
189        *
190        * @throws Any exceptions which may thrown by the copy constructors of
191        * the @p _Engine or @p _Dist objects.
192        */
193       variate_generator(engine_type __eng, distribution_type __dist)
194       : _M_engine(__eng), _M_dist(__dist) { }
195
196       /**
197        * Gets the next generated value on the distribution.
198        */
199       result_type
200       operator()()
201       { return _M_dist(_M_engine); }
202
203       /**
204        * WTF?
205        */
206       template<typename _Tp>
207         result_type
208         operator()(_Tp __value)
209         { return _M_dist(_M_engine, __value); }
210
211       /**
212        * Gets a reference to the underlying uniform random number generator
213        * object.
214        */
215       engine_value_type&
216       engine()
217       { return _M_engine; }
218
219       /**
220        * Gets a const reference to the underlying uniform random number
221        * generator object.
222        */
223       const engine_value_type&
224       engine() const
225       { return _M_engine; }
226
227       /**
228        * Gets a reference to the underlying random distribution.
229        */
230       distribution_type&
231       distribution()
232       { return _M_dist; }
233
234       /**
235        * Gets a const reference to the underlying random distribution.
236        */
237       const distribution_type&
238       distribution() const
239       { return _M_dist; }
240
241       /**
242        * Gets the closed lower bound of the distribution interval.
243        */
244       result_type
245       min() const
246       { return this->distribution().min(); }
247
248       /**
249        * Gets the closed upper bound of the distribution interval.
250        */
251       result_type
252       max() const
253       { return this->distribution().max(); }
254
255     private:
256       engine_value_type _M_engine;
257       distribution_type _M_dist;
258     };
259
260
261   /**
262    * @addtogroup tr1_random_generators Random Number Generators
263    * @ingroup tr1_random
264    *
265    * These classes define objects which provide random or pseudorandom
266    * numbers, either from a discrete or a continuous interval.  The
267    * random number generator supplied as a part of this library are
268    * all uniform random number generators which provide a sequence of
269    * random number uniformly distributed over their range.
270    *
271    * A number generator is a function object with an operator() that
272    * takes zero arguments and returns a number.
273    *
274    * A compliant random number generator must satisy the following
275    * requirements.  <table border=1 cellpadding=10 cellspacing=0>
276    * <caption align=top>Random Number Generator Requirements</caption>
277    * <tr><td>To be documented.</td></tr> </table>
278    * 
279    * @{
280    */
281
282   /**
283    * @brief A model of a linear congruential random number generator.
284    *
285    * A random number generator that produces pseudorandom numbers using the
286    * linear function @f$x_{i+1}\leftarrow(ax_{i} + c) \bmod m @f$.
287    *
288    * The template parameter @p _UIntType must be an unsigned integral type
289    * large enough to store values up to (__m-1). If the template parameter
290    * @p __m is 0, the modulus @p __m used is
291    * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
292    * parameters @p __a and @p __c must be less than @p __m.
293    *
294    * The size of the state is @f$ 1 @f$.
295    */
296   template<class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
297     class linear_congruential
298     {
299       __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept)
300       //  __glibcpp_class_requires(__a < __m && __c < __m)
301
302     public:
303       /** The type of the generated random value. */
304       typedef _UIntType result_type;
305
306       /** The multiplier. */
307       static const _UIntType multiplier = __a;
308       /** An increment. */
309       static const _UIntType increment = __c;
310       /** The modulus. */
311       static const _UIntType modulus = __m;
312
313       /**
314        * Constructs a %linear_congruential random number generator engine with
315        * seed @p __s.  The default seed value is 1.
316        *
317        * @param __s The initial seed value.
318        */
319       explicit
320       linear_congruential(unsigned long __x0 = 1)
321       { this->seed(__x0); }
322
323       /**
324        * Constructs a %linear_congruential random number generator engine
325        * seeded from the generator function @p __g.
326        *
327        * @param __g The seed generator function.
328        */
329       template<class _Gen>
330         linear_congruential(_Gen& __g)
331         { this->seed(__g); }
332
333       /**
334        * Reseeds the %linear_congruential random number generator engine
335        * sequence to the seed @g __s.
336        *
337        * @param __s The new seed.
338        */
339       void
340       seed(unsigned long __s = 1);
341
342       /**
343        * Reseeds the %linear_congruential random number generator engine
344        * sequence using values from the generator function @p __g.
345        *
346        * @param __g the seed generator function.
347        */
348       template<class _Gen>
349         void
350         seed(_Gen& __g)
351         { seed(__g, typename is_fundamental<_Gen>::type()); }
352
353       /**
354        * Gets the smallest possible value in the output range.
355        *
356        * The minumum depends on the @p __c parameter: if it is zero, the
357        * minimum generated must be > 0, otherwise 0 is allowed.
358        */
359       result_type
360       min() const
361       { return (__detail::__mod<_UIntType, 1, 0, __m>(__c) == 0) ? 1 : 0; }
362
363       /**
364        * Gets the largest possible value in the output range.
365        */
366       result_type
367       max() const
368       { return __m - 1; }
369
370       /**
371        * Gets the next random number in the sequence.
372        */
373       result_type
374       operator()();
375
376       /**
377        * Compares two linear congruential random number generator
378        * objects of the same type for equality.
379        *  
380        * @param __lhs A linear congruential random number generator object.
381        * @param __rhs Another linear congruential random number generator obj.
382        *
383        * @returns true if the two objects are equal, false otherwise.
384        */
385       friend bool
386       operator==(const linear_congruential& __lhs,
387                  const linear_congruential& __rhs)
388       { return __lhs._M_x == __rhs._M_x; }
389
390       /**
391        * Compares two linear congruential random number generator
392        * objects of the same type for inequality.
393        *
394        * @param __lhs A linear congruential random number generator object.
395        * @param __rhs Another linear congruential random number generator obj.
396        *
397        * @returns true if the two objects are not equal, false otherwise.
398        */
399       friend bool
400       operator!=(const linear_congruential& __lhs,
401                  const linear_congruential& __rhs)
402       { return !(__lhs == __rhs); }
403
404       /**
405        * Writes the textual representation of the state x(i) of x to @p __os.
406        *
407        * @param __os  The output stream.
408        * @param __lcr A % linear_congruential random number generator.
409        * @returns __os.
410        */
411       template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
412                _UIntType1 __m1,
413                typename _CharT, typename _Traits>
414         friend std::basic_ostream<_CharT, _Traits>&
415         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
416                    const linear_congruential<_UIntType1, __a1, __c1,
417                    __m1>& __lcr);
418
419       /**
420        * Sets the state of the engine by reading its textual
421        * representation from @p __is.
422        *
423        * The textual representation must have been previously written using an
424        * output stream whose imbued locale and whose type's template
425        * specialization arguments _CharT and _Traits were the same as those of
426        * @p __is.
427        *
428        * @param __is  The input stream.
429        * @param __lcr A % linear_congruential random number generator.
430        * @returns __is.
431        */
432       template<class _UIntType1, _UIntType1 __a1, _UIntType1 __c1,
433                _UIntType1 __m1,
434                typename _CharT, typename _Traits>
435         friend std::basic_istream<_CharT, _Traits>&
436         operator>>(std::basic_istream<_CharT, _Traits>& __is,
437                    linear_congruential<_UIntType1, __a1, __c1, __m1>& __lcr);
438
439     private:
440       template<class _Gen>
441         void
442         seed(_Gen& __g, true_type)
443         { return seed(static_cast<unsigned long>(__g)); }
444
445       template<class _Gen>
446         void
447         seed(_Gen& __g, false_type);
448
449       _UIntType _M_x;
450     };
451
452   /**
453    * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
454    */
455   typedef linear_congruential<unsigned long, 16807, 0, 2147483647> minstd_rand0;
456
457   /**
458    * An alternative LCR (Lehmer Generator function) .
459    */
460   typedef linear_congruential<unsigned long, 48271, 0, 2147483647> minstd_rand;
461
462
463   /**
464    * A generalized feedback shift register discrete random number generator.
465    *
466    * This algorithm avoind multiplication and division and is designed to be
467    * friendly to a pipelined architecture.  If the parameters are chosen
468    * correctly, this generator will produce numbers with a very long period and
469    * fairly good apparent entropy, although still not cryptographically strong.
470    *
471    * The best way to use this generator is with the predefined mt19937 class.
472    *
473    * This algorithm was originally invented by Makoto Matsumoto and
474    * Takuji Nishimura.
475    *
476    * @var word_size   The number of bits in each element of the state vector.
477    * @var state_size  The degree of recursion.
478    * @var shift_size  The period parameter.
479    * @var mask_bits   The separation point bit index.
480    * @var parameter_a The last row of the twist matrix.
481    * @var output_u    The first right-shift tempering matrix parameter.
482    * @var output_s    The first left-shift tempering matrix parameter.
483    * @var output_b    The first left-shift tempering matrix mask.
484    * @var output_t    The second left-shift tempering matrix parameter.
485    * @var output_c    The second left-shift tempering matrix mask.
486    * @var output_l    The second right-shift tempering matrix parameter.
487    */
488   template<class _UIntType, int __w, int __n, int __m, int __r,
489            _UIntType __a, int __u, int __s, _UIntType __b, int __t,
490            _UIntType __c, int __l>
491     class mersenne_twister
492     {
493       __glibcxx_class_requires(_UIntType, _UnsignedIntegerConcept)
494
495     public:
496       // types
497       typedef _UIntType result_type;
498
499       // parameter values
500       static const int       word_size   = __w;
501       static const int       state_size  = __n;
502       static const int       shift_size  = __m;
503       static const int       mask_bits   = __r;
504       static const _UIntType parameter_a = __a;
505       static const int       output_u    = __u;
506       static const int       output_s    = __s;
507       static const _UIntType output_b    = __b;
508       static const int       output_t    = __t;
509       static const _UIntType output_c    = __c;
510       static const int       output_l    = __l;
511
512       // constructors and member function
513       mersenne_twister()
514       { seed(); }
515
516       explicit
517       mersenne_twister(unsigned long __value)
518       { seed(__value); }
519
520       template<class _Gen>
521         mersenne_twister(_Gen& __g)
522         { seed(__g); }
523
524       void
525       seed()
526       { seed(5489UL); }
527
528       void
529       seed(unsigned long __value);
530
531       template<class _Gen>
532         void
533         seed(_Gen& __g)
534         { seed(__g, typename is_fundamental<_Gen>::type()); }
535
536       result_type
537       min() const
538       { return 0; };
539
540       result_type
541       max() const
542       { return __detail::_Shift<_UIntType, __w>::__value - 1; }
543
544       result_type
545       operator()();
546
547       /**
548        * Compares two % mersenne_twister random number generator objects of
549        * the same type for equality.
550        *
551        * @param __lhs A % mersenne_twister random number generator object.
552        * @param __rhs Another % mersenne_twister random number generator
553        *              object.
554        *
555        * @returns true if the two objects are equal, false otherwise.
556        */
557       friend bool
558       operator==(const mersenne_twister& __lhs,
559                  const mersenne_twister& __rhs)
560       { return std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x); }
561
562       /**
563        * Compares two % mersenne_twister random number generator objects of
564        * the same type for inequality.
565        *
566        * @param __lhs A % mersenne_twister random number generator object.
567        * @param __rhs Another % mersenne_twister random number generator
568        *              object.
569        *
570        * @returns true if the two objects are not equal, false otherwise.
571        */
572       friend bool
573       operator!=(const mersenne_twister& __lhs,
574                  const mersenne_twister& __rhs)
575       { return !(__lhs == __rhs); }
576
577       /**
578        * Inserts the current state of a % mersenne_twister random number
579        * generator engine @p __x into the output stream @p __os.
580        *
581        * @param __os An output stream.
582        * @param __x  A % mersenne_twister random number generator engine.
583        *
584        * @returns The output stream with the state of @p __x inserted or in
585        * an error state.
586        */
587       template<class _UIntType1, int __w1, int __n1, int __m1, int __r1,
588                _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1,
589                _UIntType1 __c1, int __l1,
590                typename _CharT, typename _Traits>
591         friend std::basic_ostream<_CharT, _Traits>&
592         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
593                    const mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1,
594                    __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x);
595
596       /**
597        * Extracts the current state of a % mersenne_twister random number
598        * generator engine @p __x from the input stream @p __is.
599        *
600        * @param __is An input stream.
601        * @param __x  A % mersenne_twister random number generator engine.
602        *
603        * @returns The input stream with the state of @p __x extracted or in
604        * an error state.
605        */
606       template<class _UIntType1, int __w1, int __n1, int __m1, int __r1,
607                _UIntType1 __a1, int __u1, int __s1, _UIntType1 __b1, int __t1,
608                _UIntType1 __c1, int __l1,
609                typename _CharT, typename _Traits>
610         friend std::basic_istream<_CharT, _Traits>&
611         operator>>(std::basic_istream<_CharT, _Traits>& __is,
612                    mersenne_twister<_UIntType1, __w1, __n1, __m1, __r1,
613                    __a1, __u1, __s1, __b1, __t1, __c1, __l1>& __x);
614
615     private:
616       template<class _Gen>
617         void
618         seed(_Gen& __g, true_type)
619         { return seed(static_cast<unsigned long>(__g)); }
620
621       template<class _Gen>
622         void
623         seed(_Gen& __g, false_type);
624
625       _UIntType _M_x[state_size];
626       int       _M_p;
627     };
628
629   /**
630    * The classic Mersenne Twister.
631    *
632    * Reference:
633    * M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally
634    * Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions
635    * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
636    */
637   typedef mersenne_twister<
638     unsigned long, 32, 624, 397, 31,
639     0x9908b0dful, 11, 7,
640     0x9d2c5680ul, 15,
641     0xefc60000ul, 18
642     > mt19937;
643
644
645   /**
646    * @brief The Marsaglia-Zaman generator.
647    * 
648    * This is a model of a Generalized Fibonacci discrete random number
649    * generator, sometimes referred to as the SWC generator.
650    *
651    * A discrete random number generator that produces pseudorandom
652    * numbers using @f$x_{i}\leftarrow(x_{i - s} - x_{i - r} -
653    * carry_{i-1}) \bmod m @f$.
654    *
655    * The size of the state is @f$ r @f$
656    * and the maximum period of the generator is @f$ m^r - m^s -1 @f$.
657    *
658    * N1688[4.13] says "the template parameter _IntType shall denote an integral
659    * type large enough to store values up to m."
660    *
661    * @if maint
662    * @var _M_x     The state of the generator.  This is a ring buffer.
663    * @var _M_carry The carry.
664    * @var _M_p     Current index of x(i - r).
665    * @endif
666    */
667   template<typename _IntType, _IntType __m, int __s, int __r>
668     class subtract_with_carry
669     {
670       __glibcxx_class_requires(_IntType, _IntegerConcept)
671
672     public:
673       /** The type of the generated random value. */
674       typedef _IntType result_type;
675       
676       // parameter values
677       static const _IntType modulus   = __m;
678       static const int      long_lag  = __r;
679       static const int      short_lag = __s;
680
681       /**
682        * Constructs a default-initialized % subtract_with_carry random number
683        * generator.
684        */
685       subtract_with_carry()
686       { this->seed(); }
687
688       /**
689        * Constructs an explicitly seeded % subtract_with_carry random number
690        * generator.
691        */
692       explicit
693       subtract_with_carry(unsigned long __value)
694       { this->seed(__value); }
695
696       /**
697        * Constructs a %subtract_with_carry random number generator engine
698        * seeded from the generator function @p __g.
699        *
700        * @param __g The seed generator function.
701        */
702       template<class _Gen>
703         subtract_with_carry(_Gen& __g)
704         { this->seed(__g); }
705
706       /**
707        * Seeds the initial state @f$ x_0 @f$ of the random number generator.
708        *
709        * N1688[4.19] modifies this as follows.  If @p __value == 0,
710        * sets value to 19780503.  In any case, with a linear
711        * congruential generator lcg(i) having parameters @f$ m_{lcg} =
712        * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value
713        * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m
714        * \dots lcg(r) \bmod m @f$ respectively.  If @f$ x_{-1} = 0 @f$
715        * set carry to 1, otherwise sets carry to 0.
716        */
717       void
718       seed(unsigned long __value = 19780503);
719
720       /**
721        * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry
722        * random number generator.
723        */
724       template<class _Gen>
725         void
726         seed(_Gen& __g)
727         { seed(__g, typename is_fundamental<_Gen>::type()); }
728
729       /**
730        * Gets the inclusive minimum value of the range of random integers
731        * returned by this generator.
732        */
733       result_type
734       min() const
735       { return 0; }
736
737       /**
738        * Gets the inclusive maximum value of the range of random integers
739        * returned by this generator.
740        */
741       result_type
742       max() const
743       { return this->modulus - 1; }
744
745       /**
746        * Gets the next random number in the sequence.
747        */
748       result_type
749       operator()();
750
751       /**
752        * Compares two % subtract_with_carry random number generator objects of
753        * the same type for equality.
754        *
755        * @param __lhs A % subtract_with_carry random number generator object.
756        * @param __rhs Another % subtract_with_carry random number generator
757        *              object.
758        *
759        * @returns true if the two objects are equal, false otherwise.
760        */
761       friend bool
762       operator==(const subtract_with_carry& __lhs,
763                  const subtract_with_carry& __rhs)
764       { return std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x); }
765
766       /**
767        * Compares two % subtract_with_carry random number generator objects of
768        * the same type for inequality.
769        *
770        * @param __lhs A % subtract_with_carry random number generator object.
771        * @param __rhs Another % subtract_with_carry random number generator
772        *              object.
773        *
774        * @returns true if the two objects are not equal, false otherwise.
775        */
776       friend bool
777       operator!=(const subtract_with_carry& __lhs,
778                  const subtract_with_carry& __rhs)
779       { return !(__lhs == __rhs); }
780
781       /**
782        * Inserts the current state of a % subtract_with_carry random number
783        * generator engine @p __x into the output stream @p __os.
784        *
785        * @param __os An output stream.
786        * @param __x  A % subtract_with_carry random number generator engine.
787        *
788        * @returns The output stream with the state of @p __x inserted or in
789        * an error state.
790        */
791       template<typename _IntType1, _IntType1 __m1, int __s1, int __r1,
792                typename _CharT, typename _Traits>
793         friend std::basic_ostream<_CharT, _Traits>&
794         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
795                    const subtract_with_carry<_IntType1, __m1, __s1,
796                    __r1>& __x);
797
798       /**
799        * Extracts the current state of a % subtract_with_carry random number
800        * generator engine @p __x from the input stream @p __is.
801        *
802        * @param __is An input stream.
803        * @param __x  A % subtract_with_carry random number generator engine.
804        *
805        * @returns The input stream with the state of @p __x extracted or in
806        * an error state.
807        */
808       template<typename _IntType1, _IntType1 __m1, int __s1, int __r1,
809                typename _CharT, typename _Traits>
810         friend std::basic_istream<_CharT, _Traits>&
811         operator>>(std::basic_istream<_CharT, _Traits>& __is,
812                    subtract_with_carry<_IntType1, __m1, __s1, __r1>& __x);
813
814     private:
815       template<class _Gen>
816         void
817         seed(_Gen& __g, true_type)
818         { return seed(static_cast<unsigned long>(__g)); }
819
820       template<class _Gen>
821         void
822         seed(_Gen& __g, false_type);
823
824       typedef typename __gnu_cxx::__add_unsigned<_IntType>::__type _UIntType;
825
826       _UIntType  _M_x[long_lag];
827       _UIntType  _M_carry;
828       int        _M_p;
829     };
830
831
832   /**
833    * @brief The Marsaglia-Zaman generator (floats version).
834    *
835    * @if maint
836    * @var _M_x     The state of the generator.  This is a ring buffer.
837    * @var _M_carry The carry.
838    * @var _M_p     Current index of x(i - r).
839    * @var _M_npows Precomputed negative powers of 2.   
840    * @endif
841    */
842   template<typename _RealType, int __w, int __s, int __r>
843     class subtract_with_carry_01
844     {
845     public:
846       /** The type of the generated random value. */
847       typedef _RealType result_type;
848       
849       // parameter values
850       static const int      word_size = __w;
851       static const int      long_lag  = __r;
852       static const int      short_lag = __s;
853
854       /**
855        * Constructs a default-initialized % subtract_with_carry_01 random
856        * number generator.
857        */
858       subtract_with_carry_01()
859       {
860         this->seed();
861         _M_initialize_npows();
862       }
863
864       /**
865        * Constructs an explicitly seeded % subtract_with_carry_01 random number
866        * generator.
867        */
868       explicit
869       subtract_with_carry_01(unsigned long __value)
870       {
871         this->seed(__value);
872         _M_initialize_npows();
873       }
874
875       /**
876        * Constructs a % subtract_with_carry_01 random number generator engine
877        * seeded from the generator function @p __g.
878        *
879        * @param __g The seed generator function.
880        */
881       template<class _Gen>
882         subtract_with_carry_01(_Gen& __g)
883         {
884           this->seed(__g);
885           _M_initialize_npows();          
886         }
887
888       /**
889        * Seeds the initial state @f$ x_0 @f$ of the random number generator.
890        */
891       void
892       seed(unsigned long __value = 19780503);
893
894       /**
895        * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry_01
896        * random number generator.
897        */
898       template<class _Gen>
899         void
900         seed(_Gen& __g)
901         { seed(__g, typename is_fundamental<_Gen>::type()); }
902
903       /**
904        * Gets the minimum value of the range of random floats
905        * returned by this generator.
906        */
907       result_type
908       min() const
909       { return 0.0; }
910
911       /**
912        * Gets the maximum value of the range of random floats
913        * returned by this generator.
914        */
915       result_type
916       max() const
917       { return 1.0; }
918
919       /**
920        * Gets the next random number in the sequence.
921        */
922       result_type
923       operator()();
924
925       /**
926        * Compares two % subtract_with_carry_01 random number generator objects
927        * of the same type for equality.
928        *
929        * @param __lhs A % subtract_with_carry_01 random number
930        *              generator object.
931        * @param __rhs Another % subtract_with_carry_01 random number generator
932        *              object.
933        *
934        * @returns true if the two objects are equal, false otherwise.
935        */
936       friend bool
937       operator==(const subtract_with_carry_01& __lhs,
938                  const subtract_with_carry_01& __rhs)
939       {
940         for (int __i = 0; __i < long_lag; ++__i)
941           if (!std::equal(__lhs._M_x[__i], __lhs._M_x[__i] + __n,
942                           __rhs._M_x[__i]))
943             return false;
944         return true;
945       }
946
947       /**
948        * Compares two % subtract_with_carry_01 random number generator objects
949        * of the same type for inequality.
950        *
951        * @param __lhs A % subtract_with_carry_01 random number
952        *              generator object.
953        *
954        * @param __rhs Another % subtract_with_carry_01 random number generator
955        *              object.
956        *
957        * @returns true if the two objects are not equal, false otherwise.
958        */
959       friend bool
960       operator!=(const subtract_with_carry_01& __lhs,
961                  const subtract_with_carry_01& __rhs)
962       { return !(__lhs == __rhs); }
963
964       /**
965        * Inserts the current state of a % subtract_with_carry_01 random number
966        * generator engine @p __x into the output stream @p __os.
967        *
968        * @param __os An output stream.
969        * @param __x  A % subtract_with_carry_01 random number generator engine.
970        *
971        * @returns The output stream with the state of @p __x inserted or in
972        * an error state.
973        */
974       template<typename _RealType1, int __w1, int __s1, int __r1,
975                typename _CharT, typename _Traits>
976         friend std::basic_ostream<_CharT, _Traits>&
977         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
978                    const subtract_with_carry_01<_RealType1, __w1, __s1,
979                    __r1>& __x);
980
981       /**
982        * Extracts the current state of a % subtract_with_carry_01 random number
983        * generator engine @p __x from the input stream @p __is.
984        *
985        * @param __is An input stream.
986        * @param __x  A % subtract_with_carry_01 random number generator engine.
987        *
988        * @returns The input stream with the state of @p __x extracted or in
989        * an error state.
990        */
991       template<typename _RealType1, int __w1, int __s1, int __r1,
992                typename _CharT, typename _Traits>
993         friend std::basic_istream<_CharT, _Traits>&
994         operator>>(std::basic_istream<_CharT, _Traits>& __is,
995                    subtract_with_carry_01<_RealType1, __w1, __s1, __r1>& __x);
996
997     private:
998       template<class _Gen>
999         void
1000         seed(_Gen& __g, true_type)
1001         { return seed(static_cast<unsigned long>(__g)); }
1002
1003       template<class _Gen>
1004         void
1005         seed(_Gen& __g, false_type);
1006
1007       void
1008       _M_initialize_npows();
1009
1010       static const int __n = (__w + 31) / 32;
1011
1012       typedef __detail::_UInt32Type _UInt32Type;
1013       _UInt32Type  _M_x[long_lag][__n];
1014       _RealType    _M_npows[__n];
1015       _UInt32Type  _M_carry;
1016       int          _M_p;
1017     };
1018
1019   typedef subtract_with_carry_01<float, 24, 10, 24>   ranlux_base_01;
1020
1021   // _GLIBCXX_RESOLVE_LIB_DEFECTS
1022   // 508. Bad parameters for ranlux64_base_01.
1023   typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01;  
1024
1025
1026   /**
1027    * Produces random numbers from some base engine by discarding blocks of
1028    * data.
1029    *
1030    * 0 <= @p __r <= @p __p
1031    */
1032   template<class _UniformRandomNumberGenerator, int __p, int __r>
1033     class discard_block
1034     {
1035       // __glibcxx_class_requires(typename base_type::result_type,
1036       //                          ArithmeticTypeConcept)
1037
1038     public:
1039       /** The type of the underlying generator engine. */
1040       typedef _UniformRandomNumberGenerator   base_type;
1041       /** The type of the generated random value. */
1042       typedef typename base_type::result_type result_type;
1043
1044       // parameter values
1045       static const int block_size = __p;
1046       static const int used_block = __r;
1047
1048       /**
1049        * Constructs a default %discard_block engine.
1050        *
1051        * The underlying engine is default constructed as well.
1052        */
1053       discard_block()
1054       : _M_n(0) { }
1055
1056       /**
1057        * Copy constructs a %discard_block engine.
1058        *
1059        * Copies an existing base class random number geenerator.
1060        * @param rng An existing (base class) engine object.
1061        */
1062       explicit
1063       discard_block(const base_type& __rng)
1064       : _M_b(__rng), _M_n(0) { }
1065
1066       /**
1067        * Seed constructs a %discard_block engine.
1068        *
1069        * Constructs the underlying generator engine seeded with @p __s.
1070        * @param __s A seed value for the base class engine.
1071        */
1072       explicit
1073       discard_block(unsigned long __s)
1074       : _M_b(__s), _M_n(0) { }
1075
1076       /**
1077        * Generator construct a %discard_block engine.
1078        *
1079        * @param __g A seed generator function.
1080        */
1081       template<class _Gen>
1082         discard_block(_Gen& __g)
1083         : _M_b(__g), _M_n(0) { }
1084
1085       /**
1086        * Reseeds the %discard_block object with the default seed for the
1087        * underlying base class generator engine.
1088        */
1089       void seed()
1090       {
1091         _M_b.seed();
1092         _M_n = 0;
1093       }
1094
1095       /**
1096        * Reseeds the %discard_block object with the given seed generator
1097        * function.
1098        * @param __g A seed generator function.
1099        */
1100       template<class _Gen>
1101         void seed(_Gen& __g)
1102         {
1103           _M_b.seed(__g);
1104           _M_n = 0;
1105         }
1106
1107       /**
1108        * Gets a const reference to the underlying generator engine object.
1109        */
1110       const base_type&
1111       base() const
1112       { return _M_b; }
1113
1114       /**
1115        * Gets the minimum value in the generated random number range.
1116        */
1117       result_type
1118       min() const
1119       { return _M_b.min(); }
1120
1121       /**
1122        * Gets the maximum value in the generated random number range.
1123        */
1124       result_type
1125       max() const
1126       { return _M_b.max(); }
1127
1128       /**
1129        * Gets the next value in the generated random number sequence.
1130        */
1131       result_type
1132       operator()();
1133
1134       /**
1135        * Compares two %discard_block random number generator objects of
1136        * the same type for equality.
1137        *
1138        * @param __lhs A %discard_block random number generator object.
1139        * @param __rhs Another %discard_block random number generator
1140        *              object.
1141        *
1142        * @returns true if the two objects are equal, false otherwise.
1143        */
1144       friend bool
1145       operator==(const discard_block& __lhs, const discard_block& __rhs)
1146       { return (__lhs._M_b == __rhs._M_b) && (__lhs._M_n == __rhs._M_n); }
1147
1148       /**
1149        * Compares two %discard_block random number generator objects of
1150        * the same type for inequality.
1151        *
1152        * @param __lhs A %discard_block random number generator object.
1153        * @param __rhs Another %discard_block random number generator
1154        *              object.
1155        *
1156        * @returns true if the two objects are not equal, false otherwise.
1157        */
1158       friend bool
1159       operator!=(const discard_block& __lhs, const discard_block& __rhs)
1160       { return !(__lhs == __rhs); }
1161
1162       /**
1163        * Inserts the current state of a %discard_block random number
1164        * generator engine @p __x into the output stream @p __os.
1165        *
1166        * @param __os An output stream.
1167        * @param __x  A %discard_block random number generator engine.
1168        *
1169        * @returns The output stream with the state of @p __x inserted or in
1170        * an error state.
1171        */
1172       template<class _UniformRandomNumberGenerator1, int __p1, int __r1,
1173                typename _CharT, typename _Traits>
1174         friend std::basic_ostream<_CharT, _Traits>&
1175         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1176                    const discard_block<_UniformRandomNumberGenerator1,
1177                    __p1, __r1>& __x);
1178
1179       /**
1180        * Extracts the current state of a % subtract_with_carry random number
1181        * generator engine @p __x from the input stream @p __is.
1182        *
1183        * @param __is An input stream.
1184        * @param __x  A %discard_block random number generator engine.
1185        *
1186        * @returns The input stream with the state of @p __x extracted or in
1187        * an error state.
1188        */
1189       template<class _UniformRandomNumberGenerator1, int __p1, int __r1,
1190                typename _CharT, typename _Traits>
1191         friend std::basic_istream<_CharT, _Traits>&
1192         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1193                    discard_block<_UniformRandomNumberGenerator1,
1194                    __p1, __r1>& __x);
1195
1196     private:
1197       base_type _M_b;
1198       int       _M_n;
1199     };
1200
1201
1202   /**
1203    * James's luxury-level-3 integer adaptation of Luescher's generator.
1204    */
1205   typedef discard_block<
1206     subtract_with_carry<unsigned long, (1UL << 24), 10, 24>,
1207       223,
1208       24
1209       > ranlux3;
1210
1211   /**
1212    * James's luxury-level-4 integer adaptation of Luescher's generator.
1213    */
1214   typedef discard_block<
1215     subtract_with_carry<unsigned long, (1UL << 24), 10, 24>,
1216       389,
1217       24
1218       > ranlux4;
1219
1220   typedef discard_block<
1221     subtract_with_carry_01<float, 24, 10, 24>,
1222       223,
1223       24
1224       > ranlux3_01;
1225
1226   typedef discard_block<
1227     subtract_with_carry_01<float, 24, 10, 24>,
1228       389,
1229       24
1230       > ranlux4_01;
1231
1232
1233   /**
1234    * A random number generator adaptor class that combines two random number
1235    * generator engines into a single output sequence.
1236    */
1237   template<class _UniformRandomNumberGenerator1, int __s1,
1238            class _UniformRandomNumberGenerator2, int __s2>
1239     class xor_combine
1240     {
1241       // __glibcxx_class_requires(typename _UniformRandomNumberGenerator1::
1242       //                          result_type, ArithmeticTypeConcept)
1243       // __glibcxx_class_requires(typename _UniformRandomNumberGenerator2::
1244       //                          result_type, ArithmeticTypeConcept)
1245
1246     public:
1247       /** The type of the the first underlying generator engine. */
1248       typedef _UniformRandomNumberGenerator1   base1_type;
1249       /** The type of the the second underlying generator engine. */
1250       typedef _UniformRandomNumberGenerator2   base2_type;
1251
1252     private:
1253       typedef typename base1_type::result_type _Result_type1;
1254       typedef typename base2_type::result_type _Result_type2;
1255
1256     public:
1257       /** The type of the generated random value. */
1258       typedef typename __gnu_cxx::__conditional_type<(sizeof(_Result_type1)
1259                                                       > sizeof(_Result_type2)),
1260         _Result_type1, _Result_type2>::__type result_type;
1261
1262       // parameter values
1263       static const int shift1 = __s1;
1264       static const int shift2 = __s2;
1265
1266       // constructors and member function
1267       xor_combine()
1268       : _M_b1(), _M_b2()        
1269       { _M_initialize_max(); }
1270
1271       xor_combine(const base1_type& __rng1, const base2_type& __rng2)
1272       : _M_b1(__rng1), _M_b2(__rng2)
1273       { _M_initialize_max(); }
1274
1275       xor_combine(unsigned long __s)
1276       : _M_b1(__s), _M_b2(__s + 1)
1277       { _M_initialize_max(); }
1278
1279       template<class _Gen>
1280         xor_combine(_Gen& __g)
1281         : _M_b1(__g), _M_b2(__g)
1282         { _M_initialize_max(); }
1283
1284       void
1285       seed()
1286       {
1287         _M_b1.seed();
1288         _M_b2.seed();
1289       }
1290
1291       template<class _Gen>
1292         void
1293         seed(_Gen& __g)
1294         {
1295           _M_b1.seed(__g);
1296           _M_b2.seed(__g);
1297         }
1298
1299       const base1_type&
1300       base1() const
1301       { return _M_b1; }
1302
1303       const base2_type&
1304       base2() const
1305       { return _M_b2; }
1306
1307       result_type
1308       min() const
1309       { return 0; }
1310
1311       result_type
1312       max() const
1313       { return _M_max; }
1314
1315       /**
1316        * Gets the next random number in the sequence.
1317        */
1318       // NB: Not exactly the TR1 formula, per N2079 instead.
1319       result_type
1320       operator()()
1321       {
1322         return ((result_type(_M_b1() - _M_b1.min()) << shift1)
1323                 ^ (result_type(_M_b2() - _M_b2.min()) << shift2));
1324       }
1325
1326       /**
1327        * Compares two %xor_combine random number generator objects of
1328        * the same type for equality.
1329        *
1330        * @param __lhs A %xor_combine random number generator object.
1331        * @param __rhs Another %xor_combine random number generator
1332        *              object.
1333        *
1334        * @returns true if the two objects are equal, false otherwise.
1335        */
1336       friend bool
1337       operator==(const xor_combine& __lhs, const xor_combine& __rhs)
1338       {
1339         return (__lhs.base1() == __rhs.base1())
1340                 && (__lhs.base2() == __rhs.base2());
1341       }
1342
1343       /**
1344        * Compares two %xor_combine random number generator objects of
1345        * the same type for inequality.
1346        *
1347        * @param __lhs A %xor_combine random number generator object.
1348        * @param __rhs Another %xor_combine random number generator
1349        *              object.
1350        *
1351        * @returns true if the two objects are not equal, false otherwise.
1352        */
1353       friend bool
1354       operator!=(const xor_combine& __lhs, const xor_combine& __rhs)
1355       { return !(__lhs == __rhs); }
1356
1357       /**
1358        * Inserts the current state of a %xor_combine random number
1359        * generator engine @p __x into the output stream @p __os.
1360        *
1361        * @param __os An output stream.
1362        * @param __x  A %xor_combine random number generator engine.
1363        *
1364        * @returns The output stream with the state of @p __x inserted or in
1365        * an error state.
1366        */
1367       template<class _UniformRandomNumberGenerator11, int __s11,
1368                class _UniformRandomNumberGenerator21, int __s21,
1369                typename _CharT, typename _Traits>
1370         friend std::basic_ostream<_CharT, _Traits>&
1371         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1372                    const xor_combine<_UniformRandomNumberGenerator11, __s11,
1373                    _UniformRandomNumberGenerator21, __s21>& __x);
1374
1375       /**
1376        * Extracts the current state of a %xor_combine random number
1377        * generator engine @p __x from the input stream @p __is.
1378        *
1379        * @param __is An input stream.
1380        * @param __x  A %xor_combine random number generator engine.
1381        *
1382        * @returns The input stream with the state of @p __x extracted or in
1383        * an error state.
1384        */
1385       template<class _UniformRandomNumberGenerator11, int __s11,
1386                class _UniformRandomNumberGenerator21, int __s21,
1387                typename _CharT, typename _Traits>
1388         friend std::basic_istream<_CharT, _Traits>&
1389         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1390                    xor_combine<_UniformRandomNumberGenerator11, __s11,
1391                    _UniformRandomNumberGenerator21, __s21>& __x);
1392
1393     private:
1394       void
1395       _M_initialize_max();
1396
1397       result_type
1398       _M_initialize_max_aux(result_type, result_type, int);
1399
1400       base1_type  _M_b1;
1401       base2_type  _M_b2;
1402       result_type _M_max;
1403     };
1404
1405
1406   /**
1407    * A standard interface to a platform-specific non-deterministic
1408    * random number generator (if any are available).
1409    */
1410   class random_device
1411   {
1412   public:
1413     // types
1414     typedef unsigned int result_type;
1415
1416     // constructors, destructors and member functions
1417
1418 #ifdef _GLIBCXX_USE_RANDOM_TR1
1419
1420     explicit
1421     random_device(const std::string& __token = "/dev/urandom")
1422     {
1423       if ((__token != "/dev/urandom" && __token != "/dev/random")
1424           || !(_M_file = std::fopen(__token.c_str(), "rb")))
1425         std::__throw_runtime_error(__N("random_device::"
1426                                        "random_device(const std::string&)"));
1427     }
1428
1429     ~random_device()
1430     { std::fclose(_M_file); }
1431
1432 #else
1433
1434     explicit
1435     random_device(const std::string& __token = "mt19937")
1436     : _M_mt(_M_strtoul(__token)) { }
1437
1438   private:
1439     static unsigned long
1440     _M_strtoul(const std::string& __str)
1441     {
1442       unsigned long __ret = 5489UL;
1443       if (__str != "mt19937")
1444         {
1445           const char* __nptr = __str.c_str();
1446           char* __endptr;
1447           __ret = std::strtoul(__nptr, &__endptr, 0);
1448           if (*__nptr == '\0' || *__endptr != '\0')
1449             std::__throw_runtime_error(__N("random_device::_M_strtoul"
1450                                            "(const std::string&)"));
1451         }
1452       return __ret;
1453     }
1454
1455   public:
1456
1457 #endif
1458
1459     result_type
1460     min() const
1461     { return std::numeric_limits<result_type>::min(); }
1462
1463     result_type
1464     max() const
1465     { return std::numeric_limits<result_type>::max(); }
1466
1467     double
1468     entropy() const
1469     { return 0.0; }
1470
1471     result_type
1472     operator()()
1473     {
1474 #ifdef _GLIBCXX_USE_RANDOM_TR1
1475       result_type __ret;
1476       std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
1477                  1, _M_file);
1478       return __ret;
1479 #else
1480       return _M_mt();
1481 #endif
1482     }
1483
1484   private:
1485     random_device(const random_device&);
1486     void operator=(const random_device&);
1487
1488 #ifdef _GLIBCXX_USE_RANDOM_TR1
1489     FILE*        _M_file;
1490 #else
1491     mt19937      _M_mt;
1492 #endif
1493   };
1494
1495   /* @} */ // group tr1_random_generators
1496
1497   /**
1498    * @addtogroup tr1_random_distributions Random Number Distributions
1499    * @ingroup tr1_random
1500    * @{
1501    */
1502
1503   /**
1504    * @addtogroup tr1_random_distributions_discrete Discrete Distributions
1505    * @ingroup tr1_random_distributions
1506    * @{
1507    */
1508
1509   /**
1510    * @brief Uniform discrete distribution for random numbers.
1511    * A discrete random distribution on the range @f$[min, max]@f$ with equal
1512    * probability throughout the range.
1513    */
1514   template<typename _IntType = int>
1515     class uniform_int
1516     {
1517       __glibcxx_class_requires(_IntType, _IntegerConcept)
1518  
1519     public:
1520       /** The type of the parameters of the distribution. */
1521       typedef _IntType input_type;
1522       /** The type of the range of the distribution. */
1523       typedef _IntType result_type;
1524
1525     public:
1526       /**
1527        * Constructs a uniform distribution object.
1528        */
1529       explicit
1530       uniform_int(_IntType __min = 0, _IntType __max = 9)
1531       : _M_min(__min), _M_max(__max)
1532       {
1533         _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max);
1534       }
1535
1536       /**
1537        * Gets the inclusive lower bound of the distribution range.
1538        */
1539       result_type
1540       min() const
1541       { return _M_min; }
1542
1543       /**
1544        * Gets the inclusive upper bound of the distribution range.
1545        */
1546       result_type
1547       max() const
1548       { return _M_max; }
1549
1550       /**
1551        * Resets the distribution state.
1552        *
1553        * Does nothing for the uniform integer distribution.
1554        */
1555       void
1556       reset() { }
1557
1558       /**
1559        * Gets a uniformly distributed random number in the range
1560        * @f$(min, max)@f$.
1561        */
1562       template<typename _UniformRandomNumberGenerator>
1563         result_type
1564         operator()(_UniformRandomNumberGenerator& __urng)
1565         {
1566           typedef typename _UniformRandomNumberGenerator::result_type
1567             _UResult_type;
1568           return _M_call(__urng, _M_min, _M_max,
1569                          typename is_integral<_UResult_type>::type());
1570         }
1571
1572       /**
1573        * Gets a uniform random number in the range @f$[0, n)@f$.
1574        *
1575        * This function is aimed at use with std::random_shuffle.
1576        */
1577       template<typename _UniformRandomNumberGenerator>
1578         result_type
1579         operator()(_UniformRandomNumberGenerator& __urng, result_type __n)
1580         {
1581           typedef typename _UniformRandomNumberGenerator::result_type
1582             _UResult_type;
1583           return _M_call(__urng, 0, __n - 1,
1584                          typename is_integral<_UResult_type>::type());
1585         }
1586
1587       /**
1588        * Inserts a %uniform_int random number distribution @p __x into the
1589        * output stream @p os.
1590        *
1591        * @param __os An output stream.
1592        * @param __x  A %uniform_int random number distribution.
1593        *
1594        * @returns The output stream with the state of @p __x inserted or in
1595        * an error state.
1596        */
1597       template<typename _IntType1, typename _CharT, typename _Traits>
1598         friend std::basic_ostream<_CharT, _Traits>&
1599         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1600                    const uniform_int<_IntType1>& __x);
1601
1602       /**
1603        * Extracts a %unform_int random number distribution
1604        * @p __x from the input stream @p __is.
1605        *
1606        * @param __is An input stream.
1607        * @param __x  A %uniform_int random number generator engine.
1608        *
1609        * @returns The input stream with @p __x extracted or in an error state.
1610        */
1611       template<typename _IntType1, typename _CharT, typename _Traits>
1612         friend std::basic_istream<_CharT, _Traits>&
1613         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1614                    uniform_int<_IntType1>& __x);
1615
1616     private:
1617       template<typename _UniformRandomNumberGenerator>
1618         result_type
1619         _M_call(_UniformRandomNumberGenerator& __urng,
1620                 result_type __min, result_type __max, true_type)
1621         {
1622           // XXX Must be fixed to also work when __urng.max() - __urng.min()
1623           // is smaller than __max - __min.
1624           typedef typename __gnu_cxx::__add_unsigned<typename
1625             _UniformRandomNumberGenerator::result_type>::__type __utype;
1626           return result_type((__max - __min + 1.0L)
1627                              * (__utype(__urng()) - __utype(__urng.min()))
1628                              / (__utype(__urng.max())
1629                                 - __utype(__urng.min()) + 1.0L)) + __min;
1630         }
1631
1632       template<typename _UniformRandomNumberGenerator>
1633         result_type
1634         _M_call(_UniformRandomNumberGenerator& __urng,
1635                 result_type __min, result_type __max, false_type)
1636         {
1637           return result_type((__urng() - __urng.min())
1638                              / (__urng.max() - __urng.min())
1639                              * (__max - __min + 1)) + __min;
1640         }
1641
1642       _IntType _M_min;
1643       _IntType _M_max;
1644     };
1645
1646
1647   /**
1648    * @brief A Bernoulli random number distribution.
1649    *
1650    * Generates a sequence of true and false values with likelihood @f$ p @f$
1651    * that true will come up and @f$ (1 - p) @f$ that false will appear.
1652    */
1653   class bernoulli_distribution
1654   {
1655   public:
1656     typedef int  input_type;
1657     typedef bool result_type;
1658
1659   public:
1660     /**
1661      * Constructs a Bernoulli distribution with likelihood @p p.
1662      *
1663      * @param __p  [IN]  The likelihood of a true result being returned.  Must
1664      * be in the interval @f$ [0, 1] @f$.
1665      */
1666     explicit
1667     bernoulli_distribution(double __p = 0.5)
1668     : _M_p(__p)
1669     { 
1670       _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
1671     }
1672
1673     /**
1674      * Gets the @p p parameter of the distribution.
1675      */
1676     double
1677     p() const
1678     { return _M_p; }
1679
1680     /**
1681      * Resets the distribution state.
1682      *
1683      * Does nothing for a bernoulli distribution.
1684      */
1685     void
1686     reset() { }
1687
1688     /**
1689      * Gets the next value in the Bernoullian sequence.
1690      */
1691     template<class _UniformRandomNumberGenerator>
1692       result_type
1693       operator()(_UniformRandomNumberGenerator& __urng)
1694       {
1695         if ((__urng() - __urng.min()) < _M_p * (__urng.max() - __urng.min()))
1696           return true;
1697         return false;
1698       }
1699
1700     /**
1701      * Inserts a %bernoulli_distribution random number distribution
1702      * @p __x into the output stream @p __os.
1703      *
1704      * @param __os An output stream.
1705      * @param __x  A %bernoulli_distribution random number distribution.
1706      *
1707      * @returns The output stream with the state of @p __x inserted or in
1708      * an error state.
1709      */
1710     template<typename _CharT, typename _Traits>
1711       friend std::basic_ostream<_CharT, _Traits>&
1712       operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1713                  const bernoulli_distribution& __x);
1714
1715     /**
1716      * Extracts a %bernoulli_distribution random number distribution
1717      * @p __x from the input stream @p __is.
1718      *
1719      * @param __is An input stream.
1720      * @param __x  A %bernoulli_distribution random number generator engine.
1721      *
1722      * @returns The input stream with @p __x extracted or in an error state.
1723      */
1724     template<typename _CharT, typename _Traits>
1725       friend std::basic_istream<_CharT, _Traits>&
1726       operator>>(std::basic_istream<_CharT, _Traits>& __is,
1727                  bernoulli_distribution& __x)
1728       { return __is >> __x._M_p; }
1729
1730   private:
1731     double _M_p;
1732   };
1733
1734
1735   /**
1736    * @brief A discrete geometric random number distribution.
1737    *
1738    * The formula for the geometric probability mass function is 
1739    * @f$ p(i) = (1 - p)p^{i-1} @f$ where @f$ p @f$ is the parameter of the
1740    * distribution.
1741    */
1742   template<typename _IntType = int, typename _RealType = double>
1743     class geometric_distribution
1744     {
1745     public:
1746       // types
1747       typedef _RealType input_type;
1748       typedef _IntType  result_type;
1749
1750       // constructors and member function
1751       explicit
1752       geometric_distribution(const _RealType& __p = _RealType(0.5))
1753       : _M_p(__p)
1754       {
1755         _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
1756         _M_initialize();
1757       }
1758
1759       /**
1760        * Gets the distribution parameter @p p.
1761        */
1762       _RealType
1763       p() const
1764       { return _M_p; }
1765
1766       void
1767       reset() { }
1768
1769       template<class _UniformRandomNumberGenerator>
1770         result_type
1771         operator()(_UniformRandomNumberGenerator& __urng);
1772
1773       /**
1774        * Inserts a %geometric_distribution random number distribution
1775        * @p __x into the output stream @p __os.
1776        *
1777        * @param __os An output stream.
1778        * @param __x  A %geometric_distribution random number distribution.
1779        *
1780        * @returns The output stream with the state of @p __x inserted or in
1781        * an error state.
1782        */
1783       template<typename _IntType1, typename _RealType1,
1784                typename _CharT, typename _Traits>
1785         friend std::basic_ostream<_CharT, _Traits>&
1786         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1787                    const geometric_distribution<_IntType1, _RealType1>& __x);
1788
1789       /**
1790        * Extracts a %geometric_distribution random number distribution
1791        * @p __x from the input stream @p __is.
1792        *
1793        * @param __is An input stream.
1794        * @param __x  A %geometric_distribution random number generator engine.
1795        *
1796        * @returns The input stream with @p __x extracted or in an error state.
1797        */
1798       template<typename _CharT, typename _Traits>
1799         friend std::basic_istream<_CharT, _Traits>&
1800         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1801                    geometric_distribution& __x)
1802         {
1803           __is >> __x._M_p;
1804           __x._M_initialize();
1805           return __is;
1806         }
1807
1808     private:
1809       void
1810       _M_initialize()
1811       { _M_log_p = std::log(_M_p); }
1812
1813       _RealType _M_p;
1814       _RealType _M_log_p;
1815     };
1816
1817
1818   template<typename _RealType>
1819     class normal_distribution;
1820
1821   /**
1822    * @brief A discrete Poisson random number distribution.
1823    *
1824    * The formula for the poisson probability mass function is 
1825    * @f$ p(i) = \frac{mean^i}{i!} e^{-mean} @f$ where @f$ mean @f$ is the
1826    * parameter of the distribution.
1827    */
1828   template<typename _IntType = int, typename _RealType = double>
1829     class poisson_distribution
1830     {
1831     public:
1832       // types
1833       typedef _RealType input_type;
1834       typedef _IntType  result_type;
1835
1836       // constructors and member function
1837       explicit
1838       poisson_distribution(const _RealType& __mean = _RealType(1))
1839       : _M_mean(__mean), _M_nd()
1840       {
1841         _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
1842         _M_initialize();
1843       }
1844
1845       /**
1846        * Gets the distribution parameter @p mean.
1847        */
1848       _RealType
1849       mean() const
1850       { return _M_mean; }
1851
1852       void
1853       reset()
1854       { _M_nd.reset(); }
1855
1856       template<class _UniformRandomNumberGenerator>
1857         result_type
1858         operator()(_UniformRandomNumberGenerator& __urng);
1859
1860       /**
1861        * Inserts a %poisson_distribution random number distribution
1862        * @p __x into the output stream @p __os.
1863        *
1864        * @param __os An output stream.
1865        * @param __x  A %poisson_distribution random number distribution.
1866        *
1867        * @returns The output stream with the state of @p __x inserted or in
1868        * an error state.
1869        */
1870       template<typename _IntType1, typename _RealType1,
1871                typename _CharT, typename _Traits>
1872         friend std::basic_ostream<_CharT, _Traits>&
1873         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1874                    const poisson_distribution<_IntType1, _RealType1>& __x);
1875
1876       /**
1877        * Extracts a %poisson_distribution random number distribution
1878        * @p __x from the input stream @p __is.
1879        *
1880        * @param __is An input stream.
1881        * @param __x  A %poisson_distribution random number generator engine.
1882        *
1883        * @returns The input stream with @p __x extracted or in an error state.
1884        */
1885       template<typename _IntType1, typename _RealType1,
1886                typename _CharT, typename _Traits>
1887         friend std::basic_istream<_CharT, _Traits>&
1888         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1889                    poisson_distribution<_IntType1, _RealType1>& __x);
1890
1891     private:
1892       void
1893       _M_initialize();
1894
1895       // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
1896       normal_distribution<_RealType> _M_nd;
1897
1898       _RealType _M_mean;
1899
1900       // Hosts either log(mean) or the threshold of the simple method.
1901       _RealType _M_lm_thr;
1902 #if _GLIBCXX_USE_C99_MATH_TR1
1903       _RealType _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
1904 #endif
1905     };
1906
1907
1908   /**
1909    * @brief A discrete binomial random number distribution.
1910    *
1911    * The formula for the binomial probability mass function is 
1912    * @f$ p(i) = \binom{n}{i} p^i (1 - p)^{t - i} @f$ where @f$ t @f$
1913    * and @f$ p @f$ are the parameters of the distribution.
1914    */
1915   template<typename _IntType = int, typename _RealType = double>
1916     class binomial_distribution
1917     {
1918     public:
1919       // types
1920       typedef _RealType input_type;
1921       typedef _IntType  result_type;
1922
1923       // constructors and member function
1924       explicit
1925       binomial_distribution(_IntType __t = 1,
1926                             const _RealType& __p = _RealType(0.5))
1927       : _M_t(__t), _M_p(__p), _M_nd()
1928       {
1929         _GLIBCXX_DEBUG_ASSERT((_M_t >= 0) && (_M_p >= 0.0) && (_M_p <= 1.0));
1930         _M_initialize();
1931       }
1932
1933       /**
1934        * Gets the distribution @p t parameter.
1935        */
1936       _IntType
1937       t() const
1938       { return _M_t; }
1939       
1940       /**
1941        * Gets the distribution @p p parameter.
1942        */
1943       _RealType
1944       p() const
1945       { return _M_p; }
1946
1947       void
1948       reset()
1949       { _M_nd.reset(); }
1950
1951       template<class _UniformRandomNumberGenerator>
1952         result_type
1953         operator()(_UniformRandomNumberGenerator& __urng);
1954
1955       /**
1956        * Inserts a %binomial_distribution random number distribution
1957        * @p __x into the output stream @p __os.
1958        *
1959        * @param __os An output stream.
1960        * @param __x  A %binomial_distribution random number distribution.
1961        *
1962        * @returns The output stream with the state of @p __x inserted or in
1963        * an error state.
1964        */
1965       template<typename _IntType1, typename _RealType1,
1966                typename _CharT, typename _Traits>
1967         friend std::basic_ostream<_CharT, _Traits>&
1968         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1969                    const binomial_distribution<_IntType1, _RealType1>& __x);
1970
1971       /**
1972        * Extracts a %binomial_distribution random number distribution
1973        * @p __x from the input stream @p __is.
1974        *
1975        * @param __is An input stream.
1976        * @param __x  A %binomial_distribution random number generator engine.
1977        *
1978        * @returns The input stream with @p __x extracted or in an error state.
1979        */
1980       template<typename _IntType1, typename _RealType1,
1981                typename _CharT, typename _Traits>
1982         friend std::basic_istream<_CharT, _Traits>&
1983         operator>>(std::basic_istream<_CharT, _Traits>& __is,
1984                    binomial_distribution<_IntType1, _RealType1>& __x);
1985
1986     private:
1987       void
1988       _M_initialize();
1989
1990       template<class _UniformRandomNumberGenerator>
1991         result_type
1992         _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t);
1993
1994       // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
1995       normal_distribution<_RealType> _M_nd;
1996
1997       _RealType _M_q;
1998 #if _GLIBCXX_USE_C99_MATH_TR1
1999       _RealType _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
2000                 _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
2001 #endif
2002       _RealType _M_p;
2003       _IntType  _M_t;
2004
2005       bool      _M_easy;
2006     };
2007
2008   /* @} */ // group tr1_random_distributions_discrete
2009
2010   /**
2011    * @addtogroup tr1_random_distributions_continuous Continuous Distributions
2012    * @ingroup tr1_random_distributions
2013    * @{
2014    */
2015
2016   /**
2017    * @brief Uniform continuous distribution for random numbers.
2018    *
2019    * A continuous random distribution on the range [min, max) with equal
2020    * probability throughout the range.  The URNG should be real-valued and
2021    * deliver number in the range [0, 1).
2022    */
2023   template<typename _RealType = double>
2024     class uniform_real
2025     {
2026     public:
2027       // types
2028       typedef _RealType input_type;
2029       typedef _RealType result_type;
2030
2031     public:
2032       /**
2033        * Constructs a uniform_real object.
2034        *
2035        * @param __min [IN]  The lower bound of the distribution.
2036        * @param __max [IN]  The upper bound of the distribution.
2037        */
2038       explicit
2039       uniform_real(_RealType __min = _RealType(0),
2040                    _RealType __max = _RealType(1))
2041       : _M_min(__min), _M_max(__max)
2042       {
2043         _GLIBCXX_DEBUG_ASSERT(_M_min <= _M_max);
2044       }
2045
2046       result_type
2047       min() const
2048       { return _M_min; }
2049
2050       result_type
2051       max() const
2052       { return _M_max; }
2053
2054       void
2055       reset() { }
2056
2057       template<class _UniformRandomNumberGenerator>
2058         result_type
2059         operator()(_UniformRandomNumberGenerator& __urng)
2060         { return (__urng() * (_M_max - _M_min)) + _M_min; }
2061
2062       /**
2063        * Inserts a %uniform_real random number distribution @p __x into the
2064        * output stream @p __os.
2065        *
2066        * @param __os An output stream.
2067        * @param __x  A %uniform_real random number distribution.
2068        *
2069        * @returns The output stream with the state of @p __x inserted or in
2070        * an error state.
2071        */
2072       template<typename _RealType1, typename _CharT, typename _Traits>
2073         friend std::basic_ostream<_CharT, _Traits>&
2074         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2075                    const uniform_real<_RealType1>& __x);
2076
2077       /**
2078        * Extracts a %unform_real random number distribution
2079        * @p __x from the input stream @p __is.
2080        *
2081        * @param __is An input stream.
2082        * @param __x  A %uniform_real random number generator engine.
2083        *
2084        * @returns The input stream with @p __x extracted or in an error state.
2085        */
2086       template<typename _RealType1, typename _CharT, typename _Traits>
2087         friend std::basic_istream<_CharT, _Traits>&
2088         operator>>(std::basic_istream<_CharT, _Traits>& __is,
2089                    uniform_real<_RealType1>& __x);
2090
2091     private:
2092       _RealType _M_min;
2093       _RealType _M_max;
2094     };
2095
2096
2097   /**
2098    * @brief An exponential continuous distribution for random numbers.
2099    *
2100    * The formula for the exponential probability mass function is 
2101    * @f$ p(x) = \lambda e^{-\lambda x} @f$.
2102    *
2103    * <table border=1 cellpadding=10 cellspacing=0>
2104    * <caption align=top>Distribution Statistics</caption>
2105    * <tr><td>Mean</td><td>@f$ \frac{1}{\lambda} @f$</td></tr>
2106    * <tr><td>Median</td><td>@f$ \frac{\ln 2}{\lambda} @f$</td></tr>
2107    * <tr><td>Mode</td><td>@f$ zero @f$</td></tr>
2108    * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
2109    * <tr><td>Standard Deviation</td><td>@f$ \frac{1}{\lambda} @f$</td></tr>
2110    * </table>
2111    */
2112   template<typename _RealType = double>
2113     class exponential_distribution
2114     {
2115     public:
2116       // types
2117       typedef _RealType input_type;
2118       typedef _RealType result_type;
2119
2120     public:
2121       /**
2122        * Constructs an exponential distribution with inverse scale parameter
2123        * @f$ \lambda @f$.
2124        */
2125       explicit
2126       exponential_distribution(const result_type& __lambda = result_type(1))
2127       : _M_lambda(__lambda)
2128       { 
2129         _GLIBCXX_DEBUG_ASSERT(_M_lambda > 0);
2130       }
2131
2132       /**
2133        * Gets the inverse scale parameter of the distribution.
2134        */
2135       _RealType
2136       lambda() const
2137       { return _M_lambda; }
2138
2139       /**
2140        * Resets the distribution.
2141        *
2142        * Has no effect on exponential distributions.
2143        */
2144       void
2145       reset() { }
2146
2147       template<class _UniformRandomNumberGenerator>
2148         result_type
2149         operator()(_UniformRandomNumberGenerator& __urng)
2150         { return -std::log(__urng()) / _M_lambda; }
2151
2152       /**
2153        * Inserts a %exponential_distribution random number distribution
2154        * @p __x into the output stream @p __os.
2155        *
2156        * @param __os An output stream.
2157        * @param __x  A %exponential_distribution random number distribution.
2158        *
2159        * @returns The output stream with the state of @p __x inserted or in
2160        * an error state.
2161        */
2162       template<typename _RealType1, typename _CharT, typename _Traits>
2163         friend std::basic_ostream<_CharT, _Traits>&
2164         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2165                    const exponential_distribution<_RealType1>& __x);
2166
2167       /**
2168        * Extracts a %exponential_distribution random number distribution
2169        * @p __x from the input stream @p __is.
2170        *
2171        * @param __is An input stream.
2172        * @param __x A %exponential_distribution random number
2173        *            generator engine.
2174        *
2175        * @returns The input stream with @p __x extracted or in an error state.
2176        */
2177       template<typename _CharT, typename _Traits>
2178         friend std::basic_istream<_CharT, _Traits>&
2179         operator>>(std::basic_istream<_CharT, _Traits>& __is,
2180                    exponential_distribution& __x)
2181         { return __is >> __x._M_lambda; }
2182
2183     private:
2184       result_type _M_lambda;
2185     };
2186
2187
2188   /**
2189    * @brief A normal continuous distribution for random numbers.
2190    *
2191    * The formula for the normal probability mass function is 
2192    * @f$ p(x) = \frac{1}{\sigma \sqrt{2 \pi}} 
2193    *            e^{- \frac{{x - mean}^ {2}}{2 \sigma ^ {2}} } @f$.
2194    */
2195   template<typename _RealType = double>
2196     class normal_distribution
2197     {
2198     public:
2199       // types
2200       typedef _RealType input_type;
2201       typedef _RealType result_type;
2202
2203     public:
2204       /**
2205        * Constructs a normal distribution with parameters @f$ mean @f$ and
2206        * @f$ \sigma @f$.
2207        */
2208       explicit
2209       normal_distribution(const result_type& __mean = result_type(0),
2210                           const result_type& __sigma = result_type(1))
2211       : _M_mean(__mean), _M_sigma(__sigma), _M_saved_available(false)
2212       { 
2213         _GLIBCXX_DEBUG_ASSERT(_M_sigma > 0);
2214       }
2215
2216       /**
2217        * Gets the mean of the distribution.
2218        */
2219       _RealType
2220       mean() const
2221       { return _M_mean; }
2222
2223       /**
2224        * Gets the @f$ \sigma @f$ of the distribution.
2225        */
2226       _RealType
2227       sigma() const
2228       { return _M_sigma; }
2229
2230       /**
2231        * Resets the distribution.
2232        */
2233       void
2234       reset()
2235       { _M_saved_available = false; }
2236
2237       template<class _UniformRandomNumberGenerator>
2238         result_type
2239         operator()(_UniformRandomNumberGenerator& __urng);
2240
2241       /**
2242        * Inserts a %normal_distribution random number distribution
2243        * @p __x into the output stream @p __os.
2244        *
2245        * @param __os An output stream.
2246        * @param __x  A %normal_distribution random number distribution.
2247        *
2248        * @returns The output stream with the state of @p __x inserted or in
2249        * an error state.
2250        */
2251       template<typename _RealType1, typename _CharT, typename _Traits>
2252         friend std::basic_ostream<_CharT, _Traits>&
2253         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2254                    const normal_distribution<_RealType1>& __x);
2255
2256       /**
2257        * Extracts a %normal_distribution random number distribution
2258        * @p __x from the input stream @p __is.
2259        *
2260        * @param __is An input stream.
2261        * @param __x  A %normal_distribution random number generator engine.
2262        *
2263        * @returns The input stream with @p __x extracted or in an error state.
2264        */
2265       template<typename _RealType1, typename _CharT, typename _Traits>
2266         friend std::basic_istream<_CharT, _Traits>&
2267         operator>>(std::basic_istream<_CharT, _Traits>& __is,
2268                    normal_distribution<_RealType1>& __x);
2269
2270     private:
2271       result_type _M_mean;
2272       result_type _M_sigma;
2273       result_type _M_saved;
2274       bool        _M_saved_available;     
2275     };
2276
2277
2278   /**
2279    * @brief A gamma continuous distribution for random numbers.
2280    *
2281    * The formula for the gamma probability mass function is 
2282    * @f$ p(x) = \frac{1}{\Gamma(\alpha)} x^{\alpha - 1} e^{-x} @f$.
2283    */
2284   template<typename _RealType = double>
2285     class gamma_distribution
2286     {
2287     public:
2288       // types
2289       typedef _RealType input_type;
2290       typedef _RealType result_type;
2291
2292     public:
2293       /**
2294        * Constructs a gamma distribution with parameters @f$ \alpha @f$.
2295        */
2296       explicit
2297       gamma_distribution(const result_type& __alpha_val = result_type(1))
2298       : _M_alpha(__alpha_val)
2299       { 
2300         _GLIBCXX_DEBUG_ASSERT(_M_alpha > 0);
2301         _M_initialize();
2302       }
2303
2304       /**
2305        * Gets the @f$ \alpha @f$ of the distribution.
2306        */
2307       _RealType
2308       alpha() const
2309       { return _M_alpha; }
2310
2311       /**
2312        * Resets the distribution.
2313        */
2314       void
2315       reset() { }
2316
2317       template<class _UniformRandomNumberGenerator>
2318         result_type
2319         operator()(_UniformRandomNumberGenerator& __urng);
2320
2321       /**
2322        * Inserts a %gamma_distribution random number distribution
2323        * @p __x into the output stream @p __os.
2324        *
2325        * @param __os An output stream.
2326        * @param __x  A %gamma_distribution random number distribution.
2327        *
2328        * @returns The output stream with the state of @p __x inserted or in
2329        * an error state.
2330        */
2331       template<typename _RealType1, typename _CharT, typename _Traits>
2332         friend std::basic_ostream<_CharT, _Traits>&
2333         operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2334                    const gamma_distribution<_RealType1>& __x);
2335
2336       /**
2337        * Extracts a %gamma_distribution random number distribution
2338        * @p __x from the input stream @p __is.
2339        *
2340        * @param __is An input stream.
2341        * @param __x  A %gamma_distribution random number generator engine.
2342        *
2343        * @returns The input stream with @p __x extracted or in an error state.
2344        */
2345       template<typename _CharT, typename _Traits>
2346         friend std::basic_istream<_CharT, _Traits>&
2347         operator>>(std::basic_istream<_CharT, _Traits>& __is,
2348                    gamma_distribution& __x)
2349         {
2350           __is >> __x._M_alpha;
2351           __x._M_initialize();
2352           return __is;
2353         }
2354
2355     private:
2356       void
2357       _M_initialize();
2358
2359       result_type _M_alpha;
2360
2361       // Hosts either lambda of GB or d of modified Vaduva's.
2362       result_type _M_l_d;
2363     };
2364
2365   /* @} */ // group tr1_random_distributions_continuous
2366   /* @} */ // group tr1_random_distributions
2367   /* @} */ // group tr1_random
2368
2369 _GLIBCXX_END_NAMESPACE
2370 }
2371
2372 #include <tr1/random.tcc>
2373
2374 #endif // _TR1_RANDOM