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