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