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