File Coverage

/usr/include/c++/5/bits/random.h
Criterion Covered Total %
statement 0 4 0.0
branch 0 16 0.0
condition n/a
subroutine n/a
pod n/a
total 0 20 0.0


line stmt bran cond sub pod time code
1             // random number generation -*- C++ -*-
2              
3             // Copyright (C) 2009-2015 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             // .
24              
25             /**
26             * @file bits/random.h
27             * This is an internal header file, included by other library headers.
28             * Do not attempt to use it directly. @headername{random}
29             */
30              
31             #ifndef _RANDOM_H
32             #define _RANDOM_H 1
33              
34             #include
35             #include
36              
37             namespace std _GLIBCXX_VISIBILITY(default)
38             {
39             _GLIBCXX_BEGIN_NAMESPACE_VERSION
40              
41             // [26.4] Random number generation
42              
43             /**
44             * @defgroup random Random Number Generation
45             * @ingroup numerics
46             *
47             * A facility for generating random numbers on selected distributions.
48             * @{
49             */
50              
51             /**
52             * @brief A function template for converting the output of a (integral)
53             * uniform random number generator to a floatng point result in the range
54             * [0-1).
55             */
56             template
57             typename _UniformRandomNumberGenerator>
58             _RealType
59             generate_canonical(_UniformRandomNumberGenerator& __g);
60              
61             _GLIBCXX_END_NAMESPACE_VERSION
62              
63             /*
64             * Implementation-space details.
65             */
66             namespace __detail
67             {
68             _GLIBCXX_BEGIN_NAMESPACE_VERSION
69              
70             template
71             bool = __w < static_cast
72             (std::numeric_limits<_UIntType>::digits)>
73             struct _Shift
74             { static const _UIntType __value = 0; };
75              
76             template
77             struct _Shift<_UIntType, __w, true>
78             { static const _UIntType __value = _UIntType(1) << __w; };
79              
80             template
81             int __which = ((__s <= __CHAR_BIT__ * sizeof (int))
82             + (__s <= __CHAR_BIT__ * sizeof (long))
83             + (__s <= __CHAR_BIT__ * sizeof (long long))
84             /* assume long long no bigger than __int128 */
85             + (__s <= 128))>
86             struct _Select_uint_least_t
87             {
88             static_assert(__which < 0, /* needs to be dependent */
89             "sorry, would be too much trouble for a slow result");
90             };
91              
92             template
93             struct _Select_uint_least_t<__s, 4>
94             { typedef unsigned int type; };
95              
96             template
97             struct _Select_uint_least_t<__s, 3>
98             { typedef unsigned long type; };
99              
100             template
101             struct _Select_uint_least_t<__s, 2>
102             { typedef unsigned long long type; };
103              
104             #ifdef _GLIBCXX_USE_INT128
105             template
106             struct _Select_uint_least_t<__s, 1>
107             { typedef unsigned __int128 type; };
108             #endif
109              
110             // Assume a != 0, a < m, c < m, x < m.
111             template
112             bool __big_enough = (!(__m & (__m - 1))
113             || (_Tp(-1) - __c) / __a >= __m - 1),
114             bool __schrage_ok = __m % __a < __m / __a>
115             struct _Mod
116             {
117             typedef typename _Select_uint_least_t
118             + std::__lg(__m) + 2>::type _Tp2;
119             static _Tp
120             __calc(_Tp __x)
121             { return static_cast<_Tp>((_Tp2(__a) * __x + __c) % __m); }
122             };
123              
124             // Schrage.
125             template
126             struct _Mod<_Tp, __m, __a, __c, false, true>
127             {
128             static _Tp
129             __calc(_Tp __x);
130             };
131              
132             // Special cases:
133             // - for m == 2^n or m == 0, unsigned integer overflow is safe.
134             // - a * (m - 1) + c fits in _Tp, there is no overflow.
135             template
136             struct _Mod<_Tp, __m, __a, __c, true, __s>
137             {
138             static _Tp
139             __calc(_Tp __x)
140             {
141             _Tp __res = __a * __x + __c;
142             if (__m)
143 0           __res %= __m;
144             return __res;
145             }
146             };
147              
148             template
149             inline _Tp
150             __mod(_Tp __x)
151             { return _Mod<_Tp, __m, __a, __c>::__calc(__x); }
152              
153             /*
154             * An adaptor class for converting the output of any Generator into
155             * the input for a specific Distribution.
156             */
157             template
158             struct _Adaptor
159             {
160             static_assert(std::is_floating_point<_DInputType>::value,
161             "template argument not a floating point type");
162              
163             public:
164             _Adaptor(_Engine& __g)
165             : _M_g(__g) { }
166              
167             _DInputType
168             min() const
169             { return _DInputType(0); }
170              
171             _DInputType
172             max() const
173             { return _DInputType(1); }
174              
175             /*
176             * Converts a value generated by the adapted random number generator
177             * into a value in the input domain for the dependent random number
178             * distribution.
179             */
180             _DInputType
181             operator()()
182             {
183             return std::generate_canonical<_DInputType,
184             std::numeric_limits<_DInputType>::digits,
185 0           _Engine>(_M_g);
186             }
187              
188             private:
189             _Engine& _M_g;
190             };
191              
192             _GLIBCXX_END_NAMESPACE_VERSION
193             } // namespace __detail
194              
195             _GLIBCXX_BEGIN_NAMESPACE_VERSION
196              
197             /**
198             * @addtogroup random_generators Random Number Generators
199             * @ingroup random
200             *
201             * These classes define objects which provide random or pseudorandom
202             * numbers, either from a discrete or a continuous interval. The
203             * random number generator supplied as a part of this library are
204             * all uniform random number generators which provide a sequence of
205             * random number uniformly distributed over their range.
206             *
207             * A number generator is a function object with an operator() that
208             * takes zero arguments and returns a number.
209             *
210             * A compliant random number generator must satisfy the following
211             * requirements.
212             *
Random Number Generator Requirements
213             *
To be documented.
214             *
215             * @{
216             */
217              
218             /**
219             * @brief A model of a linear congruential random number generator.
220             *
221             * A random number generator that produces pseudorandom numbers via
222             * linear function:
223             * @f[
224             * x_{i+1}\leftarrow(ax_{i} + c) \bmod m
225             * @f]
226             *
227             * The template parameter @p _UIntType must be an unsigned integral type
228             * large enough to store values up to (__m-1). If the template parameter
229             * @p __m is 0, the modulus @p __m used is
230             * std::numeric_limits<_UIntType>::max() plus 1. Otherwise, the template
231             * parameters @p __a and @p __c must be less than @p __m.
232             *
233             * The size of the state is @f$1@f$.
234             */
235             template
236             class linear_congruential_engine
237             {
238             static_assert(std::is_unsigned<_UIntType>::value, "template argument "
239             "substituting _UIntType not an unsigned integral type");
240             static_assert(__m == 0u || (__a < __m && __c < __m),
241             "template argument substituting __m out of bounds");
242              
243             public:
244             /** The type of the generated random value. */
245             typedef _UIntType result_type;
246              
247             /** The multiplier. */
248             static constexpr result_type multiplier = __a;
249             /** An increment. */
250             static constexpr result_type increment = __c;
251             /** The modulus. */
252             static constexpr result_type modulus = __m;
253             static constexpr result_type default_seed = 1u;
254              
255             /**
256             * @brief Constructs a %linear_congruential_engine random number
257             * generator engine with seed @p __s. The default seed value
258             * is 1.
259             *
260             * @param __s The initial seed value.
261             */
262             explicit
263             linear_congruential_engine(result_type __s = default_seed)
264             { seed(__s); }
265              
266             /**
267             * @brief Constructs a %linear_congruential_engine random number
268             * generator engine seeded from the seed sequence @p __q.
269             *
270             * @param __q the seed sequence.
271             */
272             template
273             std::enable_if::value>
274             ::type>
275             explicit
276             linear_congruential_engine(_Sseq& __q)
277             { seed(__q); }
278              
279             /**
280             * @brief Reseeds the %linear_congruential_engine random number generator
281             * engine sequence to the seed @p __s.
282             *
283             * @param __s The new seed.
284             */
285             void
286             seed(result_type __s = default_seed);
287              
288             /**
289             * @brief Reseeds the %linear_congruential_engine random number generator
290             * engine
291             * sequence using values from the seed sequence @p __q.
292             *
293             * @param __q the seed sequence.
294             */
295             template
296             typename std::enable_if::value>::type
297             seed(_Sseq& __q);
298              
299             /**
300             * @brief Gets the smallest possible value in the output range.
301             *
302             * The minimum depends on the @p __c parameter: if it is zero, the
303             * minimum generated must be > 0, otherwise 0 is allowed.
304             */
305             static constexpr result_type
306             min()
307             { return __c == 0u ? 1u : 0u; }
308              
309             /**
310             * @brief Gets the largest possible value in the output range.
311             */
312             static constexpr result_type
313             max()
314             { return __m - 1u; }
315              
316             /**
317             * @brief Discard a sequence of random numbers.
318             */
319             void
320             discard(unsigned long long __z)
321             {
322             for (; __z != 0ULL; --__z)
323             (*this)();
324             }
325              
326             /**
327             * @brief Gets the next random number in the sequence.
328             */
329             result_type
330             operator()()
331             {
332             _M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x);
333             return _M_x;
334             }
335              
336             /**
337             * @brief Compares two linear congruential random number generator
338             * objects of the same type for equality.
339             *
340             * @param __lhs A linear congruential random number generator object.
341             * @param __rhs Another linear congruential random number generator
342             * object.
343             *
344             * @returns true if the infinite sequences of generated values
345             * would be equal, false otherwise.
346             */
347             friend bool
348             operator==(const linear_congruential_engine& __lhs,
349             const linear_congruential_engine& __rhs)
350             { return __lhs._M_x == __rhs._M_x; }
351              
352             /**
353             * @brief Writes the textual representation of the state x(i) of x to
354             * @p __os.
355             *
356             * @param __os The output stream.
357             * @param __lcr A % linear_congruential_engine random number generator.
358             * @returns __os.
359             */
360             template
361             _UIntType1 __m1, typename _CharT, typename _Traits>
362             friend std::basic_ostream<_CharT, _Traits>&
363             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
364             const std::linear_congruential_engine<_UIntType1,
365             __a1, __c1, __m1>& __lcr);
366              
367             /**
368             * @brief Sets the state of the engine by reading its textual
369             * representation from @p __is.
370             *
371             * The textual representation must have been previously written using
372             * an output stream whose imbued locale and whose type's template
373             * specialization arguments _CharT and _Traits were the same as those
374             * of @p __is.
375             *
376             * @param __is The input stream.
377             * @param __lcr A % linear_congruential_engine random number generator.
378             * @returns __is.
379             */
380             template
381             _UIntType1 __m1, typename _CharT, typename _Traits>
382             friend std::basic_istream<_CharT, _Traits>&
383             operator>>(std::basic_istream<_CharT, _Traits>& __is,
384             std::linear_congruential_engine<_UIntType1, __a1,
385             __c1, __m1>& __lcr);
386              
387             private:
388             _UIntType _M_x;
389             };
390              
391             /**
392             * @brief Compares two linear congruential random number generator
393             * objects of the same type for inequality.
394             *
395             * @param __lhs A linear congruential random number generator object.
396             * @param __rhs Another linear congruential random number generator
397             * object.
398             *
399             * @returns true if the infinite sequences of generated values
400             * would be different, false otherwise.
401             */
402             template
403             inline bool
404             operator!=(const std::linear_congruential_engine<_UIntType, __a,
405             __c, __m>& __lhs,
406             const std::linear_congruential_engine<_UIntType, __a,
407             __c, __m>& __rhs)
408             { return !(__lhs == __rhs); }
409              
410              
411             /**
412             * A generalized feedback shift register discrete random number generator.
413             *
414             * This algorithm avoids multiplication and division and is designed to be
415             * friendly to a pipelined architecture. If the parameters are chosen
416             * correctly, this generator will produce numbers with a very long period and
417             * fairly good apparent entropy, although still not cryptographically strong.
418             *
419             * The best way to use this generator is with the predefined mt19937 class.
420             *
421             * This algorithm was originally invented by Makoto Matsumoto and
422             * Takuji Nishimura.
423             *
424             * @tparam __w Word size, the number of bits in each element of
425             * the state vector.
426             * @tparam __n The degree of recursion.
427             * @tparam __m The period parameter.
428             * @tparam __r The separation point bit index.
429             * @tparam __a The last row of the twist matrix.
430             * @tparam __u The first right-shift tempering matrix parameter.
431             * @tparam __d The first right-shift tempering matrix mask.
432             * @tparam __s The first left-shift tempering matrix parameter.
433             * @tparam __b The first left-shift tempering matrix mask.
434             * @tparam __t The second left-shift tempering matrix parameter.
435             * @tparam __c The second left-shift tempering matrix mask.
436             * @tparam __l The second right-shift tempering matrix parameter.
437             * @tparam __f Initialization multiplier.
438             */
439             template
440             size_t __n, size_t __m, size_t __r,
441             _UIntType __a, size_t __u, _UIntType __d, size_t __s,
442             _UIntType __b, size_t __t,
443             _UIntType __c, size_t __l, _UIntType __f>
444             class mersenne_twister_engine
445             {
446             static_assert(std::is_unsigned<_UIntType>::value, "template argument "
447             "substituting _UIntType not an unsigned integral type");
448             static_assert(1u <= __m && __m <= __n,
449             "template argument substituting __m out of bounds");
450             static_assert(__r <= __w, "template argument substituting "
451             "__r out of bound");
452             static_assert(__u <= __w, "template argument substituting "
453             "__u out of bound");
454             static_assert(__s <= __w, "template argument substituting "
455             "__s out of bound");
456             static_assert(__t <= __w, "template argument substituting "
457             "__t out of bound");
458             static_assert(__l <= __w, "template argument substituting "
459             "__l out of bound");
460             static_assert(__w <= std::numeric_limits<_UIntType>::digits,
461             "template argument substituting __w out of bound");
462             static_assert(__a <= (__detail::_Shift<_UIntType, __w>::__value - 1),
463             "template argument substituting __a out of bound");
464             static_assert(__b <= (__detail::_Shift<_UIntType, __w>::__value - 1),
465             "template argument substituting __b out of bound");
466             static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1),
467             "template argument substituting __c out of bound");
468             static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1),
469             "template argument substituting __d out of bound");
470             static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1),
471             "template argument substituting __f out of bound");
472              
473             public:
474             /** The type of the generated random value. */
475             typedef _UIntType result_type;
476              
477             // parameter values
478             static constexpr size_t word_size = __w;
479             static constexpr size_t state_size = __n;
480             static constexpr size_t shift_size = __m;
481             static constexpr size_t mask_bits = __r;
482             static constexpr result_type xor_mask = __a;
483             static constexpr size_t tempering_u = __u;
484             static constexpr result_type tempering_d = __d;
485             static constexpr size_t tempering_s = __s;
486             static constexpr result_type tempering_b = __b;
487             static constexpr size_t tempering_t = __t;
488             static constexpr result_type tempering_c = __c;
489             static constexpr size_t tempering_l = __l;
490             static constexpr result_type initialization_multiplier = __f;
491             static constexpr result_type default_seed = 5489u;
492              
493             // constructors and member function
494             explicit
495             mersenne_twister_engine(result_type __sd = default_seed)
496             { seed(__sd); }
497              
498             /**
499             * @brief Constructs a %mersenne_twister_engine random number generator
500             * engine seeded from the seed sequence @p __q.
501             *
502             * @param __q the seed sequence.
503             */
504             template
505             std::enable_if::value>
506             ::type>
507             explicit
508             mersenne_twister_engine(_Sseq& __q)
509             { seed(__q); }
510              
511             void
512             seed(result_type __sd = default_seed);
513              
514             template
515             typename std::enable_if::value>::type
516             seed(_Sseq& __q);
517              
518             /**
519             * @brief Gets the smallest possible value in the output range.
520             */
521             static constexpr result_type
522             min()
523             { return 0; };
524              
525             /**
526             * @brief Gets the largest possible value in the output range.
527             */
528             static constexpr result_type
529             max()
530             { return __detail::_Shift<_UIntType, __w>::__value - 1; }
531              
532             /**
533             * @brief Discard a sequence of random numbers.
534             */
535             void
536             discard(unsigned long long __z);
537              
538             result_type
539             operator()();
540              
541             /**
542             * @brief Compares two % mersenne_twister_engine random number generator
543             * objects of the same type for equality.
544             *
545             * @param __lhs A % mersenne_twister_engine random number generator
546             * object.
547             * @param __rhs Another % mersenne_twister_engine random number
548             * generator object.
549             *
550             * @returns true if the infinite sequences of generated values
551             * would be equal, false otherwise.
552             */
553             friend bool
554             operator==(const mersenne_twister_engine& __lhs,
555             const mersenne_twister_engine& __rhs)
556             { return (std::equal(__lhs._M_x, __lhs._M_x + state_size, __rhs._M_x)
557             && __lhs._M_p == __rhs._M_p); }
558              
559             /**
560             * @brief Inserts the current state of a % mersenne_twister_engine
561             * random number generator engine @p __x into the output stream
562             * @p __os.
563             *
564             * @param __os An output stream.
565             * @param __x A % mersenne_twister_engine random number generator
566             * engine.
567             *
568             * @returns The output stream with the state of @p __x inserted or in
569             * an error state.
570             */
571             template
572             size_t __w1, size_t __n1,
573             size_t __m1, size_t __r1,
574             _UIntType1 __a1, size_t __u1,
575             _UIntType1 __d1, size_t __s1,
576             _UIntType1 __b1, size_t __t1,
577             _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
578             typename _CharT, typename _Traits>
579             friend std::basic_ostream<_CharT, _Traits>&
580             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
581             const std::mersenne_twister_engine<_UIntType1, __w1, __n1,
582             __m1, __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
583             __l1, __f1>& __x);
584              
585             /**
586             * @brief Extracts the current state of a % mersenne_twister_engine
587             * random number generator engine @p __x from the input stream
588             * @p __is.
589             *
590             * @param __is An input stream.
591             * @param __x A % mersenne_twister_engine random number generator
592             * engine.
593             *
594             * @returns The input stream with the state of @p __x extracted or in
595             * an error state.
596             */
597             template
598             size_t __w1, size_t __n1,
599             size_t __m1, size_t __r1,
600             _UIntType1 __a1, size_t __u1,
601             _UIntType1 __d1, size_t __s1,
602             _UIntType1 __b1, size_t __t1,
603             _UIntType1 __c1, size_t __l1, _UIntType1 __f1,
604             typename _CharT, typename _Traits>
605             friend std::basic_istream<_CharT, _Traits>&
606             operator>>(std::basic_istream<_CharT, _Traits>& __is,
607             std::mersenne_twister_engine<_UIntType1, __w1, __n1, __m1,
608             __r1, __a1, __u1, __d1, __s1, __b1, __t1, __c1,
609             __l1, __f1>& __x);
610              
611             private:
612             void _M_gen_rand();
613              
614             _UIntType _M_x[state_size];
615             size_t _M_p;
616             };
617              
618             /**
619             * @brief Compares two % mersenne_twister_engine random number generator
620             * objects of the same type for inequality.
621             *
622             * @param __lhs A % mersenne_twister_engine random number generator
623             * object.
624             * @param __rhs Another % mersenne_twister_engine random number
625             * generator object.
626             *
627             * @returns true if the infinite sequences of generated values
628             * would be different, false otherwise.
629             */
630             template
631             size_t __n, size_t __m, size_t __r,
632             _UIntType __a, size_t __u, _UIntType __d, size_t __s,
633             _UIntType __b, size_t __t,
634             _UIntType __c, size_t __l, _UIntType __f>
635             inline bool
636             operator!=(const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
637             __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __lhs,
638             const std::mersenne_twister_engine<_UIntType, __w, __n, __m,
639             __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __rhs)
640             { return !(__lhs == __rhs); }
641              
642              
643             /**
644             * @brief The Marsaglia-Zaman generator.
645             *
646             * This is a model of a Generalized Fibonacci discrete random number
647             * generator, sometimes referred to as the SWC generator.
648             *
649             * A discrete random number generator that produces pseudorandom
650             * numbers using:
651             * @f[
652             * x_{i}\leftarrow(x_{i - s} - x_{i - r} - carry_{i-1}) \bmod m
653             * @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             template
659             class subtract_with_carry_engine
660             {
661             static_assert(std::is_unsigned<_UIntType>::value, "template argument "
662             "substituting _UIntType not an unsigned integral type");
663             static_assert(0u < __s && __s < __r,
664             "template argument substituting __s out of bounds");
665             static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
666             "template argument substituting __w out of bounds");
667              
668             public:
669             /** The type of the generated random value. */
670             typedef _UIntType result_type;
671              
672             // parameter values
673             static constexpr size_t word_size = __w;
674             static constexpr size_t short_lag = __s;
675             static constexpr size_t long_lag = __r;
676             static constexpr result_type default_seed = 19780503u;
677              
678             /**
679             * @brief Constructs an explicitly seeded % subtract_with_carry_engine
680             * random number generator.
681             */
682             explicit
683             subtract_with_carry_engine(result_type __sd = default_seed)
684             { seed(__sd); }
685              
686             /**
687             * @brief Constructs a %subtract_with_carry_engine random number engine
688             * seeded from the seed sequence @p __q.
689             *
690             * @param __q the seed sequence.
691             */
692             template
693             std::enable_if::value>
694             ::type>
695             explicit
696             subtract_with_carry_engine(_Sseq& __q)
697             { seed(__q); }
698              
699             /**
700             * @brief Seeds the initial state @f$x_0@f$ of the random number
701             * generator.
702             *
703             * N1688[4.19] modifies this as follows. If @p __value == 0,
704             * sets value to 19780503. In any case, with a linear
705             * congruential generator lcg(i) having parameters @f$ m_{lcg} =
706             * 2147483563, a_{lcg} = 40014, c_{lcg} = 0, and lcg(0) = value
707             * @f$, sets @f$ x_{-r} \dots x_{-1} @f$ to @f$ lcg(1) \bmod m
708             * \dots lcg(r) \bmod m @f$ respectively. If @f$ x_{-1} = 0 @f$
709             * set carry to 1, otherwise sets carry to 0.
710             */
711             void
712             seed(result_type __sd = default_seed);
713              
714             /**
715             * @brief Seeds the initial state @f$x_0@f$ of the
716             * % subtract_with_carry_engine random number generator.
717             */
718             template
719             typename std::enable_if::value>::type
720             seed(_Sseq& __q);
721              
722             /**
723             * @brief Gets the inclusive minimum value of the range of random
724             * integers returned by this generator.
725             */
726             static constexpr result_type
727             min()
728             { return 0; }
729              
730             /**
731             * @brief Gets the inclusive maximum value of the range of random
732             * integers returned by this generator.
733             */
734             static constexpr result_type
735             max()
736             { return __detail::_Shift<_UIntType, __w>::__value - 1; }
737              
738             /**
739             * @brief Discard a sequence of random numbers.
740             */
741             void
742             discard(unsigned long long __z)
743             {
744             for (; __z != 0ULL; --__z)
745             (*this)();
746             }
747              
748             /**
749             * @brief Gets the next random number in the sequence.
750             */
751             result_type
752             operator()();
753              
754             /**
755             * @brief Compares two % subtract_with_carry_engine random number
756             * generator objects of the same type for equality.
757             *
758             * @param __lhs A % subtract_with_carry_engine random number generator
759             * object.
760             * @param __rhs Another % subtract_with_carry_engine random number
761             * generator object.
762             *
763             * @returns true if the infinite sequences of generated values
764             * would be equal, false otherwise.
765             */
766             friend bool
767             operator==(const subtract_with_carry_engine& __lhs,
768             const subtract_with_carry_engine& __rhs)
769             { return (std::equal(__lhs._M_x, __lhs._M_x + long_lag, __rhs._M_x)
770             && __lhs._M_carry == __rhs._M_carry
771             && __lhs._M_p == __rhs._M_p); }
772              
773             /**
774             * @brief Inserts the current state of a % subtract_with_carry_engine
775             * random number generator engine @p __x into the output stream
776             * @p __os.
777             *
778             * @param __os An output stream.
779             * @param __x A % subtract_with_carry_engine random number generator
780             * engine.
781             *
782             * @returns The output stream with the state of @p __x inserted or in
783             * an error state.
784             */
785             template
786             typename _CharT, typename _Traits>
787             friend std::basic_ostream<_CharT, _Traits>&
788             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
789             const std::subtract_with_carry_engine<_UIntType1, __w1,
790             __s1, __r1>& __x);
791              
792             /**
793             * @brief Extracts the current state of a % subtract_with_carry_engine
794             * random number generator engine @p __x from the input stream
795             * @p __is.
796             *
797             * @param __is An input stream.
798             * @param __x A % subtract_with_carry_engine random number generator
799             * engine.
800             *
801             * @returns The input stream with the state of @p __x extracted or in
802             * an error state.
803             */
804             template
805             typename _CharT, typename _Traits>
806             friend std::basic_istream<_CharT, _Traits>&
807             operator>>(std::basic_istream<_CharT, _Traits>& __is,
808             std::subtract_with_carry_engine<_UIntType1, __w1,
809             __s1, __r1>& __x);
810              
811             private:
812             /// The state of the generator. This is a ring buffer.
813             _UIntType _M_x[long_lag];
814             _UIntType _M_carry; ///< The carry
815             size_t _M_p; ///< Current index of x(i - r).
816             };
817              
818             /**
819             * @brief Compares two % subtract_with_carry_engine random number
820             * generator objects of the same type for inequality.
821             *
822             * @param __lhs A % subtract_with_carry_engine random number generator
823             * object.
824             * @param __rhs Another % subtract_with_carry_engine random number
825             * generator object.
826             *
827             * @returns true if the infinite sequences of generated values
828             * would be different, false otherwise.
829             */
830             template
831             inline bool
832             operator!=(const std::subtract_with_carry_engine<_UIntType, __w,
833             __s, __r>& __lhs,
834             const std::subtract_with_carry_engine<_UIntType, __w,
835             __s, __r>& __rhs)
836             { return !(__lhs == __rhs); }
837              
838              
839             /**
840             * Produces random numbers from some base engine by discarding blocks of
841             * data.
842             *
843             * 0 <= @p __r <= @p __p
844             */
845             template
846             class discard_block_engine
847             {
848             static_assert(1 <= __r && __r <= __p,
849             "template argument substituting __r out of bounds");
850              
851             public:
852             /** The type of the generated random value. */
853             typedef typename _RandomNumberEngine::result_type result_type;
854              
855             // parameter values
856             static constexpr size_t block_size = __p;
857             static constexpr size_t used_block = __r;
858              
859             /**
860             * @brief Constructs a default %discard_block_engine engine.
861             *
862             * The underlying engine is default constructed as well.
863             */
864             discard_block_engine()
865             : _M_b(), _M_n(0) { }
866              
867             /**
868             * @brief Copy constructs a %discard_block_engine engine.
869             *
870             * Copies an existing base class random number generator.
871             * @param __rng An existing (base class) engine object.
872             */
873             explicit
874             discard_block_engine(const _RandomNumberEngine& __rng)
875             : _M_b(__rng), _M_n(0) { }
876              
877             /**
878             * @brief Move constructs a %discard_block_engine engine.
879             *
880             * Copies an existing base class random number generator.
881             * @param __rng An existing (base class) engine object.
882             */
883             explicit
884             discard_block_engine(_RandomNumberEngine&& __rng)
885             : _M_b(std::move(__rng)), _M_n(0) { }
886              
887             /**
888             * @brief Seed constructs a %discard_block_engine engine.
889             *
890             * Constructs the underlying generator engine seeded with @p __s.
891             * @param __s A seed value for the base class engine.
892             */
893             explicit
894             discard_block_engine(result_type __s)
895             : _M_b(__s), _M_n(0) { }
896              
897             /**
898             * @brief Generator construct a %discard_block_engine engine.
899             *
900             * @param __q A seed sequence.
901             */
902             template
903             std::enable_if::value
904             && !std::is_same<_Sseq, _RandomNumberEngine>::value>
905             ::type>
906             explicit
907             discard_block_engine(_Sseq& __q)
908             : _M_b(__q), _M_n(0)
909             { }
910              
911             /**
912             * @brief Reseeds the %discard_block_engine object with the default
913             * seed for the underlying base class generator engine.
914             */
915             void
916             seed()
917             {
918             _M_b.seed();
919             _M_n = 0;
920             }
921              
922             /**
923             * @brief Reseeds the %discard_block_engine object with the default
924             * seed for the underlying base class generator engine.
925             */
926             void
927             seed(result_type __s)
928             {
929             _M_b.seed(__s);
930             _M_n = 0;
931             }
932              
933             /**
934             * @brief Reseeds the %discard_block_engine object with the given seed
935             * sequence.
936             * @param __q A seed generator function.
937             */
938             template
939             void
940             seed(_Sseq& __q)
941             {
942             _M_b.seed(__q);
943             _M_n = 0;
944             }
945              
946             /**
947             * @brief Gets a const reference to the underlying generator engine
948             * object.
949             */
950             const _RandomNumberEngine&
951             base() const noexcept
952             { return _M_b; }
953              
954             /**
955             * @brief Gets the minimum value in the generated random number range.
956             */
957             static constexpr result_type
958             min()
959             { return _RandomNumberEngine::min(); }
960              
961             /**
962             * @brief Gets the maximum value in the generated random number range.
963             */
964             static constexpr result_type
965             max()
966             { return _RandomNumberEngine::max(); }
967              
968             /**
969             * @brief Discard a sequence of random numbers.
970             */
971             void
972             discard(unsigned long long __z)
973             {
974             for (; __z != 0ULL; --__z)
975             (*this)();
976             }
977              
978             /**
979             * @brief Gets the next value in the generated random number sequence.
980             */
981             result_type
982             operator()();
983              
984             /**
985             * @brief Compares two %discard_block_engine random number generator
986             * objects of the same type for equality.
987             *
988             * @param __lhs A %discard_block_engine random number generator object.
989             * @param __rhs Another %discard_block_engine random number generator
990             * object.
991             *
992             * @returns true if the infinite sequences of generated values
993             * would be equal, false otherwise.
994             */
995             friend bool
996             operator==(const discard_block_engine& __lhs,
997             const discard_block_engine& __rhs)
998             { return __lhs._M_b == __rhs._M_b && __lhs._M_n == __rhs._M_n; }
999              
1000             /**
1001             * @brief Inserts the current state of a %discard_block_engine random
1002             * number generator engine @p __x into the output stream
1003             * @p __os.
1004             *
1005             * @param __os An output stream.
1006             * @param __x A %discard_block_engine random number generator engine.
1007             *
1008             * @returns The output stream with the state of @p __x inserted or in
1009             * an error state.
1010             */
1011             template
1012             typename _CharT, typename _Traits>
1013             friend std::basic_ostream<_CharT, _Traits>&
1014             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1015             const std::discard_block_engine<_RandomNumberEngine1,
1016             __p1, __r1>& __x);
1017              
1018             /**
1019             * @brief Extracts the current state of a % subtract_with_carry_engine
1020             * random number generator engine @p __x from the input stream
1021             * @p __is.
1022             *
1023             * @param __is An input stream.
1024             * @param __x A %discard_block_engine random number generator engine.
1025             *
1026             * @returns The input stream with the state of @p __x extracted or in
1027             * an error state.
1028             */
1029             template
1030             typename _CharT, typename _Traits>
1031             friend std::basic_istream<_CharT, _Traits>&
1032             operator>>(std::basic_istream<_CharT, _Traits>& __is,
1033             std::discard_block_engine<_RandomNumberEngine1,
1034             __p1, __r1>& __x);
1035              
1036             private:
1037             _RandomNumberEngine _M_b;
1038             size_t _M_n;
1039             };
1040              
1041             /**
1042             * @brief Compares two %discard_block_engine random number generator
1043             * objects of the same type for inequality.
1044             *
1045             * @param __lhs A %discard_block_engine random number generator object.
1046             * @param __rhs Another %discard_block_engine random number generator
1047             * object.
1048             *
1049             * @returns true if the infinite sequences of generated values
1050             * would be different, false otherwise.
1051             */
1052             template
1053             inline bool
1054             operator!=(const std::discard_block_engine<_RandomNumberEngine, __p,
1055             __r>& __lhs,
1056             const std::discard_block_engine<_RandomNumberEngine, __p,
1057             __r>& __rhs)
1058             { return !(__lhs == __rhs); }
1059              
1060              
1061             /**
1062             * Produces random numbers by combining random numbers from some base
1063             * engine to produce random numbers with a specifies number of bits @p __w.
1064             */
1065             template
1066             class independent_bits_engine
1067             {
1068             static_assert(std::is_unsigned<_UIntType>::value, "template argument "
1069             "substituting _UIntType not an unsigned integral type");
1070             static_assert(0u < __w && __w <= std::numeric_limits<_UIntType>::digits,
1071             "template argument substituting __w out of bounds");
1072              
1073             public:
1074             /** The type of the generated random value. */
1075             typedef _UIntType result_type;
1076              
1077             /**
1078             * @brief Constructs a default %independent_bits_engine engine.
1079             *
1080             * The underlying engine is default constructed as well.
1081             */
1082             independent_bits_engine()
1083             : _M_b() { }
1084              
1085             /**
1086             * @brief Copy constructs a %independent_bits_engine engine.
1087             *
1088             * Copies an existing base class random number generator.
1089             * @param __rng An existing (base class) engine object.
1090             */
1091             explicit
1092             independent_bits_engine(const _RandomNumberEngine& __rng)
1093             : _M_b(__rng) { }
1094              
1095             /**
1096             * @brief Move constructs a %independent_bits_engine engine.
1097             *
1098             * Copies an existing base class random number generator.
1099             * @param __rng An existing (base class) engine object.
1100             */
1101             explicit
1102             independent_bits_engine(_RandomNumberEngine&& __rng)
1103             : _M_b(std::move(__rng)) { }
1104              
1105             /**
1106             * @brief Seed constructs a %independent_bits_engine engine.
1107             *
1108             * Constructs the underlying generator engine seeded with @p __s.
1109             * @param __s A seed value for the base class engine.
1110             */
1111             explicit
1112             independent_bits_engine(result_type __s)
1113             : _M_b(__s) { }
1114              
1115             /**
1116             * @brief Generator construct a %independent_bits_engine engine.
1117             *
1118             * @param __q A seed sequence.
1119             */
1120             template
1121             std::enable_if::value
1122             && !std::is_same<_Sseq, _RandomNumberEngine>::value>
1123             ::type>
1124             explicit
1125             independent_bits_engine(_Sseq& __q)
1126             : _M_b(__q)
1127             { }
1128              
1129             /**
1130             * @brief Reseeds the %independent_bits_engine object with the default
1131             * seed for the underlying base class generator engine.
1132             */
1133             void
1134             seed()
1135             { _M_b.seed(); }
1136              
1137             /**
1138             * @brief Reseeds the %independent_bits_engine object with the default
1139             * seed for the underlying base class generator engine.
1140             */
1141             void
1142             seed(result_type __s)
1143             { _M_b.seed(__s); }
1144              
1145             /**
1146             * @brief Reseeds the %independent_bits_engine object with the given
1147             * seed sequence.
1148             * @param __q A seed generator function.
1149             */
1150             template
1151             void
1152             seed(_Sseq& __q)
1153             { _M_b.seed(__q); }
1154              
1155             /**
1156             * @brief Gets a const reference to the underlying generator engine
1157             * object.
1158             */
1159             const _RandomNumberEngine&
1160             base() const noexcept
1161             { return _M_b; }
1162              
1163             /**
1164             * @brief Gets the minimum value in the generated random number range.
1165             */
1166             static constexpr result_type
1167             min()
1168             { return 0U; }
1169              
1170             /**
1171             * @brief Gets the maximum value in the generated random number range.
1172             */
1173             static constexpr result_type
1174             max()
1175             { return __detail::_Shift<_UIntType, __w>::__value - 1; }
1176              
1177             /**
1178             * @brief Discard a sequence of random numbers.
1179             */
1180             void
1181             discard(unsigned long long __z)
1182             {
1183             for (; __z != 0ULL; --__z)
1184             (*this)();
1185             }
1186              
1187             /**
1188             * @brief Gets the next value in the generated random number sequence.
1189             */
1190             result_type
1191             operator()();
1192              
1193             /**
1194             * @brief Compares two %independent_bits_engine random number generator
1195             * objects of the same type for equality.
1196             *
1197             * @param __lhs A %independent_bits_engine random number generator
1198             * object.
1199             * @param __rhs Another %independent_bits_engine random number generator
1200             * object.
1201             *
1202             * @returns true if the infinite sequences of generated values
1203             * would be equal, false otherwise.
1204             */
1205             friend bool
1206             operator==(const independent_bits_engine& __lhs,
1207             const independent_bits_engine& __rhs)
1208             { return __lhs._M_b == __rhs._M_b; }
1209              
1210             /**
1211             * @brief Extracts the current state of a % subtract_with_carry_engine
1212             * random number generator engine @p __x from the input stream
1213             * @p __is.
1214             *
1215             * @param __is An input stream.
1216             * @param __x A %independent_bits_engine random number generator
1217             * engine.
1218             *
1219             * @returns The input stream with the state of @p __x extracted or in
1220             * an error state.
1221             */
1222             template
1223             friend std::basic_istream<_CharT, _Traits>&
1224             operator>>(std::basic_istream<_CharT, _Traits>& __is,
1225             std::independent_bits_engine<_RandomNumberEngine,
1226             __w, _UIntType>& __x)
1227             {
1228             __is >> __x._M_b;
1229             return __is;
1230             }
1231              
1232             private:
1233             _RandomNumberEngine _M_b;
1234             };
1235              
1236             /**
1237             * @brief Compares two %independent_bits_engine random number generator
1238             * objects of the same type for inequality.
1239             *
1240             * @param __lhs A %independent_bits_engine random number generator
1241             * object.
1242             * @param __rhs Another %independent_bits_engine random number generator
1243             * object.
1244             *
1245             * @returns true if the infinite sequences of generated values
1246             * would be different, false otherwise.
1247             */
1248             template
1249             inline bool
1250             operator!=(const std::independent_bits_engine<_RandomNumberEngine, __w,
1251             _UIntType>& __lhs,
1252             const std::independent_bits_engine<_RandomNumberEngine, __w,
1253             _UIntType>& __rhs)
1254             { return !(__lhs == __rhs); }
1255              
1256             /**
1257             * @brief Inserts the current state of a %independent_bits_engine random
1258             * number generator engine @p __x into the output stream @p __os.
1259             *
1260             * @param __os An output stream.
1261             * @param __x A %independent_bits_engine random number generator engine.
1262             *
1263             * @returns The output stream with the state of @p __x inserted or in
1264             * an error state.
1265             */
1266             template
1267             typename _CharT, typename _Traits>
1268             std::basic_ostream<_CharT, _Traits>&
1269             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1270             const std::independent_bits_engine<_RandomNumberEngine,
1271             __w, _UIntType>& __x)
1272             {
1273             __os << __x.base();
1274             return __os;
1275             }
1276              
1277              
1278             /**
1279             * @brief Produces random numbers by combining random numbers from some
1280             * base engine to produce random numbers with a specifies number of bits
1281             * @p __w.
1282             */
1283             template
1284             class shuffle_order_engine
1285             {
1286             static_assert(1u <= __k, "template argument substituting "
1287             "__k out of bound");
1288              
1289             public:
1290             /** The type of the generated random value. */
1291             typedef typename _RandomNumberEngine::result_type result_type;
1292              
1293             static constexpr size_t table_size = __k;
1294              
1295             /**
1296             * @brief Constructs a default %shuffle_order_engine engine.
1297             *
1298             * The underlying engine is default constructed as well.
1299             */
1300             shuffle_order_engine()
1301             : _M_b()
1302             { _M_initialize(); }
1303              
1304             /**
1305             * @brief Copy constructs a %shuffle_order_engine engine.
1306             *
1307             * Copies an existing base class random number generator.
1308             * @param __rng An existing (base class) engine object.
1309             */
1310             explicit
1311             shuffle_order_engine(const _RandomNumberEngine& __rng)
1312             : _M_b(__rng)
1313             { _M_initialize(); }
1314              
1315             /**
1316             * @brief Move constructs a %shuffle_order_engine engine.
1317             *
1318             * Copies an existing base class random number generator.
1319             * @param __rng An existing (base class) engine object.
1320             */
1321             explicit
1322             shuffle_order_engine(_RandomNumberEngine&& __rng)
1323             : _M_b(std::move(__rng))
1324             { _M_initialize(); }
1325              
1326             /**
1327             * @brief Seed constructs a %shuffle_order_engine engine.
1328             *
1329             * Constructs the underlying generator engine seeded with @p __s.
1330             * @param __s A seed value for the base class engine.
1331             */
1332             explicit
1333             shuffle_order_engine(result_type __s)
1334             : _M_b(__s)
1335             { _M_initialize(); }
1336              
1337             /**
1338             * @brief Generator construct a %shuffle_order_engine engine.
1339             *
1340             * @param __q A seed sequence.
1341             */
1342             template
1343             std::enable_if::value
1344             && !std::is_same<_Sseq, _RandomNumberEngine>::value>
1345             ::type>
1346             explicit
1347             shuffle_order_engine(_Sseq& __q)
1348             : _M_b(__q)
1349             { _M_initialize(); }
1350              
1351             /**
1352             * @brief Reseeds the %shuffle_order_engine object with the default seed
1353             for the underlying base class generator engine.
1354             */
1355             void
1356             seed()
1357             {
1358             _M_b.seed();
1359             _M_initialize();
1360             }
1361              
1362             /**
1363             * @brief Reseeds the %shuffle_order_engine object with the default seed
1364             * for the underlying base class generator engine.
1365             */
1366             void
1367             seed(result_type __s)
1368             {
1369             _M_b.seed(__s);
1370             _M_initialize();
1371             }
1372              
1373             /**
1374             * @brief Reseeds the %shuffle_order_engine object with the given seed
1375             * sequence.
1376             * @param __q A seed generator function.
1377             */
1378             template
1379             void
1380             seed(_Sseq& __q)
1381             {
1382             _M_b.seed(__q);
1383             _M_initialize();
1384             }
1385              
1386             /**
1387             * Gets a const reference to the underlying generator engine object.
1388             */
1389             const _RandomNumberEngine&
1390             base() const noexcept
1391             { return _M_b; }
1392              
1393             /**
1394             * Gets the minimum value in the generated random number range.
1395             */
1396             static constexpr result_type
1397             min()
1398             { return _RandomNumberEngine::min(); }
1399              
1400             /**
1401             * Gets the maximum value in the generated random number range.
1402             */
1403             static constexpr result_type
1404             max()
1405             { return _RandomNumberEngine::max(); }
1406              
1407             /**
1408             * Discard a sequence of random numbers.
1409             */
1410             void
1411             discard(unsigned long long __z)
1412             {
1413             for (; __z != 0ULL; --__z)
1414             (*this)();
1415             }
1416              
1417             /**
1418             * Gets the next value in the generated random number sequence.
1419             */
1420             result_type
1421             operator()();
1422              
1423             /**
1424             * Compares two %shuffle_order_engine random number generator objects
1425             * of the same type for equality.
1426             *
1427             * @param __lhs A %shuffle_order_engine random number generator object.
1428             * @param __rhs Another %shuffle_order_engine random number generator
1429             * object.
1430             *
1431             * @returns true if the infinite sequences of generated values
1432             * would be equal, false otherwise.
1433             */
1434             friend bool
1435             operator==(const shuffle_order_engine& __lhs,
1436             const shuffle_order_engine& __rhs)
1437             { return (__lhs._M_b == __rhs._M_b
1438             && std::equal(__lhs._M_v, __lhs._M_v + __k, __rhs._M_v)
1439             && __lhs._M_y == __rhs._M_y); }
1440              
1441             /**
1442             * @brief Inserts the current state of a %shuffle_order_engine random
1443             * number generator engine @p __x into the output stream
1444             @p __os.
1445             *
1446             * @param __os An output stream.
1447             * @param __x A %shuffle_order_engine random number generator engine.
1448             *
1449             * @returns The output stream with the state of @p __x inserted or in
1450             * an error state.
1451             */
1452             template
1453             typename _CharT, typename _Traits>
1454             friend std::basic_ostream<_CharT, _Traits>&
1455             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1456             const std::shuffle_order_engine<_RandomNumberEngine1,
1457             __k1>& __x);
1458              
1459             /**
1460             * @brief Extracts the current state of a % subtract_with_carry_engine
1461             * random number generator engine @p __x from the input stream
1462             * @p __is.
1463             *
1464             * @param __is An input stream.
1465             * @param __x A %shuffle_order_engine random number generator engine.
1466             *
1467             * @returns The input stream with the state of @p __x extracted or in
1468             * an error state.
1469             */
1470             template
1471             typename _CharT, typename _Traits>
1472             friend std::basic_istream<_CharT, _Traits>&
1473             operator>>(std::basic_istream<_CharT, _Traits>& __is,
1474             std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x);
1475              
1476             private:
1477             void _M_initialize()
1478             {
1479             for (size_t __i = 0; __i < __k; ++__i)
1480             _M_v[__i] = _M_b();
1481             _M_y = _M_b();
1482             }
1483              
1484             _RandomNumberEngine _M_b;
1485             result_type _M_v[__k];
1486             result_type _M_y;
1487             };
1488              
1489             /**
1490             * Compares two %shuffle_order_engine random number generator objects
1491             * of the same type for inequality.
1492             *
1493             * @param __lhs A %shuffle_order_engine random number generator object.
1494             * @param __rhs Another %shuffle_order_engine random number generator
1495             * object.
1496             *
1497             * @returns true if the infinite sequences of generated values
1498             * would be different, false otherwise.
1499             */
1500             template
1501             inline bool
1502             operator!=(const std::shuffle_order_engine<_RandomNumberEngine,
1503             __k>& __lhs,
1504             const std::shuffle_order_engine<_RandomNumberEngine,
1505             __k>& __rhs)
1506             { return !(__lhs == __rhs); }
1507              
1508              
1509             /**
1510             * The classic Minimum Standard rand0 of Lewis, Goodman, and Miller.
1511             */
1512             typedef linear_congruential_engine
1513             minstd_rand0;
1514              
1515             /**
1516             * An alternative LCR (Lehmer Generator function).
1517             */
1518             typedef linear_congruential_engine
1519             minstd_rand;
1520              
1521             /**
1522             * The classic Mersenne Twister.
1523             *
1524             * Reference:
1525             * M. Matsumoto and T. Nishimura, Mersenne Twister: A 623-Dimensionally
1526             * Equidistributed Uniform Pseudo-Random Number Generator, ACM Transactions
1527             * on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
1528             */
1529             typedef mersenne_twister_engine<
1530             uint_fast32_t,
1531             32, 624, 397, 31,
1532             0x9908b0dfUL, 11,
1533             0xffffffffUL, 7,
1534             0x9d2c5680UL, 15,
1535             0xefc60000UL, 18, 1812433253UL> mt19937;
1536              
1537             /**
1538             * An alternative Mersenne Twister.
1539             */
1540             typedef mersenne_twister_engine<
1541             uint_fast64_t,
1542             64, 312, 156, 31,
1543             0xb5026f5aa96619e9ULL, 29,
1544             0x5555555555555555ULL, 17,
1545             0x71d67fffeda60000ULL, 37,
1546             0xfff7eee000000000ULL, 43,
1547             6364136223846793005ULL> mt19937_64;
1548              
1549             typedef subtract_with_carry_engine
1550             ranlux24_base;
1551              
1552             typedef subtract_with_carry_engine
1553             ranlux48_base;
1554              
1555             typedef discard_block_engine ranlux24;
1556              
1557             typedef discard_block_engine ranlux48;
1558              
1559             typedef shuffle_order_engine knuth_b;
1560              
1561             typedef minstd_rand0 default_random_engine;
1562              
1563             /**
1564             * A standard interface to a platform-specific non-deterministic
1565             * random number generator (if any are available).
1566             */
1567             class random_device
1568             {
1569             public:
1570             /** The type of the generated random value. */
1571             typedef unsigned int result_type;
1572              
1573             // constructors, destructors and member functions
1574              
1575             #ifdef _GLIBCXX_USE_RANDOM_TR1
1576              
1577             explicit
1578             random_device(const std::string& __token = "default")
1579             {
1580             _M_init(__token);
1581             }
1582              
1583             ~random_device()
1584             { _M_fini(); }
1585              
1586             #else
1587              
1588             explicit
1589             random_device(const std::string& __token = "mt19937")
1590             { _M_init_pretr1(__token); }
1591              
1592             public:
1593              
1594             #endif
1595              
1596             static constexpr result_type
1597             min()
1598             { return std::numeric_limits::min(); }
1599              
1600             static constexpr result_type
1601             max()
1602             { return std::numeric_limits::max(); }
1603              
1604             double
1605             entropy() const noexcept
1606             { return 0.0; }
1607              
1608             result_type
1609             operator()()
1610             {
1611             #ifdef _GLIBCXX_USE_RANDOM_TR1
1612             return this->_M_getval();
1613             #else
1614             return this->_M_getval_pretr1();
1615             #endif
1616             }
1617              
1618             // No copy functions.
1619             random_device(const random_device&) = delete;
1620             void operator=(const random_device&) = delete;
1621              
1622             private:
1623              
1624             void _M_init(const std::string& __token);
1625             void _M_init_pretr1(const std::string& __token);
1626             void _M_fini();
1627              
1628             result_type _M_getval();
1629             result_type _M_getval_pretr1();
1630              
1631             union
1632             {
1633             void* _M_file;
1634             mt19937 _M_mt;
1635             };
1636             };
1637              
1638             /* @} */ // group random_generators
1639              
1640             /**
1641             * @addtogroup random_distributions Random Number Distributions
1642             * @ingroup random
1643             * @{
1644             */
1645              
1646             /**
1647             * @addtogroup random_distributions_uniform Uniform Distributions
1648             * @ingroup random_distributions
1649             * @{
1650             */
1651              
1652             // std::uniform_int_distribution is defined in
1653              
1654             /**
1655             * @brief Return true if two uniform integer distributions have
1656             * different parameters.
1657             */
1658             template
1659             inline bool
1660             operator!=(const std::uniform_int_distribution<_IntType>& __d1,
1661             const std::uniform_int_distribution<_IntType>& __d2)
1662             { return !(__d1 == __d2); }
1663              
1664             /**
1665             * @brief Inserts a %uniform_int_distribution random number
1666             * distribution @p __x into the output stream @p os.
1667             *
1668             * @param __os An output stream.
1669             * @param __x A %uniform_int_distribution random number distribution.
1670             *
1671             * @returns The output stream with the state of @p __x inserted or in
1672             * an error state.
1673             */
1674             template
1675             std::basic_ostream<_CharT, _Traits>&
1676             operator<<(std::basic_ostream<_CharT, _Traits>&,
1677             const std::uniform_int_distribution<_IntType>&);
1678              
1679             /**
1680             * @brief Extracts a %uniform_int_distribution random number distribution
1681             * @p __x from the input stream @p __is.
1682             *
1683             * @param __is An input stream.
1684             * @param __x A %uniform_int_distribution random number generator engine.
1685             *
1686             * @returns The input stream with @p __x extracted or in an error state.
1687             */
1688             template
1689             std::basic_istream<_CharT, _Traits>&
1690             operator>>(std::basic_istream<_CharT, _Traits>&,
1691             std::uniform_int_distribution<_IntType>&);
1692              
1693              
1694             /**
1695             * @brief Uniform continuous distribution for random numbers.
1696             *
1697             * A continuous random distribution on the range [min, max) with equal
1698             * probability throughout the range. The URNG should be real-valued and
1699             * deliver number in the range [0, 1).
1700             */
1701             template
1702             class uniform_real_distribution
1703             {
1704             static_assert(std::is_floating_point<_RealType>::value,
1705             "template argument not a floating point type");
1706              
1707             public:
1708             /** The type of the range of the distribution. */
1709             typedef _RealType result_type;
1710             /** Parameter type. */
1711             struct param_type
1712             {
1713             typedef uniform_real_distribution<_RealType> distribution_type;
1714              
1715             explicit
1716             param_type(_RealType __a = _RealType(0),
1717             _RealType __b = _RealType(1))
1718             : _M_a(__a), _M_b(__b)
1719             {
1720             _GLIBCXX_DEBUG_ASSERT(_M_a <= _M_b);
1721             }
1722              
1723             result_type
1724             a() const
1725             { return _M_a; }
1726              
1727             result_type
1728             b() const
1729             { return _M_b; }
1730              
1731             friend bool
1732             operator==(const param_type& __p1, const param_type& __p2)
1733             { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
1734              
1735             private:
1736             _RealType _M_a;
1737             _RealType _M_b;
1738             };
1739              
1740             public:
1741             /**
1742             * @brief Constructs a uniform_real_distribution object.
1743             *
1744             * @param __a [IN] The lower bound of the distribution.
1745             * @param __b [IN] The upper bound of the distribution.
1746             */
1747             explicit
1748             uniform_real_distribution(_RealType __a = _RealType(0),
1749             _RealType __b = _RealType(1))
1750             : _M_param(__a, __b)
1751             { }
1752              
1753             explicit
1754             uniform_real_distribution(const param_type& __p)
1755             : _M_param(__p)
1756             { }
1757              
1758             /**
1759             * @brief Resets the distribution state.
1760             *
1761             * Does nothing for the uniform real distribution.
1762             */
1763             void
1764             reset() { }
1765              
1766             result_type
1767             a() const
1768             { return _M_param.a(); }
1769              
1770             result_type
1771             b() const
1772             { return _M_param.b(); }
1773              
1774             /**
1775             * @brief Returns the parameter set of the distribution.
1776             */
1777             param_type
1778             param() const
1779             { return _M_param; }
1780              
1781             /**
1782             * @brief Sets the parameter set of the distribution.
1783             * @param __param The new parameter set of the distribution.
1784             */
1785             void
1786             param(const param_type& __param)
1787             { _M_param = __param; }
1788              
1789             /**
1790             * @brief Returns the inclusive lower bound of the distribution range.
1791             */
1792             result_type
1793             min() const
1794             { return this->a(); }
1795              
1796             /**
1797             * @brief Returns the inclusive upper bound of the distribution range.
1798             */
1799             result_type
1800             max() const
1801             { return this->b(); }
1802              
1803             /**
1804             * @brief Generating functions.
1805             */
1806             template
1807             result_type
1808             operator()(_UniformRandomNumberGenerator& __urng)
1809             { return this->operator()(__urng, _M_param); }
1810              
1811             template
1812             result_type
1813             operator()(_UniformRandomNumberGenerator& __urng,
1814             const param_type& __p)
1815             {
1816             __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1817             __aurng(__urng);
1818 0           return (__aurng() * (__p.b() - __p.a())) + __p.a();
1819             }
1820              
1821             template
1822             typename _UniformRandomNumberGenerator>
1823             void
1824             __generate(_ForwardIterator __f, _ForwardIterator __t,
1825             _UniformRandomNumberGenerator& __urng)
1826             { this->__generate(__f, __t, __urng, _M_param); }
1827              
1828             template
1829             typename _UniformRandomNumberGenerator>
1830             void
1831             __generate(_ForwardIterator __f, _ForwardIterator __t,
1832             _UniformRandomNumberGenerator& __urng,
1833             const param_type& __p)
1834             { this->__generate_impl(__f, __t, __urng, __p); }
1835              
1836             template
1837             void
1838             __generate(result_type* __f, result_type* __t,
1839             _UniformRandomNumberGenerator& __urng,
1840             const param_type& __p)
1841             { this->__generate_impl(__f, __t, __urng, __p); }
1842              
1843             /**
1844             * @brief Return true if two uniform real distributions have
1845             * the same parameters.
1846             */
1847             friend bool
1848             operator==(const uniform_real_distribution& __d1,
1849             const uniform_real_distribution& __d2)
1850             { return __d1._M_param == __d2._M_param; }
1851              
1852             private:
1853             template
1854             typename _UniformRandomNumberGenerator>
1855             void
1856             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
1857             _UniformRandomNumberGenerator& __urng,
1858             const param_type& __p);
1859              
1860             param_type _M_param;
1861             };
1862              
1863             /**
1864             * @brief Return true if two uniform real distributions have
1865             * different parameters.
1866             */
1867             template
1868             inline bool
1869             operator!=(const std::uniform_real_distribution<_IntType>& __d1,
1870             const std::uniform_real_distribution<_IntType>& __d2)
1871             { return !(__d1 == __d2); }
1872              
1873             /**
1874             * @brief Inserts a %uniform_real_distribution random number
1875             * distribution @p __x into the output stream @p __os.
1876             *
1877             * @param __os An output stream.
1878             * @param __x A %uniform_real_distribution random number distribution.
1879             *
1880             * @returns The output stream with the state of @p __x inserted or in
1881             * an error state.
1882             */
1883             template
1884             std::basic_ostream<_CharT, _Traits>&
1885             operator<<(std::basic_ostream<_CharT, _Traits>&,
1886             const std::uniform_real_distribution<_RealType>&);
1887              
1888             /**
1889             * @brief Extracts a %uniform_real_distribution random number distribution
1890             * @p __x from the input stream @p __is.
1891             *
1892             * @param __is An input stream.
1893             * @param __x A %uniform_real_distribution random number generator engine.
1894             *
1895             * @returns The input stream with @p __x extracted or in an error state.
1896             */
1897             template
1898             std::basic_istream<_CharT, _Traits>&
1899             operator>>(std::basic_istream<_CharT, _Traits>&,
1900             std::uniform_real_distribution<_RealType>&);
1901              
1902             /* @} */ // group random_distributions_uniform
1903              
1904             /**
1905             * @addtogroup random_distributions_normal Normal Distributions
1906             * @ingroup random_distributions
1907             * @{
1908             */
1909              
1910             /**
1911             * @brief A normal continuous distribution for random numbers.
1912             *
1913             * The formula for the normal probability density function is
1914             * @f[
1915             * p(x|\mu,\sigma) = \frac{1}{\sigma \sqrt{2 \pi}}
1916             * e^{- \frac{{x - \mu}^ {2}}{2 \sigma ^ {2}} }
1917             * @f]
1918             */
1919             template
1920             class normal_distribution
1921             {
1922             static_assert(std::is_floating_point<_RealType>::value,
1923             "template argument not a floating point type");
1924              
1925             public:
1926             /** The type of the range of the distribution. */
1927             typedef _RealType result_type;
1928             /** Parameter type. */
1929             struct param_type
1930             {
1931             typedef normal_distribution<_RealType> distribution_type;
1932              
1933             explicit
1934             param_type(_RealType __mean = _RealType(0),
1935             _RealType __stddev = _RealType(1))
1936             : _M_mean(__mean), _M_stddev(__stddev)
1937             {
1938             _GLIBCXX_DEBUG_ASSERT(_M_stddev > _RealType(0));
1939             }
1940              
1941             _RealType
1942             mean() const
1943             { return _M_mean; }
1944              
1945             _RealType
1946             stddev() const
1947             { return _M_stddev; }
1948              
1949             friend bool
1950             operator==(const param_type& __p1, const param_type& __p2)
1951             { return (__p1._M_mean == __p2._M_mean
1952             && __p1._M_stddev == __p2._M_stddev); }
1953              
1954             private:
1955             _RealType _M_mean;
1956             _RealType _M_stddev;
1957             };
1958              
1959             public:
1960             /**
1961             * Constructs a normal distribution with parameters @f$mean@f$ and
1962             * standard deviation.
1963             */
1964             explicit
1965             normal_distribution(result_type __mean = result_type(0),
1966             result_type __stddev = result_type(1))
1967             : _M_param(__mean, __stddev), _M_saved_available(false)
1968             { }
1969              
1970             explicit
1971             normal_distribution(const param_type& __p)
1972             : _M_param(__p), _M_saved_available(false)
1973             { }
1974              
1975             /**
1976             * @brief Resets the distribution state.
1977             */
1978             void
1979             reset()
1980             { _M_saved_available = false; }
1981              
1982             /**
1983             * @brief Returns the mean of the distribution.
1984             */
1985             _RealType
1986             mean() const
1987             { return _M_param.mean(); }
1988              
1989             /**
1990             * @brief Returns the standard deviation of the distribution.
1991             */
1992             _RealType
1993             stddev() const
1994             { return _M_param.stddev(); }
1995              
1996             /**
1997             * @brief Returns the parameter set of the distribution.
1998             */
1999             param_type
2000             param() const
2001             { return _M_param; }
2002              
2003             /**
2004             * @brief Sets the parameter set of the distribution.
2005             * @param __param The new parameter set of the distribution.
2006             */
2007             void
2008             param(const param_type& __param)
2009             { _M_param = __param; }
2010              
2011             /**
2012             * @brief Returns the greatest lower bound value of the distribution.
2013             */
2014             result_type
2015             min() const
2016             { return std::numeric_limits::lowest(); }
2017              
2018             /**
2019             * @brief Returns the least upper bound value of the distribution.
2020             */
2021             result_type
2022             max() const
2023             { return std::numeric_limits::max(); }
2024              
2025             /**
2026             * @brief Generating functions.
2027             */
2028             template
2029             result_type
2030             operator()(_UniformRandomNumberGenerator& __urng)
2031             { return this->operator()(__urng, _M_param); }
2032              
2033             template
2034             result_type
2035             operator()(_UniformRandomNumberGenerator& __urng,
2036             const param_type& __p);
2037              
2038             template
2039             typename _UniformRandomNumberGenerator>
2040             void
2041             __generate(_ForwardIterator __f, _ForwardIterator __t,
2042             _UniformRandomNumberGenerator& __urng)
2043             { this->__generate(__f, __t, __urng, _M_param); }
2044              
2045             template
2046             typename _UniformRandomNumberGenerator>
2047             void
2048             __generate(_ForwardIterator __f, _ForwardIterator __t,
2049             _UniformRandomNumberGenerator& __urng,
2050             const param_type& __p)
2051             { this->__generate_impl(__f, __t, __urng, __p); }
2052              
2053             template
2054             void
2055             __generate(result_type* __f, result_type* __t,
2056             _UniformRandomNumberGenerator& __urng,
2057             const param_type& __p)
2058             { this->__generate_impl(__f, __t, __urng, __p); }
2059              
2060             /**
2061             * @brief Return true if two normal distributions have
2062             * the same parameters and the sequences that would
2063             * be generated are equal.
2064             */
2065             template
2066             friend bool
2067             operator==(const std::normal_distribution<_RealType1>& __d1,
2068             const std::normal_distribution<_RealType1>& __d2);
2069              
2070             /**
2071             * @brief Inserts a %normal_distribution random number distribution
2072             * @p __x into the output stream @p __os.
2073             *
2074             * @param __os An output stream.
2075             * @param __x A %normal_distribution random number distribution.
2076             *
2077             * @returns The output stream with the state of @p __x inserted or in
2078             * an error state.
2079             */
2080             template
2081             friend std::basic_ostream<_CharT, _Traits>&
2082             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2083             const std::normal_distribution<_RealType1>& __x);
2084              
2085             /**
2086             * @brief Extracts a %normal_distribution random number distribution
2087             * @p __x from the input stream @p __is.
2088             *
2089             * @param __is An input stream.
2090             * @param __x A %normal_distribution random number generator engine.
2091             *
2092             * @returns The input stream with @p __x extracted or in an error
2093             * state.
2094             */
2095             template
2096             friend std::basic_istream<_CharT, _Traits>&
2097             operator>>(std::basic_istream<_CharT, _Traits>& __is,
2098             std::normal_distribution<_RealType1>& __x);
2099              
2100             private:
2101             template
2102             typename _UniformRandomNumberGenerator>
2103             void
2104             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2105             _UniformRandomNumberGenerator& __urng,
2106             const param_type& __p);
2107              
2108             param_type _M_param;
2109             result_type _M_saved;
2110             bool _M_saved_available;
2111             };
2112              
2113             /**
2114             * @brief Return true if two normal distributions are different.
2115             */
2116             template
2117             inline bool
2118             operator!=(const std::normal_distribution<_RealType>& __d1,
2119             const std::normal_distribution<_RealType>& __d2)
2120             { return !(__d1 == __d2); }
2121              
2122              
2123             /**
2124             * @brief A lognormal_distribution random number distribution.
2125             *
2126             * The formula for the normal probability mass function is
2127             * @f[
2128             * p(x|m,s) = \frac{1}{sx\sqrt{2\pi}}
2129             * \exp{-\frac{(\ln{x} - m)^2}{2s^2}}
2130             * @f]
2131             */
2132             template
2133             class lognormal_distribution
2134             {
2135             static_assert(std::is_floating_point<_RealType>::value,
2136             "template argument not a floating point type");
2137              
2138             public:
2139             /** The type of the range of the distribution. */
2140             typedef _RealType result_type;
2141             /** Parameter type. */
2142             struct param_type
2143             {
2144             typedef lognormal_distribution<_RealType> distribution_type;
2145              
2146             explicit
2147             param_type(_RealType __m = _RealType(0),
2148             _RealType __s = _RealType(1))
2149             : _M_m(__m), _M_s(__s)
2150             { }
2151              
2152             _RealType
2153             m() const
2154             { return _M_m; }
2155              
2156             _RealType
2157             s() const
2158             { return _M_s; }
2159              
2160             friend bool
2161             operator==(const param_type& __p1, const param_type& __p2)
2162             { return __p1._M_m == __p2._M_m && __p1._M_s == __p2._M_s; }
2163              
2164             private:
2165             _RealType _M_m;
2166             _RealType _M_s;
2167             };
2168              
2169             explicit
2170             lognormal_distribution(_RealType __m = _RealType(0),
2171             _RealType __s = _RealType(1))
2172             : _M_param(__m, __s), _M_nd()
2173             { }
2174              
2175             explicit
2176             lognormal_distribution(const param_type& __p)
2177             : _M_param(__p), _M_nd()
2178             { }
2179              
2180             /**
2181             * Resets the distribution state.
2182             */
2183             void
2184             reset()
2185             { _M_nd.reset(); }
2186              
2187             /**
2188             *
2189             */
2190             _RealType
2191             m() const
2192             { return _M_param.m(); }
2193              
2194             _RealType
2195             s() const
2196             { return _M_param.s(); }
2197              
2198             /**
2199             * @brief Returns the parameter set of the distribution.
2200             */
2201             param_type
2202             param() const
2203             { return _M_param; }
2204              
2205             /**
2206             * @brief Sets the parameter set of the distribution.
2207             * @param __param The new parameter set of the distribution.
2208             */
2209             void
2210             param(const param_type& __param)
2211             { _M_param = __param; }
2212              
2213             /**
2214             * @brief Returns the greatest lower bound value of the distribution.
2215             */
2216             result_type
2217             min() const
2218             { return result_type(0); }
2219              
2220             /**
2221             * @brief Returns the least upper bound value of the distribution.
2222             */
2223             result_type
2224             max() const
2225             { return std::numeric_limits::max(); }
2226              
2227             /**
2228             * @brief Generating functions.
2229             */
2230             template
2231             result_type
2232             operator()(_UniformRandomNumberGenerator& __urng)
2233             { return this->operator()(__urng, _M_param); }
2234              
2235             template
2236             result_type
2237             operator()(_UniformRandomNumberGenerator& __urng,
2238             const param_type& __p)
2239             { return std::exp(__p.s() * _M_nd(__urng) + __p.m()); }
2240              
2241             template
2242             typename _UniformRandomNumberGenerator>
2243             void
2244             __generate(_ForwardIterator __f, _ForwardIterator __t,
2245             _UniformRandomNumberGenerator& __urng)
2246             { this->__generate(__f, __t, __urng, _M_param); }
2247              
2248             template
2249             typename _UniformRandomNumberGenerator>
2250             void
2251             __generate(_ForwardIterator __f, _ForwardIterator __t,
2252             _UniformRandomNumberGenerator& __urng,
2253             const param_type& __p)
2254             { this->__generate_impl(__f, __t, __urng, __p); }
2255              
2256             template
2257             void
2258             __generate(result_type* __f, result_type* __t,
2259             _UniformRandomNumberGenerator& __urng,
2260             const param_type& __p)
2261             { this->__generate_impl(__f, __t, __urng, __p); }
2262              
2263             /**
2264             * @brief Return true if two lognormal distributions have
2265             * the same parameters and the sequences that would
2266             * be generated are equal.
2267             */
2268             friend bool
2269             operator==(const lognormal_distribution& __d1,
2270             const lognormal_distribution& __d2)
2271             { return (__d1._M_param == __d2._M_param
2272             && __d1._M_nd == __d2._M_nd); }
2273              
2274             /**
2275             * @brief Inserts a %lognormal_distribution random number distribution
2276             * @p __x into the output stream @p __os.
2277             *
2278             * @param __os An output stream.
2279             * @param __x A %lognormal_distribution random number distribution.
2280             *
2281             * @returns The output stream with the state of @p __x inserted or in
2282             * an error state.
2283             */
2284             template
2285             friend std::basic_ostream<_CharT, _Traits>&
2286             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2287             const std::lognormal_distribution<_RealType1>& __x);
2288              
2289             /**
2290             * @brief Extracts a %lognormal_distribution random number distribution
2291             * @p __x from the input stream @p __is.
2292             *
2293             * @param __is An input stream.
2294             * @param __x A %lognormal_distribution random number
2295             * generator engine.
2296             *
2297             * @returns The input stream with @p __x extracted or in an error state.
2298             */
2299             template
2300             friend std::basic_istream<_CharT, _Traits>&
2301             operator>>(std::basic_istream<_CharT, _Traits>& __is,
2302             std::lognormal_distribution<_RealType1>& __x);
2303              
2304             private:
2305             template
2306             typename _UniformRandomNumberGenerator>
2307             void
2308             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2309             _UniformRandomNumberGenerator& __urng,
2310             const param_type& __p);
2311              
2312             param_type _M_param;
2313              
2314             std::normal_distribution _M_nd;
2315             };
2316              
2317             /**
2318             * @brief Return true if two lognormal distributions are different.
2319             */
2320             template
2321             inline bool
2322             operator!=(const std::lognormal_distribution<_RealType>& __d1,
2323             const std::lognormal_distribution<_RealType>& __d2)
2324             { return !(__d1 == __d2); }
2325              
2326              
2327             /**
2328             * @brief A gamma continuous distribution for random numbers.
2329             *
2330             * The formula for the gamma probability density function is:
2331             * @f[
2332             * p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)}
2333             * (x/\beta)^{\alpha - 1} e^{-x/\beta}
2334             * @f]
2335             */
2336             template
2337             class gamma_distribution
2338             {
2339             static_assert(std::is_floating_point<_RealType>::value,
2340             "template argument not a floating point type");
2341              
2342             public:
2343             /** The type of the range of the distribution. */
2344             typedef _RealType result_type;
2345             /** Parameter type. */
2346             struct param_type
2347             {
2348             typedef gamma_distribution<_RealType> distribution_type;
2349             friend class gamma_distribution<_RealType>;
2350              
2351             explicit
2352             param_type(_RealType __alpha_val = _RealType(1),
2353             _RealType __beta_val = _RealType(1))
2354             : _M_alpha(__alpha_val), _M_beta(__beta_val)
2355             {
2356             _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0));
2357             _M_initialize();
2358             }
2359              
2360             _RealType
2361             alpha() const
2362             { return _M_alpha; }
2363              
2364             _RealType
2365             beta() const
2366             { return _M_beta; }
2367              
2368             friend bool
2369             operator==(const param_type& __p1, const param_type& __p2)
2370             { return (__p1._M_alpha == __p2._M_alpha
2371             && __p1._M_beta == __p2._M_beta); }
2372              
2373             private:
2374             void
2375             _M_initialize();
2376              
2377             _RealType _M_alpha;
2378             _RealType _M_beta;
2379              
2380             _RealType _M_malpha, _M_a2;
2381             };
2382              
2383             public:
2384             /**
2385             * @brief Constructs a gamma distribution with parameters
2386             * @f$\alpha@f$ and @f$\beta@f$.
2387             */
2388             explicit
2389             gamma_distribution(_RealType __alpha_val = _RealType(1),
2390             _RealType __beta_val = _RealType(1))
2391             : _M_param(__alpha_val, __beta_val), _M_nd()
2392             { }
2393              
2394             explicit
2395             gamma_distribution(const param_type& __p)
2396             : _M_param(__p), _M_nd()
2397             { }
2398              
2399             /**
2400             * @brief Resets the distribution state.
2401             */
2402             void
2403             reset()
2404             { _M_nd.reset(); }
2405              
2406             /**
2407             * @brief Returns the @f$\alpha@f$ of the distribution.
2408             */
2409             _RealType
2410             alpha() const
2411             { return _M_param.alpha(); }
2412              
2413             /**
2414             * @brief Returns the @f$\beta@f$ of the distribution.
2415             */
2416             _RealType
2417             beta() const
2418             { return _M_param.beta(); }
2419              
2420             /**
2421             * @brief Returns the parameter set of the distribution.
2422             */
2423             param_type
2424             param() const
2425             { return _M_param; }
2426              
2427             /**
2428             * @brief Sets the parameter set of the distribution.
2429             * @param __param The new parameter set of the distribution.
2430             */
2431             void
2432             param(const param_type& __param)
2433             { _M_param = __param; }
2434              
2435             /**
2436             * @brief Returns the greatest lower bound value of the distribution.
2437             */
2438             result_type
2439             min() const
2440             { return result_type(0); }
2441              
2442             /**
2443             * @brief Returns the least upper bound value of the distribution.
2444             */
2445             result_type
2446             max() const
2447             { return std::numeric_limits::max(); }
2448              
2449             /**
2450             * @brief Generating functions.
2451             */
2452             template
2453             result_type
2454             operator()(_UniformRandomNumberGenerator& __urng)
2455             { return this->operator()(__urng, _M_param); }
2456              
2457             template
2458             result_type
2459             operator()(_UniformRandomNumberGenerator& __urng,
2460             const param_type& __p);
2461              
2462             template
2463             typename _UniformRandomNumberGenerator>
2464             void
2465             __generate(_ForwardIterator __f, _ForwardIterator __t,
2466             _UniformRandomNumberGenerator& __urng)
2467             { this->__generate(__f, __t, __urng, _M_param); }
2468              
2469             template
2470             typename _UniformRandomNumberGenerator>
2471             void
2472             __generate(_ForwardIterator __f, _ForwardIterator __t,
2473             _UniformRandomNumberGenerator& __urng,
2474             const param_type& __p)
2475             { this->__generate_impl(__f, __t, __urng, __p); }
2476              
2477             template
2478             void
2479             __generate(result_type* __f, result_type* __t,
2480             _UniformRandomNumberGenerator& __urng,
2481             const param_type& __p)
2482             { this->__generate_impl(__f, __t, __urng, __p); }
2483              
2484             /**
2485             * @brief Return true if two gamma distributions have the same
2486             * parameters and the sequences that would be generated
2487             * are equal.
2488             */
2489             friend bool
2490             operator==(const gamma_distribution& __d1,
2491             const gamma_distribution& __d2)
2492             { return (__d1._M_param == __d2._M_param
2493             && __d1._M_nd == __d2._M_nd); }
2494              
2495             /**
2496             * @brief Inserts a %gamma_distribution random number distribution
2497             * @p __x into the output stream @p __os.
2498             *
2499             * @param __os An output stream.
2500             * @param __x A %gamma_distribution random number distribution.
2501             *
2502             * @returns The output stream with the state of @p __x inserted or in
2503             * an error state.
2504             */
2505             template
2506             friend std::basic_ostream<_CharT, _Traits>&
2507             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2508             const std::gamma_distribution<_RealType1>& __x);
2509              
2510             /**
2511             * @brief Extracts a %gamma_distribution random number distribution
2512             * @p __x from the input stream @p __is.
2513             *
2514             * @param __is An input stream.
2515             * @param __x A %gamma_distribution random number generator engine.
2516             *
2517             * @returns The input stream with @p __x extracted or in an error state.
2518             */
2519             template
2520             friend std::basic_istream<_CharT, _Traits>&
2521             operator>>(std::basic_istream<_CharT, _Traits>& __is,
2522             std::gamma_distribution<_RealType1>& __x);
2523              
2524             private:
2525             template
2526             typename _UniformRandomNumberGenerator>
2527             void
2528             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2529             _UniformRandomNumberGenerator& __urng,
2530             const param_type& __p);
2531              
2532             param_type _M_param;
2533              
2534             std::normal_distribution _M_nd;
2535             };
2536              
2537             /**
2538             * @brief Return true if two gamma distributions are different.
2539             */
2540             template
2541             inline bool
2542             operator!=(const std::gamma_distribution<_RealType>& __d1,
2543             const std::gamma_distribution<_RealType>& __d2)
2544             { return !(__d1 == __d2); }
2545              
2546              
2547             /**
2548             * @brief A chi_squared_distribution random number distribution.
2549             *
2550             * The formula for the normal probability mass function is
2551             * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$
2552             */
2553             template
2554             class chi_squared_distribution
2555             {
2556             static_assert(std::is_floating_point<_RealType>::value,
2557             "template argument not a floating point type");
2558              
2559             public:
2560             /** The type of the range of the distribution. */
2561             typedef _RealType result_type;
2562             /** Parameter type. */
2563             struct param_type
2564             {
2565             typedef chi_squared_distribution<_RealType> distribution_type;
2566              
2567             explicit
2568             param_type(_RealType __n = _RealType(1))
2569             : _M_n(__n)
2570             { }
2571              
2572             _RealType
2573             n() const
2574             { return _M_n; }
2575              
2576             friend bool
2577             operator==(const param_type& __p1, const param_type& __p2)
2578             { return __p1._M_n == __p2._M_n; }
2579              
2580             private:
2581             _RealType _M_n;
2582             };
2583              
2584             explicit
2585             chi_squared_distribution(_RealType __n = _RealType(1))
2586             : _M_param(__n), _M_gd(__n / 2)
2587             { }
2588              
2589             explicit
2590             chi_squared_distribution(const param_type& __p)
2591             : _M_param(__p), _M_gd(__p.n() / 2)
2592             { }
2593              
2594             /**
2595             * @brief Resets the distribution state.
2596             */
2597             void
2598             reset()
2599             { _M_gd.reset(); }
2600              
2601             /**
2602             *
2603             */
2604             _RealType
2605             n() const
2606             { return _M_param.n(); }
2607              
2608             /**
2609             * @brief Returns the parameter set of the distribution.
2610             */
2611             param_type
2612             param() const
2613             { return _M_param; }
2614              
2615             /**
2616             * @brief Sets the parameter set of the distribution.
2617             * @param __param The new parameter set of the distribution.
2618             */
2619             void
2620             param(const param_type& __param)
2621             { _M_param = __param; }
2622              
2623             /**
2624             * @brief Returns the greatest lower bound value of the distribution.
2625             */
2626             result_type
2627             min() const
2628             { return result_type(0); }
2629              
2630             /**
2631             * @brief Returns the least upper bound value of the distribution.
2632             */
2633             result_type
2634             max() const
2635             { return std::numeric_limits::max(); }
2636              
2637             /**
2638             * @brief Generating functions.
2639             */
2640             template
2641             result_type
2642             operator()(_UniformRandomNumberGenerator& __urng)
2643             { return 2 * _M_gd(__urng); }
2644              
2645             template
2646             result_type
2647             operator()(_UniformRandomNumberGenerator& __urng,
2648             const param_type& __p)
2649             {
2650             typedef typename std::gamma_distribution::param_type
2651             param_type;
2652             return 2 * _M_gd(__urng, param_type(__p.n() / 2));
2653             }
2654              
2655             template
2656             typename _UniformRandomNumberGenerator>
2657             void
2658             __generate(_ForwardIterator __f, _ForwardIterator __t,
2659             _UniformRandomNumberGenerator& __urng)
2660             { this->__generate_impl(__f, __t, __urng); }
2661              
2662             template
2663             typename _UniformRandomNumberGenerator>
2664             void
2665             __generate(_ForwardIterator __f, _ForwardIterator __t,
2666             _UniformRandomNumberGenerator& __urng,
2667             const param_type& __p)
2668             { typename std::gamma_distribution::param_type
2669             __p2(__p.n() / 2);
2670             this->__generate_impl(__f, __t, __urng, __p2); }
2671              
2672             template
2673             void
2674             __generate(result_type* __f, result_type* __t,
2675             _UniformRandomNumberGenerator& __urng)
2676             { this->__generate_impl(__f, __t, __urng); }
2677              
2678             template
2679             void
2680             __generate(result_type* __f, result_type* __t,
2681             _UniformRandomNumberGenerator& __urng,
2682             const param_type& __p)
2683             { typename std::gamma_distribution::param_type
2684             __p2(__p.n() / 2);
2685             this->__generate_impl(__f, __t, __urng, __p2); }
2686              
2687             /**
2688             * @brief Return true if two Chi-squared distributions have
2689             * the same parameters and the sequences that would be
2690             * generated are equal.
2691             */
2692             friend bool
2693             operator==(const chi_squared_distribution& __d1,
2694             const chi_squared_distribution& __d2)
2695             { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; }
2696              
2697             /**
2698             * @brief Inserts a %chi_squared_distribution random number distribution
2699             * @p __x into the output stream @p __os.
2700             *
2701             * @param __os An output stream.
2702             * @param __x A %chi_squared_distribution random number distribution.
2703             *
2704             * @returns The output stream with the state of @p __x inserted or in
2705             * an error state.
2706             */
2707             template
2708             friend std::basic_ostream<_CharT, _Traits>&
2709             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2710             const std::chi_squared_distribution<_RealType1>& __x);
2711              
2712             /**
2713             * @brief Extracts a %chi_squared_distribution random number distribution
2714             * @p __x from the input stream @p __is.
2715             *
2716             * @param __is An input stream.
2717             * @param __x A %chi_squared_distribution random number
2718             * generator engine.
2719             *
2720             * @returns The input stream with @p __x extracted or in an error state.
2721             */
2722             template
2723             friend std::basic_istream<_CharT, _Traits>&
2724             operator>>(std::basic_istream<_CharT, _Traits>& __is,
2725             std::chi_squared_distribution<_RealType1>& __x);
2726              
2727             private:
2728             template
2729             typename _UniformRandomNumberGenerator>
2730             void
2731             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2732             _UniformRandomNumberGenerator& __urng);
2733              
2734             template
2735             typename _UniformRandomNumberGenerator>
2736             void
2737             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2738             _UniformRandomNumberGenerator& __urng,
2739             const typename
2740             std::gamma_distribution::param_type& __p);
2741              
2742             param_type _M_param;
2743              
2744             std::gamma_distribution _M_gd;
2745             };
2746              
2747             /**
2748             * @brief Return true if two Chi-squared distributions are different.
2749             */
2750             template
2751             inline bool
2752             operator!=(const std::chi_squared_distribution<_RealType>& __d1,
2753             const std::chi_squared_distribution<_RealType>& __d2)
2754             { return !(__d1 == __d2); }
2755              
2756              
2757             /**
2758             * @brief A cauchy_distribution random number distribution.
2759             *
2760             * The formula for the normal probability mass function is
2761             * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$
2762             */
2763             template
2764             class cauchy_distribution
2765             {
2766             static_assert(std::is_floating_point<_RealType>::value,
2767             "template argument not a floating point type");
2768              
2769             public:
2770             /** The type of the range of the distribution. */
2771             typedef _RealType result_type;
2772             /** Parameter type. */
2773             struct param_type
2774             {
2775             typedef cauchy_distribution<_RealType> distribution_type;
2776              
2777             explicit
2778             param_type(_RealType __a = _RealType(0),
2779             _RealType __b = _RealType(1))
2780             : _M_a(__a), _M_b(__b)
2781             { }
2782              
2783             _RealType
2784             a() const
2785             { return _M_a; }
2786              
2787             _RealType
2788             b() const
2789             { return _M_b; }
2790              
2791             friend bool
2792             operator==(const param_type& __p1, const param_type& __p2)
2793             { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
2794              
2795             private:
2796             _RealType _M_a;
2797             _RealType _M_b;
2798             };
2799              
2800             explicit
2801             cauchy_distribution(_RealType __a = _RealType(0),
2802             _RealType __b = _RealType(1))
2803             : _M_param(__a, __b)
2804             { }
2805              
2806             explicit
2807             cauchy_distribution(const param_type& __p)
2808             : _M_param(__p)
2809             { }
2810              
2811             /**
2812             * @brief Resets the distribution state.
2813             */
2814             void
2815             reset()
2816             { }
2817              
2818             /**
2819             *
2820             */
2821             _RealType
2822             a() const
2823             { return _M_param.a(); }
2824              
2825             _RealType
2826             b() const
2827             { return _M_param.b(); }
2828              
2829             /**
2830             * @brief Returns the parameter set of the distribution.
2831             */
2832             param_type
2833             param() const
2834             { return _M_param; }
2835              
2836             /**
2837             * @brief Sets the parameter set of the distribution.
2838             * @param __param The new parameter set of the distribution.
2839             */
2840             void
2841             param(const param_type& __param)
2842             { _M_param = __param; }
2843              
2844             /**
2845             * @brief Returns the greatest lower bound value of the distribution.
2846             */
2847             result_type
2848             min() const
2849             { return std::numeric_limits::lowest(); }
2850              
2851             /**
2852             * @brief Returns the least upper bound value of the distribution.
2853             */
2854             result_type
2855             max() const
2856             { return std::numeric_limits::max(); }
2857              
2858             /**
2859             * @brief Generating functions.
2860             */
2861             template
2862             result_type
2863             operator()(_UniformRandomNumberGenerator& __urng)
2864             { return this->operator()(__urng, _M_param); }
2865              
2866             template
2867             result_type
2868             operator()(_UniformRandomNumberGenerator& __urng,
2869             const param_type& __p);
2870              
2871             template
2872             typename _UniformRandomNumberGenerator>
2873             void
2874             __generate(_ForwardIterator __f, _ForwardIterator __t,
2875             _UniformRandomNumberGenerator& __urng)
2876             { this->__generate(__f, __t, __urng, _M_param); }
2877              
2878             template
2879             typename _UniformRandomNumberGenerator>
2880             void
2881             __generate(_ForwardIterator __f, _ForwardIterator __t,
2882             _UniformRandomNumberGenerator& __urng,
2883             const param_type& __p)
2884             { this->__generate_impl(__f, __t, __urng, __p); }
2885              
2886             template
2887             void
2888             __generate(result_type* __f, result_type* __t,
2889             _UniformRandomNumberGenerator& __urng,
2890             const param_type& __p)
2891             { this->__generate_impl(__f, __t, __urng, __p); }
2892              
2893             /**
2894             * @brief Return true if two Cauchy distributions have
2895             * the same parameters.
2896             */
2897             friend bool
2898             operator==(const cauchy_distribution& __d1,
2899             const cauchy_distribution& __d2)
2900             { return __d1._M_param == __d2._M_param; }
2901              
2902             private:
2903             template
2904             typename _UniformRandomNumberGenerator>
2905             void
2906             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2907             _UniformRandomNumberGenerator& __urng,
2908             const param_type& __p);
2909              
2910             param_type _M_param;
2911             };
2912              
2913             /**
2914             * @brief Return true if two Cauchy distributions have
2915             * different parameters.
2916             */
2917             template
2918             inline bool
2919             operator!=(const std::cauchy_distribution<_RealType>& __d1,
2920             const std::cauchy_distribution<_RealType>& __d2)
2921             { return !(__d1 == __d2); }
2922              
2923             /**
2924             * @brief Inserts a %cauchy_distribution random number distribution
2925             * @p __x into the output stream @p __os.
2926             *
2927             * @param __os An output stream.
2928             * @param __x A %cauchy_distribution random number distribution.
2929             *
2930             * @returns The output stream with the state of @p __x inserted or in
2931             * an error state.
2932             */
2933             template
2934             std::basic_ostream<_CharT, _Traits>&
2935             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2936             const std::cauchy_distribution<_RealType>& __x);
2937              
2938             /**
2939             * @brief Extracts a %cauchy_distribution random number distribution
2940             * @p __x from the input stream @p __is.
2941             *
2942             * @param __is An input stream.
2943             * @param __x A %cauchy_distribution random number
2944             * generator engine.
2945             *
2946             * @returns The input stream with @p __x extracted or in an error state.
2947             */
2948             template
2949             std::basic_istream<_CharT, _Traits>&
2950             operator>>(std::basic_istream<_CharT, _Traits>& __is,
2951             std::cauchy_distribution<_RealType>& __x);
2952              
2953              
2954             /**
2955             * @brief A fisher_f_distribution random number distribution.
2956             *
2957             * The formula for the normal probability mass function is
2958             * @f[
2959             * p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)}
2960             * (\frac{m}{n})^{m/2} x^{(m/2)-1}
2961             * (1 + \frac{mx}{n})^{-(m+n)/2}
2962             * @f]
2963             */
2964             template
2965             class fisher_f_distribution
2966             {
2967             static_assert(std::is_floating_point<_RealType>::value,
2968             "template argument not a floating point type");
2969              
2970             public:
2971             /** The type of the range of the distribution. */
2972             typedef _RealType result_type;
2973             /** Parameter type. */
2974             struct param_type
2975             {
2976             typedef fisher_f_distribution<_RealType> distribution_type;
2977              
2978             explicit
2979             param_type(_RealType __m = _RealType(1),
2980             _RealType __n = _RealType(1))
2981             : _M_m(__m), _M_n(__n)
2982             { }
2983              
2984             _RealType
2985             m() const
2986             { return _M_m; }
2987              
2988             _RealType
2989             n() const
2990             { return _M_n; }
2991              
2992             friend bool
2993             operator==(const param_type& __p1, const param_type& __p2)
2994             { return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; }
2995              
2996             private:
2997             _RealType _M_m;
2998             _RealType _M_n;
2999             };
3000              
3001             explicit
3002             fisher_f_distribution(_RealType __m = _RealType(1),
3003             _RealType __n = _RealType(1))
3004             : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2)
3005             { }
3006              
3007             explicit
3008             fisher_f_distribution(const param_type& __p)
3009             : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2)
3010             { }
3011              
3012             /**
3013             * @brief Resets the distribution state.
3014             */
3015             void
3016             reset()
3017             {
3018             _M_gd_x.reset();
3019             _M_gd_y.reset();
3020             }
3021              
3022             /**
3023             *
3024             */
3025             _RealType
3026             m() const
3027             { return _M_param.m(); }
3028              
3029             _RealType
3030             n() const
3031             { return _M_param.n(); }
3032              
3033             /**
3034             * @brief Returns the parameter set of the distribution.
3035             */
3036             param_type
3037             param() const
3038             { return _M_param; }
3039              
3040             /**
3041             * @brief Sets the parameter set of the distribution.
3042             * @param __param The new parameter set of the distribution.
3043             */
3044             void
3045             param(const param_type& __param)
3046             { _M_param = __param; }
3047              
3048             /**
3049             * @brief Returns the greatest lower bound value of the distribution.
3050             */
3051             result_type
3052             min() const
3053             { return result_type(0); }
3054              
3055             /**
3056             * @brief Returns the least upper bound value of the distribution.
3057             */
3058             result_type
3059             max() const
3060             { return std::numeric_limits::max(); }
3061              
3062             /**
3063             * @brief Generating functions.
3064             */
3065             template
3066             result_type
3067             operator()(_UniformRandomNumberGenerator& __urng)
3068             { return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); }
3069              
3070             template
3071             result_type
3072             operator()(_UniformRandomNumberGenerator& __urng,
3073             const param_type& __p)
3074             {
3075             typedef typename std::gamma_distribution::param_type
3076             param_type;
3077             return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n())
3078             / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m()));
3079             }
3080              
3081             template
3082             typename _UniformRandomNumberGenerator>
3083             void
3084             __generate(_ForwardIterator __f, _ForwardIterator __t,
3085             _UniformRandomNumberGenerator& __urng)
3086             { this->__generate_impl(__f, __t, __urng); }
3087              
3088             template
3089             typename _UniformRandomNumberGenerator>
3090             void
3091             __generate(_ForwardIterator __f, _ForwardIterator __t,
3092             _UniformRandomNumberGenerator& __urng,
3093             const param_type& __p)
3094             { this->__generate_impl(__f, __t, __urng, __p); }
3095              
3096             template
3097             void
3098             __generate(result_type* __f, result_type* __t,
3099             _UniformRandomNumberGenerator& __urng)
3100             { this->__generate_impl(__f, __t, __urng); }
3101              
3102             template
3103             void
3104             __generate(result_type* __f, result_type* __t,
3105             _UniformRandomNumberGenerator& __urng,
3106             const param_type& __p)
3107             { this->__generate_impl(__f, __t, __urng, __p); }
3108              
3109             /**
3110             * @brief Return true if two Fisher f distributions have
3111             * the same parameters and the sequences that would
3112             * be generated are equal.
3113             */
3114             friend bool
3115             operator==(const fisher_f_distribution& __d1,
3116             const fisher_f_distribution& __d2)
3117             { return (__d1._M_param == __d2._M_param
3118             && __d1._M_gd_x == __d2._M_gd_x
3119             && __d1._M_gd_y == __d2._M_gd_y); }
3120              
3121             /**
3122             * @brief Inserts a %fisher_f_distribution random number distribution
3123             * @p __x into the output stream @p __os.
3124             *
3125             * @param __os An output stream.
3126             * @param __x A %fisher_f_distribution random number distribution.
3127             *
3128             * @returns The output stream with the state of @p __x inserted or in
3129             * an error state.
3130             */
3131             template
3132             friend std::basic_ostream<_CharT, _Traits>&
3133             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3134             const std::fisher_f_distribution<_RealType1>& __x);
3135              
3136             /**
3137             * @brief Extracts a %fisher_f_distribution random number distribution
3138             * @p __x from the input stream @p __is.
3139             *
3140             * @param __is An input stream.
3141             * @param __x A %fisher_f_distribution random number
3142             * generator engine.
3143             *
3144             * @returns The input stream with @p __x extracted or in an error state.
3145             */
3146             template
3147             friend std::basic_istream<_CharT, _Traits>&
3148             operator>>(std::basic_istream<_CharT, _Traits>& __is,
3149             std::fisher_f_distribution<_RealType1>& __x);
3150              
3151             private:
3152             template
3153             typename _UniformRandomNumberGenerator>
3154             void
3155             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3156             _UniformRandomNumberGenerator& __urng);
3157              
3158             template
3159             typename _UniformRandomNumberGenerator>
3160             void
3161             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3162             _UniformRandomNumberGenerator& __urng,
3163             const param_type& __p);
3164              
3165             param_type _M_param;
3166              
3167             std::gamma_distribution _M_gd_x, _M_gd_y;
3168             };
3169              
3170             /**
3171             * @brief Return true if two Fisher f distributions are different.
3172             */
3173             template
3174             inline bool
3175             operator!=(const std::fisher_f_distribution<_RealType>& __d1,
3176             const std::fisher_f_distribution<_RealType>& __d2)
3177             { return !(__d1 == __d2); }
3178              
3179             /**
3180             * @brief A student_t_distribution random number distribution.
3181             *
3182             * The formula for the normal probability mass function is:
3183             * @f[
3184             * p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)}
3185             * (1 + \frac{x^2}{n}) ^{-(n+1)/2}
3186             * @f]
3187             */
3188             template
3189             class student_t_distribution
3190             {
3191             static_assert(std::is_floating_point<_RealType>::value,
3192             "template argument not a floating point type");
3193              
3194             public:
3195             /** The type of the range of the distribution. */
3196             typedef _RealType result_type;
3197             /** Parameter type. */
3198             struct param_type
3199             {
3200             typedef student_t_distribution<_RealType> distribution_type;
3201              
3202             explicit
3203             param_type(_RealType __n = _RealType(1))
3204             : _M_n(__n)
3205             { }
3206              
3207             _RealType
3208             n() const
3209             { return _M_n; }
3210              
3211             friend bool
3212             operator==(const param_type& __p1, const param_type& __p2)
3213             { return __p1._M_n == __p2._M_n; }
3214              
3215             private:
3216             _RealType _M_n;
3217             };
3218              
3219             explicit
3220             student_t_distribution(_RealType __n = _RealType(1))
3221             : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2)
3222             { }
3223              
3224             explicit
3225             student_t_distribution(const param_type& __p)
3226             : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2)
3227             { }
3228              
3229             /**
3230             * @brief Resets the distribution state.
3231             */
3232             void
3233             reset()
3234             {
3235             _M_nd.reset();
3236             _M_gd.reset();
3237             }
3238              
3239             /**
3240             *
3241             */
3242             _RealType
3243             n() const
3244             { return _M_param.n(); }
3245              
3246             /**
3247             * @brief Returns the parameter set of the distribution.
3248             */
3249             param_type
3250             param() const
3251             { return _M_param; }
3252              
3253             /**
3254             * @brief Sets the parameter set of the distribution.
3255             * @param __param The new parameter set of the distribution.
3256             */
3257             void
3258             param(const param_type& __param)
3259             { _M_param = __param; }
3260              
3261             /**
3262             * @brief Returns the greatest lower bound value of the distribution.
3263             */
3264             result_type
3265             min() const
3266             { return std::numeric_limits::lowest(); }
3267              
3268             /**
3269             * @brief Returns the least upper bound value of the distribution.
3270             */
3271             result_type
3272             max() const
3273             { return std::numeric_limits::max(); }
3274              
3275             /**
3276             * @brief Generating functions.
3277             */
3278             template
3279             result_type
3280             operator()(_UniformRandomNumberGenerator& __urng)
3281             { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); }
3282              
3283             template
3284             result_type
3285             operator()(_UniformRandomNumberGenerator& __urng,
3286             const param_type& __p)
3287             {
3288             typedef typename std::gamma_distribution::param_type
3289             param_type;
3290            
3291             const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2));
3292             return _M_nd(__urng) * std::sqrt(__p.n() / __g);
3293             }
3294              
3295             template
3296             typename _UniformRandomNumberGenerator>
3297             void
3298             __generate(_ForwardIterator __f, _ForwardIterator __t,
3299             _UniformRandomNumberGenerator& __urng)
3300             { this->__generate_impl(__f, __t, __urng); }
3301              
3302             template
3303             typename _UniformRandomNumberGenerator>
3304             void
3305             __generate(_ForwardIterator __f, _ForwardIterator __t,
3306             _UniformRandomNumberGenerator& __urng,
3307             const param_type& __p)
3308             { this->__generate_impl(__f, __t, __urng, __p); }
3309              
3310             template
3311             void
3312             __generate(result_type* __f, result_type* __t,
3313             _UniformRandomNumberGenerator& __urng)
3314             { this->__generate_impl(__f, __t, __urng); }
3315              
3316             template
3317             void
3318             __generate(result_type* __f, result_type* __t,
3319             _UniformRandomNumberGenerator& __urng,
3320             const param_type& __p)
3321             { this->__generate_impl(__f, __t, __urng, __p); }
3322              
3323             /**
3324             * @brief Return true if two Student t distributions have
3325             * the same parameters and the sequences that would
3326             * be generated are equal.
3327             */
3328             friend bool
3329             operator==(const student_t_distribution& __d1,
3330             const student_t_distribution& __d2)
3331             { return (__d1._M_param == __d2._M_param
3332             && __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); }
3333              
3334             /**
3335             * @brief Inserts a %student_t_distribution random number distribution
3336             * @p __x into the output stream @p __os.
3337             *
3338             * @param __os An output stream.
3339             * @param __x A %student_t_distribution random number distribution.
3340             *
3341             * @returns The output stream with the state of @p __x inserted or in
3342             * an error state.
3343             */
3344             template
3345             friend std::basic_ostream<_CharT, _Traits>&
3346             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3347             const std::student_t_distribution<_RealType1>& __x);
3348              
3349             /**
3350             * @brief Extracts a %student_t_distribution random number distribution
3351             * @p __x from the input stream @p __is.
3352             *
3353             * @param __is An input stream.
3354             * @param __x A %student_t_distribution random number
3355             * generator engine.
3356             *
3357             * @returns The input stream with @p __x extracted or in an error state.
3358             */
3359             template
3360             friend std::basic_istream<_CharT, _Traits>&
3361             operator>>(std::basic_istream<_CharT, _Traits>& __is,
3362             std::student_t_distribution<_RealType1>& __x);
3363              
3364             private:
3365             template
3366             typename _UniformRandomNumberGenerator>
3367             void
3368             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3369             _UniformRandomNumberGenerator& __urng);
3370             template
3371             typename _UniformRandomNumberGenerator>
3372             void
3373             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3374             _UniformRandomNumberGenerator& __urng,
3375             const param_type& __p);
3376              
3377             param_type _M_param;
3378              
3379             std::normal_distribution _M_nd;
3380             std::gamma_distribution _M_gd;
3381             };
3382              
3383             /**
3384             * @brief Return true if two Student t distributions are different.
3385             */
3386             template
3387             inline bool
3388             operator!=(const std::student_t_distribution<_RealType>& __d1,
3389             const std::student_t_distribution<_RealType>& __d2)
3390             { return !(__d1 == __d2); }
3391              
3392              
3393             /* @} */ // group random_distributions_normal
3394              
3395             /**
3396             * @addtogroup random_distributions_bernoulli Bernoulli Distributions
3397             * @ingroup random_distributions
3398             * @{
3399             */
3400              
3401             /**
3402             * @brief A Bernoulli random number distribution.
3403             *
3404             * Generates a sequence of true and false values with likelihood @f$p@f$
3405             * that true will come up and @f$(1 - p)@f$ that false will appear.
3406             */
3407             class bernoulli_distribution
3408             {
3409             public:
3410             /** The type of the range of the distribution. */
3411             typedef bool result_type;
3412             /** Parameter type. */
3413             struct param_type
3414             {
3415             typedef bernoulli_distribution distribution_type;
3416              
3417             explicit
3418             param_type(double __p = 0.5)
3419             : _M_p(__p)
3420             {
3421             _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
3422             }
3423              
3424             double
3425             p() const
3426             { return _M_p; }
3427              
3428             friend bool
3429             operator==(const param_type& __p1, const param_type& __p2)
3430             { return __p1._M_p == __p2._M_p; }
3431              
3432             private:
3433             double _M_p;
3434             };
3435              
3436             public:
3437             /**
3438             * @brief Constructs a Bernoulli distribution with likelihood @p p.
3439             *
3440             * @param __p [IN] The likelihood of a true result being returned.
3441             * Must be in the interval @f$[0, 1]@f$.
3442             */
3443             explicit
3444             bernoulli_distribution(double __p = 0.5)
3445             : _M_param(__p)
3446             { }
3447              
3448             explicit
3449             bernoulli_distribution(const param_type& __p)
3450             : _M_param(__p)
3451             { }
3452              
3453             /**
3454             * @brief Resets the distribution state.
3455             *
3456             * Does nothing for a Bernoulli distribution.
3457             */
3458             void
3459             reset() { }
3460              
3461             /**
3462             * @brief Returns the @p p parameter of the distribution.
3463             */
3464             double
3465             p() const
3466             { return _M_param.p(); }
3467              
3468             /**
3469             * @brief Returns the parameter set of the distribution.
3470             */
3471             param_type
3472             param() const
3473             { return _M_param; }
3474              
3475             /**
3476             * @brief Sets the parameter set of the distribution.
3477             * @param __param The new parameter set of the distribution.
3478             */
3479             void
3480             param(const param_type& __param)
3481             { _M_param = __param; }
3482              
3483             /**
3484             * @brief Returns the greatest lower bound value of the distribution.
3485             */
3486             result_type
3487             min() const
3488             { return std::numeric_limits::min(); }
3489              
3490             /**
3491             * @brief Returns the least upper bound value of the distribution.
3492             */
3493             result_type
3494             max() const
3495             { return std::numeric_limits::max(); }
3496              
3497             /**
3498             * @brief Generating functions.
3499             */
3500             template
3501             result_type
3502             operator()(_UniformRandomNumberGenerator& __urng)
3503             { return this->operator()(__urng, _M_param); }
3504              
3505             template
3506             result_type
3507             operator()(_UniformRandomNumberGenerator& __urng,
3508             const param_type& __p)
3509             {
3510             __detail::_Adaptor<_UniformRandomNumberGenerator, double>
3511             __aurng(__urng);
3512 0 0         if ((__aurng() - __aurng.min())
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3513             < __p.p() * (__aurng.max() - __aurng.min()))
3514             return true;
3515             return false;
3516             }
3517              
3518             template
3519             typename _UniformRandomNumberGenerator>
3520             void
3521             __generate(_ForwardIterator __f, _ForwardIterator __t,
3522             _UniformRandomNumberGenerator& __urng)
3523             { this->__generate(__f, __t, __urng, _M_param); }
3524              
3525             template
3526             typename _UniformRandomNumberGenerator>
3527             void
3528             __generate(_ForwardIterator __f, _ForwardIterator __t,
3529             _UniformRandomNumberGenerator& __urng, const param_type& __p)
3530             { this->__generate_impl(__f, __t, __urng, __p); }
3531              
3532             template
3533             void
3534             __generate(result_type* __f, result_type* __t,
3535             _UniformRandomNumberGenerator& __urng,
3536             const param_type& __p)
3537             { this->__generate_impl(__f, __t, __urng, __p); }
3538              
3539             /**
3540             * @brief Return true if two Bernoulli distributions have
3541             * the same parameters.
3542             */
3543             friend bool
3544             operator==(const bernoulli_distribution& __d1,
3545             const bernoulli_distribution& __d2)
3546             { return __d1._M_param == __d2._M_param; }
3547              
3548             private:
3549             template
3550             typename _UniformRandomNumberGenerator>
3551             void
3552             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3553             _UniformRandomNumberGenerator& __urng,
3554             const param_type& __p);
3555              
3556             param_type _M_param;
3557             };
3558              
3559             /**
3560             * @brief Return true if two Bernoulli distributions have
3561             * different parameters.
3562             */
3563             inline bool
3564             operator!=(const std::bernoulli_distribution& __d1,
3565             const std::bernoulli_distribution& __d2)
3566             { return !(__d1 == __d2); }
3567              
3568             /**
3569             * @brief Inserts a %bernoulli_distribution random number distribution
3570             * @p __x into the output stream @p __os.
3571             *
3572             * @param __os An output stream.
3573             * @param __x A %bernoulli_distribution random number distribution.
3574             *
3575             * @returns The output stream with the state of @p __x inserted or in
3576             * an error state.
3577             */
3578             template
3579             std::basic_ostream<_CharT, _Traits>&
3580             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3581             const std::bernoulli_distribution& __x);
3582              
3583             /**
3584             * @brief Extracts a %bernoulli_distribution random number distribution
3585             * @p __x from the input stream @p __is.
3586             *
3587             * @param __is An input stream.
3588             * @param __x A %bernoulli_distribution random number generator engine.
3589             *
3590             * @returns The input stream with @p __x extracted or in an error state.
3591             */
3592             template
3593             std::basic_istream<_CharT, _Traits>&
3594             operator>>(std::basic_istream<_CharT, _Traits>& __is,
3595             std::bernoulli_distribution& __x)
3596             {
3597             double __p;
3598             __is >> __p;
3599             __x.param(bernoulli_distribution::param_type(__p));
3600             return __is;
3601             }
3602              
3603              
3604             /**
3605             * @brief A discrete binomial random number distribution.
3606             *
3607             * The formula for the binomial probability density function is
3608             * @f$p(i|t,p) = \binom{t}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
3609             * and @f$p@f$ are the parameters of the distribution.
3610             */
3611             template
3612             class binomial_distribution
3613             {
3614             static_assert(std::is_integral<_IntType>::value,
3615             "template argument not an integral type");
3616              
3617             public:
3618             /** The type of the range of the distribution. */
3619             typedef _IntType result_type;
3620             /** Parameter type. */
3621             struct param_type
3622             {
3623             typedef binomial_distribution<_IntType> distribution_type;
3624             friend class binomial_distribution<_IntType>;
3625              
3626             explicit
3627             param_type(_IntType __t = _IntType(1), double __p = 0.5)
3628             : _M_t(__t), _M_p(__p)
3629             {
3630             _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0))
3631             && (_M_p >= 0.0)
3632             && (_M_p <= 1.0));
3633             _M_initialize();
3634             }
3635              
3636             _IntType
3637             t() const
3638             { return _M_t; }
3639              
3640             double
3641             p() const
3642             { return _M_p; }
3643              
3644             friend bool
3645             operator==(const param_type& __p1, const param_type& __p2)
3646             { return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; }
3647              
3648             private:
3649             void
3650             _M_initialize();
3651              
3652             _IntType _M_t;
3653             double _M_p;
3654              
3655             double _M_q;
3656             #if _GLIBCXX_USE_C99_MATH_TR1
3657             double _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
3658             _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
3659             #endif
3660             bool _M_easy;
3661             };
3662              
3663             // constructors and member function
3664             explicit
3665             binomial_distribution(_IntType __t = _IntType(1),
3666             double __p = 0.5)
3667             : _M_param(__t, __p), _M_nd()
3668             { }
3669              
3670             explicit
3671             binomial_distribution(const param_type& __p)
3672             : _M_param(__p), _M_nd()
3673             { }
3674              
3675             /**
3676             * @brief Resets the distribution state.
3677             */
3678             void
3679             reset()
3680             { _M_nd.reset(); }
3681              
3682             /**
3683             * @brief Returns the distribution @p t parameter.
3684             */
3685             _IntType
3686             t() const
3687             { return _M_param.t(); }
3688              
3689             /**
3690             * @brief Returns the distribution @p p parameter.
3691             */
3692             double
3693             p() const
3694             { return _M_param.p(); }
3695              
3696             /**
3697             * @brief Returns the parameter set of the distribution.
3698             */
3699             param_type
3700             param() const
3701             { return _M_param; }
3702              
3703             /**
3704             * @brief Sets the parameter set of the distribution.
3705             * @param __param The new parameter set of the distribution.
3706             */
3707             void
3708             param(const param_type& __param)
3709             { _M_param = __param; }
3710              
3711             /**
3712             * @brief Returns the greatest lower bound value of the distribution.
3713             */
3714             result_type
3715             min() const
3716             { return 0; }
3717              
3718             /**
3719             * @brief Returns the least upper bound value of the distribution.
3720             */
3721             result_type
3722             max() const
3723             { return _M_param.t(); }
3724              
3725             /**
3726             * @brief Generating functions.
3727             */
3728             template
3729             result_type
3730             operator()(_UniformRandomNumberGenerator& __urng)
3731             { return this->operator()(__urng, _M_param); }
3732              
3733             template
3734             result_type
3735             operator()(_UniformRandomNumberGenerator& __urng,
3736             const param_type& __p);
3737              
3738             template
3739             typename _UniformRandomNumberGenerator>
3740             void
3741             __generate(_ForwardIterator __f, _ForwardIterator __t,
3742             _UniformRandomNumberGenerator& __urng)
3743             { this->__generate(__f, __t, __urng, _M_param); }
3744              
3745             template
3746             typename _UniformRandomNumberGenerator>
3747             void
3748             __generate(_ForwardIterator __f, _ForwardIterator __t,
3749             _UniformRandomNumberGenerator& __urng,
3750             const param_type& __p)
3751             { this->__generate_impl(__f, __t, __urng, __p); }
3752              
3753             template
3754             void
3755             __generate(result_type* __f, result_type* __t,
3756             _UniformRandomNumberGenerator& __urng,
3757             const param_type& __p)
3758             { this->__generate_impl(__f, __t, __urng, __p); }
3759              
3760             /**
3761             * @brief Return true if two binomial distributions have
3762             * the same parameters and the sequences that would
3763             * be generated are equal.
3764             */
3765             friend bool
3766             operator==(const binomial_distribution& __d1,
3767             const binomial_distribution& __d2)
3768             #ifdef _GLIBCXX_USE_C99_MATH_TR1
3769             { return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; }
3770             #else
3771             { return __d1._M_param == __d2._M_param; }
3772             #endif
3773              
3774             /**
3775             * @brief Inserts a %binomial_distribution random number distribution
3776             * @p __x into the output stream @p __os.
3777             *
3778             * @param __os An output stream.
3779             * @param __x A %binomial_distribution random number distribution.
3780             *
3781             * @returns The output stream with the state of @p __x inserted or in
3782             * an error state.
3783             */
3784             template
3785             typename _CharT, typename _Traits>
3786             friend std::basic_ostream<_CharT, _Traits>&
3787             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3788             const std::binomial_distribution<_IntType1>& __x);
3789              
3790             /**
3791             * @brief Extracts a %binomial_distribution random number distribution
3792             * @p __x from the input stream @p __is.
3793             *
3794             * @param __is An input stream.
3795             * @param __x A %binomial_distribution random number generator engine.
3796             *
3797             * @returns The input stream with @p __x extracted or in an error
3798             * state.
3799             */
3800             template
3801             typename _CharT, typename _Traits>
3802             friend std::basic_istream<_CharT, _Traits>&
3803             operator>>(std::basic_istream<_CharT, _Traits>& __is,
3804             std::binomial_distribution<_IntType1>& __x);
3805              
3806             private:
3807             template
3808             typename _UniformRandomNumberGenerator>
3809             void
3810             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3811             _UniformRandomNumberGenerator& __urng,
3812             const param_type& __p);
3813              
3814             template
3815             result_type
3816             _M_waiting(_UniformRandomNumberGenerator& __urng,
3817             _IntType __t, double __q);
3818              
3819             param_type _M_param;
3820              
3821             // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
3822             std::normal_distribution _M_nd;
3823             };
3824              
3825             /**
3826             * @brief Return true if two binomial distributions are different.
3827             */
3828             template
3829             inline bool
3830             operator!=(const std::binomial_distribution<_IntType>& __d1,
3831             const std::binomial_distribution<_IntType>& __d2)
3832             { return !(__d1 == __d2); }
3833              
3834              
3835             /**
3836             * @brief A discrete geometric random number distribution.
3837             *
3838             * The formula for the geometric probability density function is
3839             * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
3840             * distribution.
3841             */
3842             template
3843             class geometric_distribution
3844             {
3845             static_assert(std::is_integral<_IntType>::value,
3846             "template argument not an integral type");
3847              
3848             public:
3849             /** The type of the range of the distribution. */
3850             typedef _IntType result_type;
3851             /** Parameter type. */
3852             struct param_type
3853             {
3854             typedef geometric_distribution<_IntType> distribution_type;
3855             friend class geometric_distribution<_IntType>;
3856              
3857             explicit
3858             param_type(double __p = 0.5)
3859             : _M_p(__p)
3860             {
3861             _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
3862             _M_initialize();
3863             }
3864              
3865             double
3866             p() const
3867             { return _M_p; }
3868              
3869             friend bool
3870             operator==(const param_type& __p1, const param_type& __p2)
3871             { return __p1._M_p == __p2._M_p; }
3872              
3873             private:
3874             void
3875             _M_initialize()
3876             { _M_log_1_p = std::log(1.0 - _M_p); }
3877              
3878             double _M_p;
3879              
3880             double _M_log_1_p;
3881             };
3882              
3883             // constructors and member function
3884             explicit
3885             geometric_distribution(double __p = 0.5)
3886             : _M_param(__p)
3887             { }
3888              
3889             explicit
3890             geometric_distribution(const param_type& __p)
3891             : _M_param(__p)
3892             { }
3893              
3894             /**
3895             * @brief Resets the distribution state.
3896             *
3897             * Does nothing for the geometric distribution.
3898             */
3899             void
3900             reset() { }
3901              
3902             /**
3903             * @brief Returns the distribution parameter @p p.
3904             */
3905             double
3906             p() const
3907             { return _M_param.p(); }
3908              
3909             /**
3910             * @brief Returns the parameter set of the distribution.
3911             */
3912             param_type
3913             param() const
3914             { return _M_param; }
3915              
3916             /**
3917             * @brief Sets the parameter set of the distribution.
3918             * @param __param The new parameter set of the distribution.
3919             */
3920             void
3921             param(const param_type& __param)
3922             { _M_param = __param; }
3923              
3924             /**
3925             * @brief Returns the greatest lower bound value of the distribution.
3926             */
3927             result_type
3928             min() const
3929             { return 0; }
3930              
3931             /**
3932             * @brief Returns the least upper bound value of the distribution.
3933             */
3934             result_type
3935             max() const
3936             { return std::numeric_limits::max(); }
3937              
3938             /**
3939             * @brief Generating functions.
3940             */
3941             template
3942             result_type
3943             operator()(_UniformRandomNumberGenerator& __urng)
3944             { return this->operator()(__urng, _M_param); }
3945              
3946             template
3947             result_type
3948             operator()(_UniformRandomNumberGenerator& __urng,
3949             const param_type& __p);
3950              
3951             template
3952             typename _UniformRandomNumberGenerator>
3953             void
3954             __generate(_ForwardIterator __f, _ForwardIterator __t,
3955             _UniformRandomNumberGenerator& __urng)
3956             { this->__generate(__f, __t, __urng, _M_param); }
3957              
3958             template
3959             typename _UniformRandomNumberGenerator>
3960             void
3961             __generate(_ForwardIterator __f, _ForwardIterator __t,
3962             _UniformRandomNumberGenerator& __urng,
3963             const param_type& __p)
3964             { this->__generate_impl(__f, __t, __urng, __p); }
3965              
3966             template
3967             void
3968             __generate(result_type* __f, result_type* __t,
3969             _UniformRandomNumberGenerator& __urng,
3970             const param_type& __p)
3971             { this->__generate_impl(__f, __t, __urng, __p); }
3972              
3973             /**
3974             * @brief Return true if two geometric distributions have
3975             * the same parameters.
3976             */
3977             friend bool
3978             operator==(const geometric_distribution& __d1,
3979             const geometric_distribution& __d2)
3980             { return __d1._M_param == __d2._M_param; }
3981              
3982             private:
3983             template
3984             typename _UniformRandomNumberGenerator>
3985             void
3986             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3987             _UniformRandomNumberGenerator& __urng,
3988             const param_type& __p);
3989              
3990             param_type _M_param;
3991             };
3992              
3993             /**
3994             * @brief Return true if two geometric distributions have
3995             * different parameters.
3996             */
3997             template
3998             inline bool
3999             operator!=(const std::geometric_distribution<_IntType>& __d1,
4000             const std::geometric_distribution<_IntType>& __d2)
4001             { return !(__d1 == __d2); }
4002              
4003             /**
4004             * @brief Inserts a %geometric_distribution random number distribution
4005             * @p __x into the output stream @p __os.
4006             *
4007             * @param __os An output stream.
4008             * @param __x A %geometric_distribution random number distribution.
4009             *
4010             * @returns The output stream with the state of @p __x inserted or in
4011             * an error state.
4012             */
4013             template
4014             typename _CharT, typename _Traits>
4015             std::basic_ostream<_CharT, _Traits>&
4016             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4017             const std::geometric_distribution<_IntType>& __x);
4018              
4019             /**
4020             * @brief Extracts a %geometric_distribution random number distribution
4021             * @p __x from the input stream @p __is.
4022             *
4023             * @param __is An input stream.
4024             * @param __x A %geometric_distribution random number generator engine.
4025             *
4026             * @returns The input stream with @p __x extracted or in an error state.
4027             */
4028             template
4029             typename _CharT, typename _Traits>
4030             std::basic_istream<_CharT, _Traits>&
4031             operator>>(std::basic_istream<_CharT, _Traits>& __is,
4032             std::geometric_distribution<_IntType>& __x);
4033              
4034              
4035             /**
4036             * @brief A negative_binomial_distribution random number distribution.
4037             *
4038             * The formula for the negative binomial probability mass function is
4039             * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
4040             * and @f$p@f$ are the parameters of the distribution.
4041             */
4042             template
4043             class negative_binomial_distribution
4044             {
4045             static_assert(std::is_integral<_IntType>::value,
4046             "template argument not an integral type");
4047              
4048             public:
4049             /** The type of the range of the distribution. */
4050             typedef _IntType result_type;
4051             /** Parameter type. */
4052             struct param_type
4053             {
4054             typedef negative_binomial_distribution<_IntType> distribution_type;
4055              
4056             explicit
4057             param_type(_IntType __k = 1, double __p = 0.5)
4058             : _M_k(__k), _M_p(__p)
4059             {
4060             _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0));
4061             }
4062              
4063             _IntType
4064             k() const
4065             { return _M_k; }
4066              
4067             double
4068             p() const
4069             { return _M_p; }
4070              
4071             friend bool
4072             operator==(const param_type& __p1, const param_type& __p2)
4073             { return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; }
4074              
4075             private:
4076             _IntType _M_k;
4077             double _M_p;
4078             };
4079              
4080             explicit
4081             negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
4082             : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
4083             { }
4084              
4085             explicit
4086             negative_binomial_distribution(const param_type& __p)
4087             : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
4088             { }
4089              
4090             /**
4091             * @brief Resets the distribution state.
4092             */
4093             void
4094             reset()
4095             { _M_gd.reset(); }
4096              
4097             /**
4098             * @brief Return the @f$k@f$ parameter of the distribution.
4099             */
4100             _IntType
4101             k() const
4102             { return _M_param.k(); }
4103              
4104             /**
4105             * @brief Return the @f$p@f$ parameter of the distribution.
4106             */
4107             double
4108             p() const
4109             { return _M_param.p(); }
4110              
4111             /**
4112             * @brief Returns the parameter set of the distribution.
4113             */
4114             param_type
4115             param() const
4116             { return _M_param; }
4117              
4118             /**
4119             * @brief Sets the parameter set of the distribution.
4120             * @param __param The new parameter set of the distribution.
4121             */
4122             void
4123             param(const param_type& __param)
4124             { _M_param = __param; }
4125              
4126             /**
4127             * @brief Returns the greatest lower bound value of the distribution.
4128             */
4129             result_type
4130             min() const
4131             { return result_type(0); }
4132              
4133             /**
4134             * @brief Returns the least upper bound value of the distribution.
4135             */
4136             result_type
4137             max() const
4138             { return std::numeric_limits::max(); }
4139              
4140             /**
4141             * @brief Generating functions.
4142             */
4143             template
4144             result_type
4145             operator()(_UniformRandomNumberGenerator& __urng);
4146              
4147             template
4148             result_type
4149             operator()(_UniformRandomNumberGenerator& __urng,
4150             const param_type& __p);
4151              
4152             template
4153             typename _UniformRandomNumberGenerator>
4154             void
4155             __generate(_ForwardIterator __f, _ForwardIterator __t,
4156             _UniformRandomNumberGenerator& __urng)
4157             { this->__generate_impl(__f, __t, __urng); }
4158              
4159             template
4160             typename _UniformRandomNumberGenerator>
4161             void
4162             __generate(_ForwardIterator __f, _ForwardIterator __t,
4163             _UniformRandomNumberGenerator& __urng,
4164             const param_type& __p)
4165             { this->__generate_impl(__f, __t, __urng, __p); }
4166              
4167             template
4168             void
4169             __generate(result_type* __f, result_type* __t,
4170             _UniformRandomNumberGenerator& __urng)
4171             { this->__generate_impl(__f, __t, __urng); }
4172              
4173             template
4174             void
4175             __generate(result_type* __f, result_type* __t,
4176             _UniformRandomNumberGenerator& __urng,
4177             const param_type& __p)
4178             { this->__generate_impl(__f, __t, __urng, __p); }
4179              
4180             /**
4181             * @brief Return true if two negative binomial distributions have
4182             * the same parameters and the sequences that would be
4183             * generated are equal.
4184             */
4185             friend bool
4186             operator==(const negative_binomial_distribution& __d1,
4187             const negative_binomial_distribution& __d2)
4188             { return __d1._M_param == __d2._M_param && __d1._M_gd == __d2._M_gd; }
4189              
4190             /**
4191             * @brief Inserts a %negative_binomial_distribution random
4192             * number distribution @p __x into the output stream @p __os.
4193             *
4194             * @param __os An output stream.
4195             * @param __x A %negative_binomial_distribution random number
4196             * distribution.
4197             *
4198             * @returns The output stream with the state of @p __x inserted or in
4199             * an error state.
4200             */
4201             template
4202             friend std::basic_ostream<_CharT, _Traits>&
4203             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4204             const std::negative_binomial_distribution<_IntType1>& __x);
4205              
4206             /**
4207             * @brief Extracts a %negative_binomial_distribution random number
4208             * distribution @p __x from the input stream @p __is.
4209             *
4210             * @param __is An input stream.
4211             * @param __x A %negative_binomial_distribution random number
4212             * generator engine.
4213             *
4214             * @returns The input stream with @p __x extracted or in an error state.
4215             */
4216             template
4217             friend std::basic_istream<_CharT, _Traits>&
4218             operator>>(std::basic_istream<_CharT, _Traits>& __is,
4219             std::negative_binomial_distribution<_IntType1>& __x);
4220              
4221             private:
4222             template
4223             typename _UniformRandomNumberGenerator>
4224             void
4225             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
4226             _UniformRandomNumberGenerator& __urng);
4227             template
4228             typename _UniformRandomNumberGenerator>
4229             void
4230             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
4231             _UniformRandomNumberGenerator& __urng,
4232             const param_type& __p);
4233              
4234             param_type _M_param;
4235              
4236             std::gamma_distribution _M_gd;
4237             };
4238              
4239             /**
4240             * @brief Return true if two negative binomial distributions are different.
4241             */
4242             template
4243             inline bool
4244             operator!=(const std::negative_binomial_distribution<_IntType>& __d1,
4245             const std::negative_binomial_distribution<_IntType>& __d2)
4246             { return !(__d1 == __d2); }
4247              
4248              
4249             /* @} */ // group random_distributions_bernoulli
4250              
4251             /**
4252             * @addtogroup random_distributions_poisson Poisson Distributions
4253             * @ingroup random_distributions
4254             * @{
4255             */
4256              
4257             /**
4258             * @brief A discrete Poisson random number distribution.
4259             *
4260             * The formula for the Poisson probability density function is
4261             * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the
4262             * parameter of the distribution.
4263             */
4264             template
4265             class poisson_distribution
4266             {
4267             static_assert(std::is_integral<_IntType>::value,
4268             "template argument not an integral type");
4269              
4270             public:
4271             /** The type of the range of the distribution. */
4272             typedef _IntType result_type;
4273             /** Parameter type. */
4274             struct param_type
4275             {
4276             typedef poisson_distribution<_IntType> distribution_type;
4277             friend class poisson_distribution<_IntType>;
4278              
4279             explicit
4280             param_type(double __mean = 1.0)
4281             : _M_mean(__mean)
4282             {
4283             _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
4284             _M_initialize();
4285             }
4286              
4287             double
4288             mean() const
4289             { return _M_mean; }
4290              
4291             friend bool
4292             operator==(const param_type& __p1, const param_type& __p2)
4293             { return __p1._M_mean == __p2._M_mean; }
4294              
4295             private:
4296             // Hosts either log(mean) or the threshold of the simple method.
4297             void
4298             _M_initialize();
4299              
4300             double _M_mean;
4301              
4302             double _M_lm_thr;
4303             #if _GLIBCXX_USE_C99_MATH_TR1
4304             double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
4305             #endif
4306             };
4307              
4308             // constructors and member function
4309             explicit
4310             poisson_distribution(double __mean = 1.0)
4311             : _M_param(__mean), _M_nd()
4312             { }
4313              
4314             explicit
4315             poisson_distribution(const param_type& __p)
4316             : _M_param(__p), _M_nd()
4317             { }
4318              
4319             /**
4320             * @brief Resets the distribution state.
4321             */
4322             void
4323             reset()
4324             { _M_nd.reset(); }
4325              
4326             /**
4327             * @brief Returns the distribution parameter @p mean.
4328             */
4329             double
4330             mean() const
4331             { return _M_param.mean(); }
4332              
4333             /**
4334             * @brief Returns the parameter set of the distribution.
4335             */
4336             param_type
4337             param() const
4338             { return _M_param; }
4339              
4340             /**
4341             * @brief Sets the parameter set of the distribution.
4342             * @param __param The new parameter set of the distribution.
4343             */
4344             void
4345             param(const param_type& __param)
4346             { _M_param = __param; }
4347              
4348             /**
4349             * @brief Returns the greatest lower bound value of the distribution.
4350             */
4351             result_type
4352             min() const
4353             { return 0; }
4354              
4355             /**
4356             * @brief Returns the least upper bound value of the distribution.
4357             */
4358             result_type
4359             max() const
4360             { return std::numeric_limits::max(); }
4361              
4362             /**
4363             * @brief Generating functions.
4364             */
4365             template
4366             result_type
4367             operator()(_UniformRandomNumberGenerator& __urng)
4368             { return this->operator()(__urng, _M_param); }
4369              
4370             template
4371             result_type
4372             operator()(_UniformRandomNumberGenerator& __urng,
4373             const param_type& __p);
4374              
4375             template
4376             typename _UniformRandomNumberGenerator>
4377             void
4378             __generate(_ForwardIterator __f, _ForwardIterator __t,
4379             _UniformRandomNumberGenerator& __urng)
4380             { this->__generate(__f, __t, __urng, _M_param); }
4381              
4382             template
4383             typename _UniformRandomNumberGenerator>
4384             void
4385             __generate(_ForwardIterator __f, _ForwardIterator __t,
4386             _UniformRandomNumberGenerator& __urng,
4387             const param_type& __p)
4388             { this->__generate_impl(__f, __t, __urng, __p); }
4389              
4390             template
4391             void
4392             __generate(result_type* __f, result_type* __t,
4393             _UniformRandomNumberGenerator& __urng,
4394             const param_type& __p)
4395             { this->__generate_impl(__f, __t, __urng, __p); }
4396              
4397             /**
4398             * @brief Return true if two Poisson distributions have the same
4399             * parameters and the sequences that would be generated
4400             * are equal.
4401             */
4402             friend bool
4403             operator==(const poisson_distribution& __d1,
4404             const poisson_distribution& __d2)
4405             #ifdef _GLIBCXX_USE_C99_MATH_TR1
4406             { return __d1._M_param == __d2._M_param && __d1._M_nd == __d2._M_nd; }
4407             #else
4408             { return __d1._M_param == __d2._M_param; }
4409             #endif
4410              
4411             /**
4412             * @brief Inserts a %poisson_distribution random number distribution
4413             * @p __x into the output stream @p __os.
4414             *
4415             * @param __os An output stream.
4416             * @param __x A %poisson_distribution random number distribution.
4417             *
4418             * @returns The output stream with the state of @p __x inserted or in
4419             * an error state.
4420             */
4421             template
4422             friend std::basic_ostream<_CharT, _Traits>&
4423             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4424             const std::poisson_distribution<_IntType1>& __x);
4425              
4426             /**
4427             * @brief Extracts a %poisson_distribution random number distribution
4428             * @p __x from the input stream @p __is.
4429             *
4430             * @param __is An input stream.
4431             * @param __x A %poisson_distribution random number generator engine.
4432             *
4433             * @returns The input stream with @p __x extracted or in an error
4434             * state.
4435             */
4436             template
4437             friend std::basic_istream<_CharT, _Traits>&
4438             operator>>(std::basic_istream<_CharT, _Traits>& __is,
4439             std::poisson_distribution<_IntType1>& __x);
4440              
4441             private:
4442             template
4443             typename _UniformRandomNumberGenerator>
4444             void
4445             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
4446             _UniformRandomNumberGenerator& __urng,
4447             const param_type& __p);
4448              
4449             param_type _M_param;
4450              
4451             // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
4452             std::normal_distribution _M_nd;
4453             };
4454              
4455             /**
4456             * @brief Return true if two Poisson distributions are different.
4457             */
4458             template
4459             inline bool
4460             operator!=(const std::poisson_distribution<_IntType>& __d1,
4461             const std::poisson_distribution<_IntType>& __d2)
4462             { return !(__d1 == __d2); }
4463              
4464              
4465             /**
4466             * @brief An exponential continuous distribution for random numbers.
4467             *
4468             * The formula for the exponential probability density function is
4469             * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$.
4470             *
4471             *
4472             *
Distribution Statistics
4473             *
Mean@f$\frac{1}{\lambda}@f$
4474             *
Median@f$\frac{\ln 2}{\lambda}@f$
4475             *
Mode@f$zero@f$
4476             *
Range@f$[0, \infty]@f$
4477             *
Standard Deviation@f$\frac{1}{\lambda}@f$
4478             *
4479             */
4480             template
4481             class exponential_distribution
4482             {
4483             static_assert(std::is_floating_point<_RealType>::value,
4484             "template argument not a floating point type");
4485              
4486             public:
4487             /** The type of the range of the distribution. */
4488             typedef _RealType result_type;
4489             /** Parameter type. */
4490             struct param_type
4491             {
4492             typedef exponential_distribution<_RealType> distribution_type;
4493              
4494             explicit
4495             param_type(_RealType __lambda = _RealType(1))
4496             : _M_lambda(__lambda)
4497             {
4498             _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0));
4499             }
4500              
4501             _RealType
4502             lambda() const
4503             { return _M_lambda; }
4504              
4505             friend bool
4506             operator==(const param_type& __p1, const param_type& __p2)
4507             { return __p1._M_lambda == __p2._M_lambda; }
4508              
4509             private:
4510             _RealType _M_lambda;
4511             };
4512              
4513             public:
4514             /**
4515             * @brief Constructs an exponential distribution with inverse scale
4516             * parameter @f$\lambda@f$.
4517             */
4518             explicit
4519             exponential_distribution(const result_type& __lambda = result_type(1))
4520             : _M_param(__lambda)
4521             { }
4522              
4523             explicit
4524             exponential_distribution(const param_type& __p)
4525             : _M_param(__p)
4526             { }
4527              
4528             /**
4529             * @brief Resets the distribution state.
4530             *
4531             * Has no effect on exponential distributions.
4532             */
4533             void
4534             reset() { }
4535              
4536             /**
4537             * @brief Returns the inverse scale parameter of the distribution.
4538             */
4539             _RealType
4540             lambda() const
4541             { return _M_param.lambda(); }
4542              
4543             /**
4544             * @brief Returns the parameter set of the distribution.
4545             */
4546             param_type
4547             param() const
4548             { return _M_param; }
4549              
4550             /**
4551             * @brief Sets the parameter set of the distribution.
4552             * @param __param The new parameter set of the distribution.
4553             */
4554             void
4555             param(const param_type& __param)
4556             { _M_param = __param; }
4557              
4558             /**
4559             * @brief Returns the greatest lower bound value of the distribution.
4560             */
4561             result_type
4562             min() const
4563             { return result_type(0); }
4564              
4565             /**
4566             * @brief Returns the least upper bound value of the distribution.
4567             */
4568             result_type
4569             max() const
4570             { return std::numeric_limits::max(); }
4571              
4572             /**
4573             * @brief Generating functions.
4574             */
4575             template
4576             result_type
4577             operator()(_UniformRandomNumberGenerator& __urng)
4578             { return this->operator()(__urng, _M_param); }
4579              
4580             template
4581             result_type
4582             operator()(_UniformRandomNumberGenerator& __urng,
4583             const param_type& __p)
4584             {
4585             __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
4586             __aurng(__urng);
4587             return -std::log(result_type(1) - __aurng()) / __p.lambda();
4588             }
4589              
4590             template
4591             typename _UniformRandomNumberGenerator>
4592             void
4593             __generate(_ForwardIterator __f, _ForwardIterator __t,
4594             _UniformRandomNumberGenerator& __urng)
4595             { this->__generate(__f, __t, __urng, _M_param); }
4596              
4597             template
4598             typename _UniformRandomNumberGenerator>
4599             void
4600             __generate(_ForwardIterator __f, _ForwardIterator __t,
4601             _UniformRandomNumberGenerator& __urng,
4602             const param_type& __p)
4603             { this->__generate_impl(__f, __t, __urng, __p); }
4604              
4605             template
4606             void
4607             __generate(result_type* __f, result_type* __t,
4608             _UniformRandomNumberGenerator& __urng,
4609             const param_type& __p)
4610             { this->__generate_impl(__f, __t, __urng, __p); }
4611              
4612             /**
4613             * @brief Return true if two exponential distributions have the same
4614             * parameters.
4615             */
4616             friend bool
4617             operator==(const exponential_distribution& __d1,
4618             const exponential_distribution& __d2)
4619             { return __d1._M_param == __d2._M_param; }
4620              
4621             private:
4622             template
4623             typename _UniformRandomNumberGenerator>
4624             void
4625             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
4626             _UniformRandomNumberGenerator& __urng,
4627             const param_type& __p);
4628              
4629             param_type _M_param;
4630             };
4631              
4632             /**
4633             * @brief Return true if two exponential distributions have different
4634             * parameters.
4635             */
4636             template
4637             inline bool
4638             operator!=(const std::exponential_distribution<_RealType>& __d1,
4639             const std::exponential_distribution<_RealType>& __d2)
4640             { return !(__d1 == __d2); }
4641              
4642             /**
4643             * @brief Inserts a %exponential_distribution random number distribution
4644             * @p __x into the output stream @p __os.
4645             *
4646             * @param __os An output stream.
4647             * @param __x A %exponential_distribution random number distribution.
4648             *
4649             * @returns The output stream with the state of @p __x inserted or in
4650             * an error state.
4651             */
4652             template
4653             std::basic_ostream<_CharT, _Traits>&
4654             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4655             const std::exponential_distribution<_RealType>& __x);
4656              
4657             /**
4658             * @brief Extracts a %exponential_distribution random number distribution
4659             * @p __x from the input stream @p __is.
4660             *
4661             * @param __is An input stream.
4662             * @param __x A %exponential_distribution random number
4663             * generator engine.
4664             *
4665             * @returns The input stream with @p __x extracted or in an error state.
4666             */
4667             template
4668             std::basic_istream<_CharT, _Traits>&
4669             operator>>(std::basic_istream<_CharT, _Traits>& __is,
4670             std::exponential_distribution<_RealType>& __x);
4671              
4672              
4673             /**
4674             * @brief A weibull_distribution random number distribution.
4675             *
4676             * The formula for the normal probability density function is:
4677             * @f[
4678             * p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1}
4679             * \exp{(-(\frac{x}{\beta})^\alpha)}
4680             * @f]
4681             */
4682             template
4683             class weibull_distribution
4684             {
4685             static_assert(std::is_floating_point<_RealType>::value,
4686             "template argument not a floating point type");
4687              
4688             public:
4689             /** The type of the range of the distribution. */
4690             typedef _RealType result_type;
4691             /** Parameter type. */
4692             struct param_type
4693             {
4694             typedef weibull_distribution<_RealType> distribution_type;
4695              
4696             explicit
4697             param_type(_RealType __a = _RealType(1),
4698             _RealType __b = _RealType(1))
4699             : _M_a(__a), _M_b(__b)
4700             { }
4701              
4702             _RealType
4703             a() const
4704             { return _M_a; }
4705              
4706             _RealType
4707             b() const
4708             { return _M_b; }
4709              
4710             friend bool
4711             operator==(const param_type& __p1, const param_type& __p2)
4712             { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
4713              
4714             private:
4715             _RealType _M_a;
4716             _RealType _M_b;
4717             };
4718              
4719             explicit
4720             weibull_distribution(_RealType __a = _RealType(1),
4721             _RealType __b = _RealType(1))
4722             : _M_param(__a, __b)
4723             { }
4724              
4725             explicit
4726             weibull_distribution(const param_type& __p)
4727             : _M_param(__p)
4728             { }
4729              
4730             /**
4731             * @brief Resets the distribution state.
4732             */
4733             void
4734             reset()
4735             { }
4736              
4737             /**
4738             * @brief Return the @f$a@f$ parameter of the distribution.
4739             */
4740             _RealType
4741             a() const
4742             { return _M_param.a(); }
4743              
4744             /**
4745             * @brief Return the @f$b@f$ parameter of the distribution.
4746             */
4747             _RealType
4748             b() const
4749             { return _M_param.b(); }
4750              
4751             /**
4752             * @brief Returns the parameter set of the distribution.
4753             */
4754             param_type
4755             param() const
4756             { return _M_param; }
4757              
4758             /**
4759             * @brief Sets the parameter set of the distribution.
4760             * @param __param The new parameter set of the distribution.
4761             */
4762             void
4763             param(const param_type& __param)
4764             { _M_param = __param; }
4765              
4766             /**
4767             * @brief Returns the greatest lower bound value of the distribution.
4768             */
4769             result_type
4770             min() const
4771             { return result_type(0); }
4772              
4773             /**
4774             * @brief Returns the least upper bound value of the distribution.
4775             */
4776             result_type
4777             max() const
4778             { return std::numeric_limits::max(); }
4779              
4780             /**
4781             * @brief Generating functions.
4782             */
4783             template
4784             result_type
4785             operator()(_UniformRandomNumberGenerator& __urng)
4786             { return this->operator()(__urng, _M_param); }
4787              
4788             template
4789             result_type
4790             operator()(_UniformRandomNumberGenerator& __urng,
4791             const param_type& __p);
4792              
4793             template
4794             typename _UniformRandomNumberGenerator>
4795             void
4796             __generate(_ForwardIterator __f, _ForwardIterator __t,
4797             _UniformRandomNumberGenerator& __urng)
4798             { this->__generate(__f, __t, __urng, _M_param); }
4799              
4800             template
4801             typename _UniformRandomNumberGenerator>
4802             void
4803             __generate(_ForwardIterator __f, _ForwardIterator __t,
4804             _UniformRandomNumberGenerator& __urng,
4805             const param_type& __p)
4806             { this->__generate_impl(__f, __t, __urng, __p); }
4807              
4808             template
4809             void
4810             __generate(result_type* __f, result_type* __t,
4811             _UniformRandomNumberGenerator& __urng,
4812             const param_type& __p)
4813             { this->__generate_impl(__f, __t, __urng, __p); }
4814              
4815             /**
4816             * @brief Return true if two Weibull distributions have the same
4817             * parameters.
4818             */
4819             friend bool
4820             operator==(const weibull_distribution& __d1,
4821             const weibull_distribution& __d2)
4822             { return __d1._M_param == __d2._M_param; }
4823              
4824             private:
4825             template
4826             typename _UniformRandomNumberGenerator>
4827             void
4828             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
4829             _UniformRandomNumberGenerator& __urng,
4830             const param_type& __p);
4831              
4832             param_type _M_param;
4833             };
4834              
4835             /**
4836             * @brief Return true if two Weibull distributions have different
4837             * parameters.
4838             */
4839             template
4840             inline bool
4841             operator!=(const std::weibull_distribution<_RealType>& __d1,
4842             const std::weibull_distribution<_RealType>& __d2)
4843             { return !(__d1 == __d2); }
4844              
4845             /**
4846             * @brief Inserts a %weibull_distribution random number distribution
4847             * @p __x into the output stream @p __os.
4848             *
4849             * @param __os An output stream.
4850             * @param __x A %weibull_distribution random number distribution.
4851             *
4852             * @returns The output stream with the state of @p __x inserted or in
4853             * an error state.
4854             */
4855             template
4856             std::basic_ostream<_CharT, _Traits>&
4857             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4858             const std::weibull_distribution<_RealType>& __x);
4859              
4860             /**
4861             * @brief Extracts a %weibull_distribution random number distribution
4862             * @p __x from the input stream @p __is.
4863             *
4864             * @param __is An input stream.
4865             * @param __x A %weibull_distribution random number
4866             * generator engine.
4867             *
4868             * @returns The input stream with @p __x extracted or in an error state.
4869             */
4870             template
4871             std::basic_istream<_CharT, _Traits>&
4872             operator>>(std::basic_istream<_CharT, _Traits>& __is,
4873             std::weibull_distribution<_RealType>& __x);
4874              
4875              
4876             /**
4877             * @brief A extreme_value_distribution random number distribution.
4878             *
4879             * The formula for the normal probability mass function is
4880             * @f[
4881             * p(x|a,b) = \frac{1}{b}
4882             * \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b}))
4883             * @f]
4884             */
4885             template
4886             class extreme_value_distribution
4887             {
4888             static_assert(std::is_floating_point<_RealType>::value,
4889             "template argument not a floating point type");
4890              
4891             public:
4892             /** The type of the range of the distribution. */
4893             typedef _RealType result_type;
4894             /** Parameter type. */
4895             struct param_type
4896             {
4897             typedef extreme_value_distribution<_RealType> distribution_type;
4898              
4899             explicit
4900             param_type(_RealType __a = _RealType(0),
4901             _RealType __b = _RealType(1))
4902             : _M_a(__a), _M_b(__b)
4903             { }
4904              
4905             _RealType
4906             a() const
4907             { return _M_a; }
4908              
4909             _RealType
4910             b() const
4911             { return _M_b; }
4912              
4913             friend bool
4914             operator==(const param_type& __p1, const param_type& __p2)
4915             { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
4916              
4917             private:
4918             _RealType _M_a;
4919             _RealType _M_b;
4920             };
4921              
4922             explicit
4923             extreme_value_distribution(_RealType __a = _RealType(0),
4924             _RealType __b = _RealType(1))
4925             : _M_param(__a, __b)
4926             { }
4927              
4928             explicit
4929             extreme_value_distribution(const param_type& __p)
4930             : _M_param(__p)
4931             { }
4932              
4933             /**
4934             * @brief Resets the distribution state.
4935             */
4936             void
4937             reset()
4938             { }
4939              
4940             /**
4941             * @brief Return the @f$a@f$ parameter of the distribution.
4942             */
4943             _RealType
4944             a() const
4945             { return _M_param.a(); }
4946              
4947             /**
4948             * @brief Return the @f$b@f$ parameter of the distribution.
4949             */
4950             _RealType
4951             b() const
4952             { return _M_param.b(); }
4953              
4954             /**
4955             * @brief Returns the parameter set of the distribution.
4956             */
4957             param_type
4958             param() const
4959             { return _M_param; }
4960              
4961             /**
4962             * @brief Sets the parameter set of the distribution.
4963             * @param __param The new parameter set of the distribution.
4964             */
4965             void
4966             param(const param_type& __param)
4967             { _M_param = __param; }
4968              
4969             /**
4970             * @brief Returns the greatest lower bound value of the distribution.
4971             */
4972             result_type
4973             min() const
4974             { return std::numeric_limits::lowest(); }
4975              
4976             /**
4977             * @brief Returns the least upper bound value of the distribution.
4978             */
4979             result_type
4980             max() const
4981             { return std::numeric_limits::max(); }
4982              
4983             /**
4984             * @brief Generating functions.
4985             */
4986             template
4987             result_type
4988             operator()(_UniformRandomNumberGenerator& __urng)
4989             { return this->operator()(__urng, _M_param); }
4990              
4991             template
4992             result_type
4993             operator()(_UniformRandomNumberGenerator& __urng,
4994             const param_type& __p);
4995              
4996             template
4997             typename _UniformRandomNumberGenerator>
4998             void
4999             __generate(_ForwardIterator __f, _ForwardIterator __t,
5000             _UniformRandomNumberGenerator& __urng)
5001             { this->__generate(__f, __t, __urng, _M_param); }
5002              
5003             template
5004             typename _UniformRandomNumberGenerator>
5005             void
5006             __generate(_ForwardIterator __f, _ForwardIterator __t,
5007             _UniformRandomNumberGenerator& __urng,
5008             const param_type& __p)
5009             { this->__generate_impl(__f, __t, __urng, __p); }
5010              
5011             template
5012             void
5013             __generate(result_type* __f, result_type* __t,
5014             _UniformRandomNumberGenerator& __urng,
5015             const param_type& __p)
5016             { this->__generate_impl(__f, __t, __urng, __p); }
5017              
5018             /**
5019             * @brief Return true if two extreme value distributions have the same
5020             * parameters.
5021             */
5022             friend bool
5023             operator==(const extreme_value_distribution& __d1,
5024             const extreme_value_distribution& __d2)
5025             { return __d1._M_param == __d2._M_param; }
5026              
5027             private:
5028             template
5029             typename _UniformRandomNumberGenerator>
5030             void
5031             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
5032             _UniformRandomNumberGenerator& __urng,
5033             const param_type& __p);
5034              
5035             param_type _M_param;
5036             };
5037              
5038             /**
5039             * @brief Return true if two extreme value distributions have different
5040             * parameters.
5041             */
5042             template
5043             inline bool
5044             operator!=(const std::extreme_value_distribution<_RealType>& __d1,
5045             const std::extreme_value_distribution<_RealType>& __d2)
5046             { return !(__d1 == __d2); }
5047              
5048             /**
5049             * @brief Inserts a %extreme_value_distribution random number distribution
5050             * @p __x into the output stream @p __os.
5051             *
5052             * @param __os An output stream.
5053             * @param __x A %extreme_value_distribution random number distribution.
5054             *
5055             * @returns The output stream with the state of @p __x inserted or in
5056             * an error state.
5057             */
5058             template
5059             std::basic_ostream<_CharT, _Traits>&
5060             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5061             const std::extreme_value_distribution<_RealType>& __x);
5062              
5063             /**
5064             * @brief Extracts a %extreme_value_distribution random number
5065             * distribution @p __x from the input stream @p __is.
5066             *
5067             * @param __is An input stream.
5068             * @param __x A %extreme_value_distribution random number
5069             * generator engine.
5070             *
5071             * @returns The input stream with @p __x extracted or in an error state.
5072             */
5073             template
5074             std::basic_istream<_CharT, _Traits>&
5075             operator>>(std::basic_istream<_CharT, _Traits>& __is,
5076             std::extreme_value_distribution<_RealType>& __x);
5077              
5078              
5079             /**
5080             * @brief A discrete_distribution random number distribution.
5081             *
5082             * The formula for the discrete probability mass function is
5083             *
5084             */
5085             template
5086             class discrete_distribution
5087             {
5088             static_assert(std::is_integral<_IntType>::value,
5089             "template argument not an integral type");
5090              
5091             public:
5092             /** The type of the range of the distribution. */
5093             typedef _IntType result_type;
5094             /** Parameter type. */
5095             struct param_type
5096             {
5097             typedef discrete_distribution<_IntType> distribution_type;
5098             friend class discrete_distribution<_IntType>;
5099              
5100             param_type()
5101             : _M_prob(), _M_cp()
5102             { }
5103              
5104             template
5105             param_type(_InputIterator __wbegin,
5106             _InputIterator __wend)
5107             : _M_prob(__wbegin, __wend), _M_cp()
5108             { _M_initialize(); }
5109              
5110             param_type(initializer_list __wil)
5111             : _M_prob(__wil.begin(), __wil.end()), _M_cp()
5112             { _M_initialize(); }
5113              
5114             template
5115             param_type(size_t __nw, double __xmin, double __xmax,
5116             _Func __fw);
5117              
5118             // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
5119             param_type(const param_type&) = default;
5120             param_type& operator=(const param_type&) = default;
5121              
5122             std::vector
5123             probabilities() const
5124             { return _M_prob.empty() ? std::vector(1, 1.0) : _M_prob; }
5125              
5126             friend bool
5127             operator==(const param_type& __p1, const param_type& __p2)
5128             { return __p1._M_prob == __p2._M_prob; }
5129              
5130             private:
5131             void
5132             _M_initialize();
5133              
5134             std::vector _M_prob;
5135             std::vector _M_cp;
5136             };
5137              
5138             discrete_distribution()
5139             : _M_param()
5140             { }
5141              
5142             template
5143             discrete_distribution(_InputIterator __wbegin,
5144             _InputIterator __wend)
5145             : _M_param(__wbegin, __wend)
5146             { }
5147              
5148             discrete_distribution(initializer_list __wl)
5149             : _M_param(__wl)
5150             { }
5151              
5152             template
5153             discrete_distribution(size_t __nw, double __xmin, double __xmax,
5154             _Func __fw)
5155             : _M_param(__nw, __xmin, __xmax, __fw)
5156             { }
5157              
5158             explicit
5159             discrete_distribution(const param_type& __p)
5160             : _M_param(__p)
5161             { }
5162              
5163             /**
5164             * @brief Resets the distribution state.
5165             */
5166             void
5167             reset()
5168             { }
5169              
5170             /**
5171             * @brief Returns the probabilities of the distribution.
5172             */
5173             std::vector
5174             probabilities() const
5175             {
5176             return _M_param._M_prob.empty()
5177             ? std::vector(1, 1.0) : _M_param._M_prob;
5178             }
5179              
5180             /**
5181             * @brief Returns the parameter set of the distribution.
5182             */
5183             param_type
5184             param() const
5185             { return _M_param; }
5186              
5187             /**
5188             * @brief Sets the parameter set of the distribution.
5189             * @param __param The new parameter set of the distribution.
5190             */
5191             void
5192             param(const param_type& __param)
5193             { _M_param = __param; }
5194              
5195             /**
5196             * @brief Returns the greatest lower bound value of the distribution.
5197             */
5198             result_type
5199             min() const
5200             { return result_type(0); }
5201              
5202             /**
5203             * @brief Returns the least upper bound value of the distribution.
5204             */
5205             result_type
5206             max() const
5207             {
5208             return _M_param._M_prob.empty()
5209             ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
5210             }
5211              
5212             /**
5213             * @brief Generating functions.
5214             */
5215             template
5216             result_type
5217             operator()(_UniformRandomNumberGenerator& __urng)
5218             { return this->operator()(__urng, _M_param); }
5219              
5220             template
5221             result_type
5222             operator()(_UniformRandomNumberGenerator& __urng,
5223             const param_type& __p);
5224              
5225             template
5226             typename _UniformRandomNumberGenerator>
5227             void
5228             __generate(_ForwardIterator __f, _ForwardIterator __t,
5229             _UniformRandomNumberGenerator& __urng)
5230             { this->__generate(__f, __t, __urng, _M_param); }
5231              
5232             template
5233             typename _UniformRandomNumberGenerator>
5234             void
5235             __generate(_ForwardIterator __f, _ForwardIterator __t,
5236             _UniformRandomNumberGenerator& __urng,
5237             const param_type& __p)
5238             { this->__generate_impl(__f, __t, __urng, __p); }
5239              
5240             template
5241             void
5242             __generate(result_type* __f, result_type* __t,
5243             _UniformRandomNumberGenerator& __urng,
5244             const param_type& __p)
5245             { this->__generate_impl(__f, __t, __urng, __p); }
5246              
5247             /**
5248             * @brief Return true if two discrete distributions have the same
5249             * parameters.
5250             */
5251             friend bool
5252             operator==(const discrete_distribution& __d1,
5253             const discrete_distribution& __d2)
5254             { return __d1._M_param == __d2._M_param; }
5255              
5256             /**
5257             * @brief Inserts a %discrete_distribution random number distribution
5258             * @p __x into the output stream @p __os.
5259             *
5260             * @param __os An output stream.
5261             * @param __x A %discrete_distribution random number distribution.
5262             *
5263             * @returns The output stream with the state of @p __x inserted or in
5264             * an error state.
5265             */
5266             template
5267             friend std::basic_ostream<_CharT, _Traits>&
5268             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5269             const std::discrete_distribution<_IntType1>& __x);
5270              
5271             /**
5272             * @brief Extracts a %discrete_distribution random number distribution
5273             * @p __x from the input stream @p __is.
5274             *
5275             * @param __is An input stream.
5276             * @param __x A %discrete_distribution random number
5277             * generator engine.
5278             *
5279             * @returns The input stream with @p __x extracted or in an error
5280             * state.
5281             */
5282             template
5283             friend std::basic_istream<_CharT, _Traits>&
5284             operator>>(std::basic_istream<_CharT, _Traits>& __is,
5285             std::discrete_distribution<_IntType1>& __x);
5286              
5287             private:
5288             template
5289             typename _UniformRandomNumberGenerator>
5290             void
5291             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
5292             _UniformRandomNumberGenerator& __urng,
5293             const param_type& __p);
5294              
5295             param_type _M_param;
5296             };
5297              
5298             /**
5299             * @brief Return true if two discrete distributions have different
5300             * parameters.
5301             */
5302             template
5303             inline bool
5304             operator!=(const std::discrete_distribution<_IntType>& __d1,
5305             const std::discrete_distribution<_IntType>& __d2)
5306             { return !(__d1 == __d2); }
5307              
5308              
5309             /**
5310             * @brief A piecewise_constant_distribution random number distribution.
5311             *
5312             * The formula for the piecewise constant probability mass function is
5313             *
5314             */
5315             template
5316             class piecewise_constant_distribution
5317             {
5318             static_assert(std::is_floating_point<_RealType>::value,
5319             "template argument not a floating point type");
5320              
5321             public:
5322             /** The type of the range of the distribution. */
5323             typedef _RealType result_type;
5324             /** Parameter type. */
5325             struct param_type
5326             {
5327             typedef piecewise_constant_distribution<_RealType> distribution_type;
5328             friend class piecewise_constant_distribution<_RealType>;
5329              
5330             param_type()
5331             : _M_int(), _M_den(), _M_cp()
5332             { }
5333              
5334             template
5335             param_type(_InputIteratorB __bfirst,
5336             _InputIteratorB __bend,
5337             _InputIteratorW __wbegin);
5338              
5339             template
5340             param_type(initializer_list<_RealType> __bi, _Func __fw);
5341              
5342             template
5343             param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
5344             _Func __fw);
5345              
5346             // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
5347             param_type(const param_type&) = default;
5348             param_type& operator=(const param_type&) = default;
5349              
5350             std::vector<_RealType>
5351             intervals() const
5352             {
5353             if (_M_int.empty())
5354             {
5355             std::vector<_RealType> __tmp(2);
5356             __tmp[1] = _RealType(1);
5357             return __tmp;
5358             }
5359             else
5360             return _M_int;
5361             }
5362              
5363             std::vector
5364             densities() const
5365             { return _M_den.empty() ? std::vector(1, 1.0) : _M_den; }
5366              
5367             friend bool
5368             operator==(const param_type& __p1, const param_type& __p2)
5369             { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; }
5370              
5371             private:
5372             void
5373             _M_initialize();
5374              
5375             std::vector<_RealType> _M_int;
5376             std::vector _M_den;
5377             std::vector _M_cp;
5378             };
5379              
5380             explicit
5381             piecewise_constant_distribution()
5382             : _M_param()
5383             { }
5384              
5385             template
5386             piecewise_constant_distribution(_InputIteratorB __bfirst,
5387             _InputIteratorB __bend,
5388             _InputIteratorW __wbegin)
5389             : _M_param(__bfirst, __bend, __wbegin)
5390             { }
5391              
5392             template
5393             piecewise_constant_distribution(initializer_list<_RealType> __bl,
5394             _Func __fw)
5395             : _M_param(__bl, __fw)
5396             { }
5397              
5398             template
5399             piecewise_constant_distribution(size_t __nw,
5400             _RealType __xmin, _RealType __xmax,
5401             _Func __fw)
5402             : _M_param(__nw, __xmin, __xmax, __fw)
5403             { }
5404              
5405             explicit
5406             piecewise_constant_distribution(const param_type& __p)
5407             : _M_param(__p)
5408             { }
5409              
5410             /**
5411             * @brief Resets the distribution state.
5412             */
5413             void
5414             reset()
5415             { }
5416              
5417             /**
5418             * @brief Returns a vector of the intervals.
5419             */
5420             std::vector<_RealType>
5421             intervals() const
5422             {
5423             if (_M_param._M_int.empty())
5424             {
5425             std::vector<_RealType> __tmp(2);
5426             __tmp[1] = _RealType(1);
5427             return __tmp;
5428             }
5429             else
5430             return _M_param._M_int;
5431             }
5432              
5433             /**
5434             * @brief Returns a vector of the probability densities.
5435             */
5436             std::vector
5437             densities() const
5438             {
5439             return _M_param._M_den.empty()
5440             ? std::vector(1, 1.0) : _M_param._M_den;
5441             }
5442              
5443             /**
5444             * @brief Returns the parameter set of the distribution.
5445             */
5446             param_type
5447             param() const
5448             { return _M_param; }
5449              
5450             /**
5451             * @brief Sets the parameter set of the distribution.
5452             * @param __param The new parameter set of the distribution.
5453             */
5454             void
5455             param(const param_type& __param)
5456             { _M_param = __param; }
5457              
5458             /**
5459             * @brief Returns the greatest lower bound value of the distribution.
5460             */
5461             result_type
5462             min() const
5463             {
5464             return _M_param._M_int.empty()
5465             ? result_type(0) : _M_param._M_int.front();
5466             }
5467              
5468             /**
5469             * @brief Returns the least upper bound value of the distribution.
5470             */
5471             result_type
5472             max() const
5473             {
5474             return _M_param._M_int.empty()
5475             ? result_type(1) : _M_param._M_int.back();
5476             }
5477              
5478             /**
5479             * @brief Generating functions.
5480             */
5481             template
5482             result_type
5483             operator()(_UniformRandomNumberGenerator& __urng)
5484             { return this->operator()(__urng, _M_param); }
5485              
5486             template
5487             result_type
5488             operator()(_UniformRandomNumberGenerator& __urng,
5489             const param_type& __p);
5490              
5491             template
5492             typename _UniformRandomNumberGenerator>
5493             void
5494             __generate(_ForwardIterator __f, _ForwardIterator __t,
5495             _UniformRandomNumberGenerator& __urng)
5496             { this->__generate(__f, __t, __urng, _M_param); }
5497              
5498             template
5499             typename _UniformRandomNumberGenerator>
5500             void
5501             __generate(_ForwardIterator __f, _ForwardIterator __t,
5502             _UniformRandomNumberGenerator& __urng,
5503             const param_type& __p)
5504             { this->__generate_impl(__f, __t, __urng, __p); }
5505              
5506             template
5507             void
5508             __generate(result_type* __f, result_type* __t,
5509             _UniformRandomNumberGenerator& __urng,
5510             const param_type& __p)
5511             { this->__generate_impl(__f, __t, __urng, __p); }
5512              
5513             /**
5514             * @brief Return true if two piecewise constant distributions have the
5515             * same parameters.
5516             */
5517             friend bool
5518             operator==(const piecewise_constant_distribution& __d1,
5519             const piecewise_constant_distribution& __d2)
5520             { return __d1._M_param == __d2._M_param; }
5521              
5522             /**
5523             * @brief Inserts a %piecewise_constant_distribution random
5524             * number distribution @p __x into the output stream @p __os.
5525             *
5526             * @param __os An output stream.
5527             * @param __x A %piecewise_constant_distribution random number
5528             * distribution.
5529             *
5530             * @returns The output stream with the state of @p __x inserted or in
5531             * an error state.
5532             */
5533             template
5534             friend std::basic_ostream<_CharT, _Traits>&
5535             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5536             const std::piecewise_constant_distribution<_RealType1>& __x);
5537              
5538             /**
5539             * @brief Extracts a %piecewise_constant_distribution random
5540             * number distribution @p __x from the input stream @p __is.
5541             *
5542             * @param __is An input stream.
5543             * @param __x A %piecewise_constant_distribution random number
5544             * generator engine.
5545             *
5546             * @returns The input stream with @p __x extracted or in an error
5547             * state.
5548             */
5549             template
5550             friend std::basic_istream<_CharT, _Traits>&
5551             operator>>(std::basic_istream<_CharT, _Traits>& __is,
5552             std::piecewise_constant_distribution<_RealType1>& __x);
5553              
5554             private:
5555             template
5556             typename _UniformRandomNumberGenerator>
5557             void
5558             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
5559             _UniformRandomNumberGenerator& __urng,
5560             const param_type& __p);
5561              
5562             param_type _M_param;
5563             };
5564              
5565             /**
5566             * @brief Return true if two piecewise constant distributions have
5567             * different parameters.
5568             */
5569             template
5570             inline bool
5571             operator!=(const std::piecewise_constant_distribution<_RealType>& __d1,
5572             const std::piecewise_constant_distribution<_RealType>& __d2)
5573             { return !(__d1 == __d2); }
5574              
5575              
5576             /**
5577             * @brief A piecewise_linear_distribution random number distribution.
5578             *
5579             * The formula for the piecewise linear probability mass function is
5580             *
5581             */
5582             template
5583             class piecewise_linear_distribution
5584             {
5585             static_assert(std::is_floating_point<_RealType>::value,
5586             "template argument not a floating point type");
5587              
5588             public:
5589             /** The type of the range of the distribution. */
5590             typedef _RealType result_type;
5591             /** Parameter type. */
5592             struct param_type
5593             {
5594             typedef piecewise_linear_distribution<_RealType> distribution_type;
5595             friend class piecewise_linear_distribution<_RealType>;
5596              
5597             param_type()
5598             : _M_int(), _M_den(), _M_cp(), _M_m()
5599             { }
5600              
5601             template
5602             param_type(_InputIteratorB __bfirst,
5603             _InputIteratorB __bend,
5604             _InputIteratorW __wbegin);
5605              
5606             template
5607             param_type(initializer_list<_RealType> __bl, _Func __fw);
5608              
5609             template
5610             param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
5611             _Func __fw);
5612              
5613             // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
5614             param_type(const param_type&) = default;
5615             param_type& operator=(const param_type&) = default;
5616              
5617             std::vector<_RealType>
5618             intervals() const
5619             {
5620             if (_M_int.empty())
5621             {
5622             std::vector<_RealType> __tmp(2);
5623             __tmp[1] = _RealType(1);
5624             return __tmp;
5625             }
5626             else
5627             return _M_int;
5628             }
5629              
5630             std::vector
5631             densities() const
5632             { return _M_den.empty() ? std::vector(2, 1.0) : _M_den; }
5633              
5634             friend bool
5635             operator==(const param_type& __p1, const param_type& __p2)
5636             { return (__p1._M_int == __p2._M_int
5637             && __p1._M_den == __p2._M_den); }
5638              
5639             private:
5640             void
5641             _M_initialize();
5642              
5643             std::vector<_RealType> _M_int;
5644             std::vector _M_den;
5645             std::vector _M_cp;
5646             std::vector _M_m;
5647             };
5648              
5649             explicit
5650             piecewise_linear_distribution()
5651             : _M_param()
5652             { }
5653              
5654             template
5655             piecewise_linear_distribution(_InputIteratorB __bfirst,
5656             _InputIteratorB __bend,
5657             _InputIteratorW __wbegin)
5658             : _M_param(__bfirst, __bend, __wbegin)
5659             { }
5660              
5661             template
5662             piecewise_linear_distribution(initializer_list<_RealType> __bl,
5663             _Func __fw)
5664             : _M_param(__bl, __fw)
5665             { }
5666              
5667             template
5668             piecewise_linear_distribution(size_t __nw,
5669             _RealType __xmin, _RealType __xmax,
5670             _Func __fw)
5671             : _M_param(__nw, __xmin, __xmax, __fw)
5672             { }
5673              
5674             explicit
5675             piecewise_linear_distribution(const param_type& __p)
5676             : _M_param(__p)
5677             { }
5678              
5679             /**
5680             * Resets the distribution state.
5681             */
5682             void
5683             reset()
5684             { }
5685              
5686             /**
5687             * @brief Return the intervals of the distribution.
5688             */
5689             std::vector<_RealType>
5690             intervals() const
5691             {
5692             if (_M_param._M_int.empty())
5693             {
5694             std::vector<_RealType> __tmp(2);
5695             __tmp[1] = _RealType(1);
5696             return __tmp;
5697             }
5698             else
5699             return _M_param._M_int;
5700             }
5701              
5702             /**
5703             * @brief Return a vector of the probability densities of the
5704             * distribution.
5705             */
5706             std::vector
5707             densities() const
5708             {
5709             return _M_param._M_den.empty()
5710             ? std::vector(2, 1.0) : _M_param._M_den;
5711             }
5712              
5713             /**
5714             * @brief Returns the parameter set of the distribution.
5715             */
5716             param_type
5717             param() const
5718             { return _M_param; }
5719              
5720             /**
5721             * @brief Sets the parameter set of the distribution.
5722             * @param __param The new parameter set of the distribution.
5723             */
5724             void
5725             param(const param_type& __param)
5726             { _M_param = __param; }
5727              
5728             /**
5729             * @brief Returns the greatest lower bound value of the distribution.
5730             */
5731             result_type
5732             min() const
5733             {
5734             return _M_param._M_int.empty()
5735             ? result_type(0) : _M_param._M_int.front();
5736             }
5737              
5738             /**
5739             * @brief Returns the least upper bound value of the distribution.
5740             */
5741             result_type
5742             max() const
5743             {
5744             return _M_param._M_int.empty()
5745             ? result_type(1) : _M_param._M_int.back();
5746             }
5747              
5748             /**
5749             * @brief Generating functions.
5750             */
5751             template
5752             result_type
5753             operator()(_UniformRandomNumberGenerator& __urng)
5754             { return this->operator()(__urng, _M_param); }
5755              
5756             template
5757             result_type
5758             operator()(_UniformRandomNumberGenerator& __urng,
5759             const param_type& __p);
5760              
5761             template
5762             typename _UniformRandomNumberGenerator>
5763             void
5764             __generate(_ForwardIterator __f, _ForwardIterator __t,
5765             _UniformRandomNumberGenerator& __urng)
5766             { this->__generate(__f, __t, __urng, _M_param); }
5767              
5768             template
5769             typename _UniformRandomNumberGenerator>
5770             void
5771             __generate(_ForwardIterator __f, _ForwardIterator __t,
5772             _UniformRandomNumberGenerator& __urng,
5773             const param_type& __p)
5774             { this->__generate_impl(__f, __t, __urng, __p); }
5775              
5776             template
5777             void
5778             __generate(result_type* __f, result_type* __t,
5779             _UniformRandomNumberGenerator& __urng,
5780             const param_type& __p)
5781             { this->__generate_impl(__f, __t, __urng, __p); }
5782              
5783             /**
5784             * @brief Return true if two piecewise linear distributions have the
5785             * same parameters.
5786             */
5787             friend bool
5788             operator==(const piecewise_linear_distribution& __d1,
5789             const piecewise_linear_distribution& __d2)
5790             { return __d1._M_param == __d2._M_param; }
5791              
5792             /**
5793             * @brief Inserts a %piecewise_linear_distribution random number
5794             * distribution @p __x into the output stream @p __os.
5795             *
5796             * @param __os An output stream.
5797             * @param __x A %piecewise_linear_distribution random number
5798             * distribution.
5799             *
5800             * @returns The output stream with the state of @p __x inserted or in
5801             * an error state.
5802             */
5803             template
5804             friend std::basic_ostream<_CharT, _Traits>&
5805             operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5806             const std::piecewise_linear_distribution<_RealType1>& __x);
5807              
5808             /**
5809             * @brief Extracts a %piecewise_linear_distribution random number
5810             * distribution @p __x from the input stream @p __is.
5811             *
5812             * @param __is An input stream.
5813             * @param __x A %piecewise_linear_distribution random number
5814             * generator engine.
5815             *
5816             * @returns The input stream with @p __x extracted or in an error
5817             * state.
5818             */
5819             template
5820             friend std::basic_istream<_CharT, _Traits>&
5821             operator>>(std::basic_istream<_CharT, _Traits>& __is,
5822             std::piecewise_linear_distribution<_RealType1>& __x);
5823              
5824             private:
5825             template
5826             typename _UniformRandomNumberGenerator>
5827             void
5828             __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
5829             _UniformRandomNumberGenerator& __urng,
5830             const param_type& __p);
5831              
5832             param_type _M_param;
5833             };
5834              
5835             /**
5836             * @brief Return true if two piecewise linear distributions have
5837             * different parameters.
5838             */
5839             template
5840             inline bool
5841             operator!=(const std::piecewise_linear_distribution<_RealType>& __d1,
5842             const std::piecewise_linear_distribution<_RealType>& __d2)
5843             { return !(__d1 == __d2); }
5844              
5845              
5846             /* @} */ // group random_distributions_poisson
5847              
5848             /* @} */ // group random_distributions
5849              
5850             /**
5851             * @addtogroup random_utilities Random Number Utilities
5852             * @ingroup random
5853             * @{
5854             */
5855              
5856             /**
5857             * @brief The seed_seq class generates sequences of seeds for random
5858             * number generators.
5859             */
5860             class seed_seq
5861             {
5862              
5863             public:
5864             /** The type of the seed vales. */
5865             typedef uint_least32_t result_type;
5866              
5867             /** Default constructor. */
5868             seed_seq()
5869             : _M_v()
5870             { }
5871              
5872             template
5873             seed_seq(std::initializer_list<_IntType> il);
5874              
5875             template
5876             seed_seq(_InputIterator __begin, _InputIterator __end);
5877              
5878             // generating functions
5879             template
5880             void
5881             generate(_RandomAccessIterator __begin, _RandomAccessIterator __end);
5882              
5883             // property functions
5884             size_t size() const
5885             { return _M_v.size(); }
5886              
5887             template
5888             void
5889             param(OutputIterator __dest) const
5890             { std::copy(_M_v.begin(), _M_v.end(), __dest); }
5891              
5892             private:
5893             ///
5894             std::vector _M_v;
5895             };
5896              
5897             /* @} */ // group random_utilities
5898              
5899             /* @} */ // group random
5900              
5901             _GLIBCXX_END_NAMESPACE_VERSION
5902             } // namespace std
5903              
5904             #endif