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