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