OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libstdc++-v3/] [include/] [bits/] [random.h] - Blame information for rev 748

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// 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>
71
                          (std::numeric_limits<_UIntType>::digits)>
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,
118
                                    std::numeric_limits<_DInputType>::digits,
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>
170
    class linear_congruential_engine
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
202
      linear_congruential_engine(result_type __s = default_seed)
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
212
        std::enable_if<!std::is_same<_Sseq, linear_congruential_engine>::value>
213
               ::type>
214
        explicit
215
        linear_congruential_engine(_Sseq& __q)
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>
235
        typename std::enable_if<std::is_class<_Sseq>::value>::type
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
       */
268
      result_type
269
      operator()()
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
287
      operator==(const linear_congruential_engine& __lhs,
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>
301
        friend std::basic_ostream<_CharT, _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>
321
        friend std::basic_istream<_CharT, _Traits>&
322
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
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>
383
    class mersenne_twister_engine
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
444
        std::enable_if<!std::is_same<_Sseq, mersenne_twister_engine>::value>
445
               ::type>
446
        explicit
447
        mersenne_twister_engine(_Sseq& __q)
448
        { seed(__q); }
449
 
450
      void
451
      seed(result_type __sd = default_seed);
452
 
453
      template<typename _Sseq>
454
        typename std::enable_if<std::is_class<_Sseq>::value>::type
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
 
481
      result_type
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
497
      operator==(const mersenne_twister_engine& __lhs,
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>
522
        friend std::basic_ostream<_CharT, _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>
548
        friend std::basic_istream<_CharT, _Traits>&
549
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
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
638
        std::enable_if<!std::is_same<_Sseq, subtract_with_carry_engine>::value>
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>
664
        typename std::enable_if<std::is_class<_Sseq>::value>::type
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>
732
        friend std::basic_ostream<_CharT, _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>
751
        friend std::basic_istream<_CharT, _Traits>&
752
        operator>>(std::basic_istream<_CharT, _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>
790
    class discard_block_engine
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
       */
808
      discard_block_engine()
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
838
      discard_block_engine(result_type __s)
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
847
        std::enable_if<!std::is_same<_Sseq, discard_block_engine>::value
848
                       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
849
               ::type>
850
        explicit
851
        discard_block_engine(_Sseq& __q)
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
860
      seed()
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
871
      seed(result_type __s)
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
       */
925
      result_type
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
940
      operator==(const discard_block_engine& __lhs,
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>
957
        friend std::basic_ostream<_CharT, _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>
975
        friend std::basic_istream<_CharT, _Traits>&
976
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
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>
1010
    class independent_bits_engine
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
       */
1026
      independent_bits_engine()
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
1056
      independent_bits_engine(result_type __s)
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
1065
        std::enable_if<!std::is_same<_Sseq, independent_bits_engine>::value
1066
                       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
1067
               ::type>
1068
        explicit
1069
        independent_bits_engine(_Sseq& __q)
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
1078
      seed()
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
1086
      seed(result_type __s)
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
1111
      min()
1112
      { return 0U; }
1113
 
1114
      /**
1115
       * @brief Gets the maximum value in the generated random number range.
1116
       */
1117
      static constexpr result_type
1118
      max()
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
1150
      operator==(const independent_bits_engine& __lhs,
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>
1167
        friend std::basic_istream<_CharT, _Traits>&
1168
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
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>
1212
    std::basic_ostream<_CharT, _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>
1228
    class shuffle_order_engine
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
       */
1244
      shuffle_order_engine()
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
1277
      shuffle_order_engine(result_type __s)
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
1287
        std::enable_if<!std::is_same<_Sseq, shuffle_order_engine>::value
1288
                       && !std::is_same<_Sseq, _RandomNumberEngine>::value>
1289
               ::type>
1290
        explicit
1291
        shuffle_order_engine(_Sseq& __q)
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
1300
      seed()
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
1311
      seed(result_type __s)
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
1341
      min()
1342
      { return _RandomNumberEngine::min(); }
1343
 
1344
      /**
1345
       * Gets the maximum value in the generated random number range.
1346
       */
1347
      static constexpr result_type
1348
      max()
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
1379
      operator==(const shuffle_order_engine& __lhs,
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>
1398
        friend std::basic_ostream<_CharT, _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>
1416
        friend std::basic_istream<_CharT, _Traits>&
1417
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
1418
                   std::shuffle_order_engine<_RandomNumberEngine1, __k1>& __x);
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>
1457
  minstd_rand0;
1458
 
1459
  /**
1460
   * An alternative LCR (Lehmer Generator function).
1461
   */
1462
  typedef linear_congruential_engine<uint_fast32_t, 48271UL, 0UL, 2147483647UL>
1463
  minstd_rand;
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
 
1499
  typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
1500
 
1501
  typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
1502
 
1503
  typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
1504
 
1505
  typedef minstd_rand0 default_random_engine;
1506
 
1507
  /**
1508
   * A standard interface to a platform-specific non-deterministic
1509
   * random number generator (if any are available).
1510
   */
1511
  class random_device
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()
1562
    { return std::numeric_limits<result_type>::min(); }
1563
 
1564
    static constexpr result_type
1565
    max()
1566
    { return std::numeric_limits<result_type>::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>
1618
    class uniform_int_distribution
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
      {
1629
        typedef uniform_int_distribution<_IntType> distribution_type;
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
1738
    operator==(const std::uniform_int_distribution<_IntType>& __d1,
1739
               const std::uniform_int_distribution<_IntType>& __d2)
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
1748
    operator!=(const std::uniform_int_distribution<_IntType>& __d1,
1749
               const std::uniform_int_distribution<_IntType>& __d2)
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>
1763
    std::basic_ostream<_CharT, _Traits>&
1764
    operator<<(std::basic_ostream<_CharT, _Traits>&,
1765
               const std::uniform_int_distribution<_IntType>&);
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>
1777
    std::basic_istream<_CharT, _Traits>&
1778
    operator>>(std::basic_istream<_CharT, _Traits>&,
1779
               std::uniform_int_distribution<_IntType>&);
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>
1790
    class uniform_real_distribution
1791
    {
1792
      static_assert(std::is_floating_point<_RealType>::value,
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
      {
1801
        typedef uniform_real_distribution<_RealType> distribution_type;
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
1919
    operator==(const std::uniform_real_distribution<_IntType>& __d1,
1920
               const std::uniform_real_distribution<_IntType>& __d2)
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
1929
    operator!=(const std::uniform_real_distribution<_IntType>& __d1,
1930
               const std::uniform_real_distribution<_IntType>& __d2)
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>
1944
    std::basic_ostream<_CharT, _Traits>&
1945
    operator<<(std::basic_ostream<_CharT, _Traits>&,
1946
               const std::uniform_real_distribution<_RealType>&);
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>
1958
    std::basic_istream<_CharT, _Traits>&
1959
    operator>>(std::basic_istream<_CharT, _Traits>&,
1960
               std::uniform_real_distribution<_RealType>&);
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>
1980
    class normal_distribution
1981
    {
1982
      static_assert(std::is_floating_point<_RealType>::value,
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
      {
1991
        typedef normal_distribution<_RealType> distribution_type;
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
2025
      normal_distribution(result_type __mean = result_type(0),
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
2039
      reset()
2040
      { _M_saved_available = false; }
2041
 
2042
      /**
2043
       * @brief Returns the mean of the distribution.
2044
       */
2045
      _RealType
2046
      mean() const
2047
      { return _M_param.mean(); }
2048
 
2049
      /**
2050
       * @brief Returns the standard deviation of the distribution.
2051
       */
2052
      _RealType
2053
      stddev() const
2054
      { return _M_param.stddev(); }
2055
 
2056
      /**
2057
       * @brief Returns the parameter set of the distribution.
2058
       */
2059
      param_type
2060
      param() const
2061
      { return _M_param; }
2062
 
2063
      /**
2064
       * @brief Sets the parameter set of the distribution.
2065
       * @param __param The new parameter set of the distribution.
2066
       */
2067
      void
2068
      param(const param_type& __param)
2069
      { _M_param = __param; }
2070
 
2071
      /**
2072
       * @brief Returns the greatest lower bound value of the distribution.
2073
       */
2074
      result_type
2075
      min() const
2076
      { return std::numeric_limits<result_type>::min(); }
2077
 
2078
      /**
2079
       * @brief Returns the least upper bound value of the distribution.
2080
       */
2081
      result_type
2082
      max() const
2083
      { return std::numeric_limits<result_type>::max(); }
2084
 
2085
      /**
2086
       * @brief Generating functions.
2087
       */
2088
      template<typename _UniformRandomNumberGenerator>
2089
        result_type
2090
        operator()(_UniformRandomNumberGenerator& __urng)
2091
        { return this->operator()(__urng, 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
2105
        operator==(const std::normal_distribution<_RealType1>& __d1,
2106
                   const std::normal_distribution<_RealType1>& __d2);
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>
2119
        friend std::basic_ostream<_CharT, _Traits>&
2120
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2121
                   const std::normal_distribution<_RealType1>& __x);
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>
2134
        friend std::basic_istream<_CharT, _Traits>&
2135
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
2136
                   std::normal_distribution<_RealType1>& __x);
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,
2150
               const std::normal_distribution<_RealType>& __d2)
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>
2164
    class lognormal_distribution
2165
    {
2166
      static_assert(std::is_floating_point<_RealType>::value,
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
      {
2175
        typedef lognormal_distribution<_RealType> distribution_type;
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
2215
      reset()
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
2256
      { return std::numeric_limits<result_type>::max(); }
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
      template<typename _RealType1>
2278
        friend bool
2279
        operator==(const std::lognormal_distribution<_RealType1>& __d1,
2280
                   const std::lognormal_distribution<_RealType1>& __d2)
2281
        { return (__d1.param() == __d2.param()
2282
                  && __d1._M_nd == __d2._M_nd); }
2283
 
2284
      /**
2285
       * @brief Inserts a %lognormal_distribution random number distribution
2286
       * @p __x into the output stream @p __os.
2287
       *
2288
       * @param __os An output stream.
2289
       * @param __x  A %lognormal_distribution random number distribution.
2290
       *
2291
       * @returns The output stream with the state of @p __x inserted or in
2292
       * an error state.
2293
       */
2294
      template<typename _RealType1, typename _CharT, typename _Traits>
2295
        friend std::basic_ostream<_CharT, _Traits>&
2296
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2297
                   const std::lognormal_distribution<_RealType1>& __x);
2298
 
2299
      /**
2300
       * @brief Extracts a %lognormal_distribution random number distribution
2301
       * @p __x from the input stream @p __is.
2302
       *
2303
       * @param __is An input stream.
2304
       * @param __x A %lognormal_distribution random number
2305
       *            generator engine.
2306
       *
2307
       * @returns The input stream with @p __x extracted or in an error state.
2308
       */
2309
      template<typename _RealType1, typename _CharT, typename _Traits>
2310
        friend std::basic_istream<_CharT, _Traits>&
2311
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
2312
                   std::lognormal_distribution<_RealType1>& __x);
2313
 
2314
    private:
2315
      param_type _M_param;
2316
 
2317
      std::normal_distribution<result_type> _M_nd;
2318
    };
2319
 
2320
  /**
2321
   * @brief Return true if two lognormal distributions are different.
2322
   */
2323
  template<typename _RealType>
2324
    inline bool
2325
    operator!=(const std::lognormal_distribution<_RealType>& __d1,
2326
               const std::lognormal_distribution<_RealType>& __d2)
2327
    { return !(__d1 == __d2); }
2328
 
2329
 
2330
  /**
2331
   * @brief A gamma continuous distribution for random numbers.
2332
   *
2333
   * The formula for the gamma probability density function is:
2334
   * @f[
2335
   *     p(x|\alpha,\beta) = \frac{1}{\beta\Gamma(\alpha)}
2336
   *                         (x/\beta)^{\alpha - 1} e^{-x/\beta}
2337
   * @f]
2338
   */
2339
  template<typename _RealType = double>
2340
    class gamma_distribution
2341
    {
2342
      static_assert(std::is_floating_point<_RealType>::value,
2343
                    "template argument not a floating point type");
2344
 
2345
    public:
2346
      /** The type of the range of the distribution. */
2347
      typedef _RealType result_type;
2348
      /** Parameter type. */
2349
      struct param_type
2350
      {
2351
        typedef gamma_distribution<_RealType> distribution_type;
2352
        friend class gamma_distribution<_RealType>;
2353
 
2354
        explicit
2355
        param_type(_RealType __alpha_val = _RealType(1),
2356
                   _RealType __beta_val = _RealType(1))
2357
        : _M_alpha(__alpha_val), _M_beta(__beta_val)
2358
        {
2359
          _GLIBCXX_DEBUG_ASSERT(_M_alpha > _RealType(0));
2360
          _M_initialize();
2361
        }
2362
 
2363
        _RealType
2364
        alpha() const
2365
        { return _M_alpha; }
2366
 
2367
        _RealType
2368
        beta() const
2369
        { return _M_beta; }
2370
 
2371
        friend bool
2372
        operator==(const param_type& __p1, const param_type& __p2)
2373
        { return (__p1._M_alpha == __p2._M_alpha
2374
                  && __p1._M_beta == __p2._M_beta); }
2375
 
2376
      private:
2377
        void
2378
        _M_initialize();
2379
 
2380
        _RealType _M_alpha;
2381
        _RealType _M_beta;
2382
 
2383
        _RealType _M_malpha, _M_a2;
2384
      };
2385
 
2386
    public:
2387
      /**
2388
       * @brief Constructs a gamma distribution with parameters
2389
       * @f$\alpha@f$ and @f$\beta@f$.
2390
       */
2391
      explicit
2392
      gamma_distribution(_RealType __alpha_val = _RealType(1),
2393
                         _RealType __beta_val = _RealType(1))
2394
      : _M_param(__alpha_val, __beta_val), _M_nd()
2395
      { }
2396
 
2397
      explicit
2398
      gamma_distribution(const param_type& __p)
2399
      : _M_param(__p), _M_nd()
2400
      { }
2401
 
2402
      /**
2403
       * @brief Resets the distribution state.
2404
       */
2405
      void
2406
      reset()
2407
      { _M_nd.reset(); }
2408
 
2409
      /**
2410
       * @brief Returns the @f$\alpha@f$ of the distribution.
2411
       */
2412
      _RealType
2413
      alpha() const
2414
      { return _M_param.alpha(); }
2415
 
2416
      /**
2417
       * @brief Returns the @f$\beta@f$ of the distribution.
2418
       */
2419
      _RealType
2420
      beta() const
2421
      { return _M_param.beta(); }
2422
 
2423
      /**
2424
       * @brief Returns the parameter set of the distribution.
2425
       */
2426
      param_type
2427
      param() const
2428
      { return _M_param; }
2429
 
2430
      /**
2431
       * @brief Sets the parameter set of the distribution.
2432
       * @param __param The new parameter set of the distribution.
2433
       */
2434
      void
2435
      param(const param_type& __param)
2436
      { _M_param = __param; }
2437
 
2438
      /**
2439
       * @brief Returns the greatest lower bound value of the distribution.
2440
       */
2441
      result_type
2442
      min() const
2443
      { return result_type(0); }
2444
 
2445
      /**
2446
       * @brief Returns the least upper bound value of the distribution.
2447
       */
2448
      result_type
2449
      max() const
2450
      { return std::numeric_limits<result_type>::max(); }
2451
 
2452
      /**
2453
       * @brief Generating functions.
2454
       */
2455
      template<typename _UniformRandomNumberGenerator>
2456
        result_type
2457
        operator()(_UniformRandomNumberGenerator& __urng)
2458
        { return this->operator()(__urng, this->param()); }
2459
 
2460
      template<typename _UniformRandomNumberGenerator>
2461
        result_type
2462
        operator()(_UniformRandomNumberGenerator& __urng,
2463
                   const param_type& __p);
2464
 
2465
      /**
2466
       * @brief Return true if two gamma distributions have the same
2467
       *        parameters and the sequences that would be generated
2468
       *        are equal.
2469
       */
2470
      template<typename _RealType1>
2471
        friend bool
2472
        operator==(const std::gamma_distribution<_RealType1>& __d1,
2473
                   const std::gamma_distribution<_RealType1>& __d2)
2474
        { return (__d1.param() == __d2.param()
2475
                  && __d1._M_nd == __d2._M_nd); }
2476
 
2477
      /**
2478
       * @brief Inserts a %gamma_distribution random number distribution
2479
       * @p __x into the output stream @p __os.
2480
       *
2481
       * @param __os An output stream.
2482
       * @param __x  A %gamma_distribution random number distribution.
2483
       *
2484
       * @returns The output stream with the state of @p __x inserted or in
2485
       * an error state.
2486
       */
2487
      template<typename _RealType1, typename _CharT, typename _Traits>
2488
        friend std::basic_ostream<_CharT, _Traits>&
2489
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2490
                   const std::gamma_distribution<_RealType1>& __x);
2491
 
2492
      /**
2493
       * @brief Extracts a %gamma_distribution random number distribution
2494
       * @p __x from the input stream @p __is.
2495
       *
2496
       * @param __is An input stream.
2497
       * @param __x  A %gamma_distribution random number generator engine.
2498
       *
2499
       * @returns The input stream with @p __x extracted or in an error state.
2500
       */
2501
      template<typename _RealType1, typename _CharT, typename _Traits>
2502
        friend std::basic_istream<_CharT, _Traits>&
2503
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
2504
                   std::gamma_distribution<_RealType1>& __x);
2505
 
2506
    private:
2507
      param_type _M_param;
2508
 
2509
      std::normal_distribution<result_type> _M_nd;
2510
    };
2511
 
2512
  /**
2513
   * @brief Return true if two gamma distributions are different.
2514
   */
2515
   template<typename _RealType>
2516
    inline bool
2517
     operator!=(const std::gamma_distribution<_RealType>& __d1,
2518
                const std::gamma_distribution<_RealType>& __d2)
2519
    { return !(__d1 == __d2); }
2520
 
2521
 
2522
  /**
2523
   * @brief A chi_squared_distribution random number distribution.
2524
   *
2525
   * The formula for the normal probability mass function is
2526
   * @f$p(x|n) = \frac{x^{(n/2) - 1}e^{-x/2}}{\Gamma(n/2) 2^{n/2}}@f$
2527
   */
2528
  template<typename _RealType = double>
2529
    class chi_squared_distribution
2530
    {
2531
      static_assert(std::is_floating_point<_RealType>::value,
2532
                    "template argument not a floating point type");
2533
 
2534
    public:
2535
      /** The type of the range of the distribution. */
2536
      typedef _RealType result_type;
2537
      /** Parameter type. */
2538
      struct param_type
2539
      {
2540
        typedef chi_squared_distribution<_RealType> distribution_type;
2541
 
2542
        explicit
2543
        param_type(_RealType __n = _RealType(1))
2544
        : _M_n(__n)
2545
        { }
2546
 
2547
        _RealType
2548
        n() const
2549
        { return _M_n; }
2550
 
2551
        friend bool
2552
        operator==(const param_type& __p1, const param_type& __p2)
2553
        { return __p1._M_n == __p2._M_n; }
2554
 
2555
      private:
2556
        _RealType _M_n;
2557
      };
2558
 
2559
      explicit
2560
      chi_squared_distribution(_RealType __n = _RealType(1))
2561
      : _M_param(__n), _M_gd(__n / 2)
2562
      { }
2563
 
2564
      explicit
2565
      chi_squared_distribution(const param_type& __p)
2566
      : _M_param(__p), _M_gd(__p.n() / 2)
2567
      { }
2568
 
2569
      /**
2570
       * @brief Resets the distribution state.
2571
       */
2572
      void
2573
      reset()
2574
      { _M_gd.reset(); }
2575
 
2576
      /**
2577
       *
2578
       */
2579
      _RealType
2580
      n() const
2581
      { return _M_param.n(); }
2582
 
2583
      /**
2584
       * @brief Returns the parameter set of the distribution.
2585
       */
2586
      param_type
2587
      param() const
2588
      { return _M_param; }
2589
 
2590
      /**
2591
       * @brief Sets the parameter set of the distribution.
2592
       * @param __param The new parameter set of the distribution.
2593
       */
2594
      void
2595
      param(const param_type& __param)
2596
      { _M_param = __param; }
2597
 
2598
      /**
2599
       * @brief Returns the greatest lower bound value of the distribution.
2600
       */
2601
      result_type
2602
      min() const
2603
      { return result_type(0); }
2604
 
2605
      /**
2606
       * @brief Returns the least upper bound value of the distribution.
2607
       */
2608
      result_type
2609
      max() const
2610
      { return std::numeric_limits<result_type>::max(); }
2611
 
2612
      /**
2613
       * @brief Generating functions.
2614
       */
2615
      template<typename _UniformRandomNumberGenerator>
2616
        result_type
2617
        operator()(_UniformRandomNumberGenerator& __urng)
2618
        { return 2 * _M_gd(__urng); }
2619
 
2620
      template<typename _UniformRandomNumberGenerator>
2621
        result_type
2622
        operator()(_UniformRandomNumberGenerator& __urng,
2623
                   const param_type& __p)
2624
        {
2625
          typedef typename std::gamma_distribution<result_type>::param_type
2626
            param_type;
2627
          return 2 * _M_gd(__urng, param_type(__p.n() / 2));
2628
        }
2629
 
2630
      /**
2631
       * @brief Return true if two Chi-squared distributions have
2632
       *        the same parameters and the sequences that would be
2633
       *        generated are equal.
2634
       */
2635
      template<typename _RealType1>
2636
        friend bool
2637
        operator==(const std::chi_squared_distribution<_RealType1>& __d1,
2638
                   const std::chi_squared_distribution<_RealType1>& __d2)
2639
        { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
2640
 
2641
      /**
2642
       * @brief Inserts a %chi_squared_distribution random number distribution
2643
       * @p __x into the output stream @p __os.
2644
       *
2645
       * @param __os An output stream.
2646
       * @param __x  A %chi_squared_distribution random number distribution.
2647
       *
2648
       * @returns The output stream with the state of @p __x inserted or in
2649
       * an error state.
2650
       */
2651
      template<typename _RealType1, typename _CharT, typename _Traits>
2652
        friend std::basic_ostream<_CharT, _Traits>&
2653
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2654
                   const std::chi_squared_distribution<_RealType1>& __x);
2655
 
2656
      /**
2657
       * @brief Extracts a %chi_squared_distribution random number distribution
2658
       * @p __x from the input stream @p __is.
2659
       *
2660
       * @param __is An input stream.
2661
       * @param __x A %chi_squared_distribution random number
2662
       *            generator engine.
2663
       *
2664
       * @returns The input stream with @p __x extracted or in an error state.
2665
       */
2666
      template<typename _RealType1, typename _CharT, typename _Traits>
2667
        friend std::basic_istream<_CharT, _Traits>&
2668
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
2669
                   std::chi_squared_distribution<_RealType1>& __x);
2670
 
2671
    private:
2672
      param_type _M_param;
2673
 
2674
      std::gamma_distribution<result_type> _M_gd;
2675
    };
2676
 
2677
  /**
2678
   * @brief Return true if two Chi-squared distributions are different.
2679
   */
2680
  template<typename _RealType>
2681
    inline bool
2682
    operator!=(const std::chi_squared_distribution<_RealType>& __d1,
2683
               const std::chi_squared_distribution<_RealType>& __d2)
2684
    { return !(__d1 == __d2); }
2685
 
2686
 
2687
  /**
2688
   * @brief A cauchy_distribution random number distribution.
2689
   *
2690
   * The formula for the normal probability mass function is
2691
   * @f$p(x|a,b) = (\pi b (1 + (\frac{x-a}{b})^2))^{-1}@f$
2692
   */
2693
  template<typename _RealType = double>
2694
    class cauchy_distribution
2695
    {
2696
      static_assert(std::is_floating_point<_RealType>::value,
2697
                    "template argument not a floating point type");
2698
 
2699
    public:
2700
      /** The type of the range of the distribution. */
2701
      typedef _RealType result_type;
2702
      /** Parameter type. */
2703
      struct param_type
2704
      {
2705
        typedef cauchy_distribution<_RealType> distribution_type;
2706
 
2707
        explicit
2708
        param_type(_RealType __a = _RealType(0),
2709
                   _RealType __b = _RealType(1))
2710
        : _M_a(__a), _M_b(__b)
2711
        { }
2712
 
2713
        _RealType
2714
        a() const
2715
        { return _M_a; }
2716
 
2717
        _RealType
2718
        b() const
2719
        { return _M_b; }
2720
 
2721
        friend bool
2722
        operator==(const param_type& __p1, const param_type& __p2)
2723
        { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
2724
 
2725
      private:
2726
        _RealType _M_a;
2727
        _RealType _M_b;
2728
      };
2729
 
2730
      explicit
2731
      cauchy_distribution(_RealType __a = _RealType(0),
2732
                          _RealType __b = _RealType(1))
2733
      : _M_param(__a, __b)
2734
      { }
2735
 
2736
      explicit
2737
      cauchy_distribution(const param_type& __p)
2738
      : _M_param(__p)
2739
      { }
2740
 
2741
      /**
2742
       * @brief Resets the distribution state.
2743
       */
2744
      void
2745
      reset()
2746
      { }
2747
 
2748
      /**
2749
       *
2750
       */
2751
      _RealType
2752
      a() const
2753
      { return _M_param.a(); }
2754
 
2755
      _RealType
2756
      b() const
2757
      { return _M_param.b(); }
2758
 
2759
      /**
2760
       * @brief Returns the parameter set of the distribution.
2761
       */
2762
      param_type
2763
      param() const
2764
      { return _M_param; }
2765
 
2766
      /**
2767
       * @brief Sets the parameter set of the distribution.
2768
       * @param __param The new parameter set of the distribution.
2769
       */
2770
      void
2771
      param(const param_type& __param)
2772
      { _M_param = __param; }
2773
 
2774
      /**
2775
       * @brief Returns the greatest lower bound value of the distribution.
2776
       */
2777
      result_type
2778
      min() const
2779
      { return std::numeric_limits<result_type>::min(); }
2780
 
2781
      /**
2782
       * @brief Returns the least upper bound value of the distribution.
2783
       */
2784
      result_type
2785
      max() const
2786
      { return std::numeric_limits<result_type>::max(); }
2787
 
2788
      /**
2789
       * @brief Generating functions.
2790
       */
2791
      template<typename _UniformRandomNumberGenerator>
2792
        result_type
2793
        operator()(_UniformRandomNumberGenerator& __urng)
2794
        { return this->operator()(__urng, this->param()); }
2795
 
2796
      template<typename _UniformRandomNumberGenerator>
2797
        result_type
2798
        operator()(_UniformRandomNumberGenerator& __urng,
2799
                   const param_type& __p);
2800
 
2801
    private:
2802
      param_type _M_param;
2803
    };
2804
 
2805
  /**
2806
   * @brief Return true if two Cauchy distributions have
2807
   *        the same parameters.
2808
   */
2809
  template<typename _RealType>
2810
    inline bool
2811
    operator==(const std::cauchy_distribution<_RealType>& __d1,
2812
               const std::cauchy_distribution<_RealType>& __d2)
2813
    { return __d1.param() == __d2.param(); }
2814
 
2815
  /**
2816
   * @brief Return true if two Cauchy distributions have
2817
   *        different parameters.
2818
   */
2819
  template<typename _RealType>
2820
    inline bool
2821
    operator!=(const std::cauchy_distribution<_RealType>& __d1,
2822
               const std::cauchy_distribution<_RealType>& __d2)
2823
    { return !(__d1 == __d2); }
2824
 
2825
  /**
2826
   * @brief Inserts a %cauchy_distribution random number distribution
2827
   * @p __x into the output stream @p __os.
2828
   *
2829
   * @param __os An output stream.
2830
   * @param __x  A %cauchy_distribution random number distribution.
2831
   *
2832
   * @returns The output stream with the state of @p __x inserted or in
2833
   * an error state.
2834
   */
2835
  template<typename _RealType, typename _CharT, typename _Traits>
2836
    std::basic_ostream<_CharT, _Traits>&
2837
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2838
               const std::cauchy_distribution<_RealType>& __x);
2839
 
2840
  /**
2841
   * @brief Extracts a %cauchy_distribution random number distribution
2842
   * @p __x from the input stream @p __is.
2843
   *
2844
   * @param __is An input stream.
2845
   * @param __x A %cauchy_distribution random number
2846
   *            generator engine.
2847
   *
2848
   * @returns The input stream with @p __x extracted or in an error state.
2849
   */
2850
  template<typename _RealType, typename _CharT, typename _Traits>
2851
    std::basic_istream<_CharT, _Traits>&
2852
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
2853
               std::cauchy_distribution<_RealType>& __x);
2854
 
2855
 
2856
  /**
2857
   * @brief A fisher_f_distribution random number distribution.
2858
   *
2859
   * The formula for the normal probability mass function is
2860
   * @f[
2861
   *     p(x|m,n) = \frac{\Gamma((m+n)/2)}{\Gamma(m/2)\Gamma(n/2)}
2862
   *                (\frac{m}{n})^{m/2} x^{(m/2)-1}
2863
   *                (1 + \frac{mx}{n})^{-(m+n)/2}
2864
   * @f]
2865
   */
2866
  template<typename _RealType = double>
2867
    class fisher_f_distribution
2868
    {
2869
      static_assert(std::is_floating_point<_RealType>::value,
2870
                    "template argument not a floating point type");
2871
 
2872
    public:
2873
      /** The type of the range of the distribution. */
2874
      typedef _RealType result_type;
2875
      /** Parameter type. */
2876
      struct param_type
2877
      {
2878
        typedef fisher_f_distribution<_RealType> distribution_type;
2879
 
2880
        explicit
2881
        param_type(_RealType __m = _RealType(1),
2882
                   _RealType __n = _RealType(1))
2883
        : _M_m(__m), _M_n(__n)
2884
        { }
2885
 
2886
        _RealType
2887
        m() const
2888
        { return _M_m; }
2889
 
2890
        _RealType
2891
        n() const
2892
        { return _M_n; }
2893
 
2894
        friend bool
2895
        operator==(const param_type& __p1, const param_type& __p2)
2896
        { return __p1._M_m == __p2._M_m && __p1._M_n == __p2._M_n; }
2897
 
2898
      private:
2899
        _RealType _M_m;
2900
        _RealType _M_n;
2901
      };
2902
 
2903
      explicit
2904
      fisher_f_distribution(_RealType __m = _RealType(1),
2905
                            _RealType __n = _RealType(1))
2906
      : _M_param(__m, __n), _M_gd_x(__m / 2), _M_gd_y(__n / 2)
2907
      { }
2908
 
2909
      explicit
2910
      fisher_f_distribution(const param_type& __p)
2911
      : _M_param(__p), _M_gd_x(__p.m() / 2), _M_gd_y(__p.n() / 2)
2912
      { }
2913
 
2914
      /**
2915
       * @brief Resets the distribution state.
2916
       */
2917
      void
2918
      reset()
2919
      {
2920
        _M_gd_x.reset();
2921
        _M_gd_y.reset();
2922
      }
2923
 
2924
      /**
2925
       *
2926
       */
2927
      _RealType
2928
      m() const
2929
      { return _M_param.m(); }
2930
 
2931
      _RealType
2932
      n() const
2933
      { return _M_param.n(); }
2934
 
2935
      /**
2936
       * @brief Returns the parameter set of the distribution.
2937
       */
2938
      param_type
2939
      param() const
2940
      { return _M_param; }
2941
 
2942
      /**
2943
       * @brief Sets the parameter set of the distribution.
2944
       * @param __param The new parameter set of the distribution.
2945
       */
2946
      void
2947
      param(const param_type& __param)
2948
      { _M_param = __param; }
2949
 
2950
      /**
2951
       * @brief Returns the greatest lower bound value of the distribution.
2952
       */
2953
      result_type
2954
      min() const
2955
      { return result_type(0); }
2956
 
2957
      /**
2958
       * @brief Returns the least upper bound value of the distribution.
2959
       */
2960
      result_type
2961
      max() const
2962
      { return std::numeric_limits<result_type>::max(); }
2963
 
2964
      /**
2965
       * @brief Generating functions.
2966
       */
2967
      template<typename _UniformRandomNumberGenerator>
2968
        result_type
2969
        operator()(_UniformRandomNumberGenerator& __urng)
2970
        { return (_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()); }
2971
 
2972
      template<typename _UniformRandomNumberGenerator>
2973
        result_type
2974
        operator()(_UniformRandomNumberGenerator& __urng,
2975
                   const param_type& __p)
2976
        {
2977
          typedef typename std::gamma_distribution<result_type>::param_type
2978
            param_type;
2979
          return ((_M_gd_x(__urng, param_type(__p.m() / 2)) * n())
2980
                  / (_M_gd_y(__urng, param_type(__p.n() / 2)) * m()));
2981
        }
2982
 
2983
      /**
2984
       * @brief Return true if two Fisher f distributions have
2985
       *        the same parameters and the sequences that would
2986
       *        be generated are equal.
2987
       */
2988
      template<typename _RealType1>
2989
        friend bool
2990
        operator==(const std::fisher_f_distribution<_RealType1>& __d1,
2991
                   const std::fisher_f_distribution<_RealType1>& __d2)
2992
        { return (__d1.param() == __d2.param()
2993
                  && __d1._M_gd_x == __d2._M_gd_x
2994
                  && __d1._M_gd_y == __d2._M_gd_y); }
2995
 
2996
      /**
2997
       * @brief Inserts a %fisher_f_distribution random number distribution
2998
       * @p __x into the output stream @p __os.
2999
       *
3000
       * @param __os An output stream.
3001
       * @param __x  A %fisher_f_distribution random number distribution.
3002
       *
3003
       * @returns The output stream with the state of @p __x inserted or in
3004
       * an error state.
3005
       */
3006
      template<typename _RealType1, typename _CharT, typename _Traits>
3007
        friend std::basic_ostream<_CharT, _Traits>&
3008
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3009
                   const std::fisher_f_distribution<_RealType1>& __x);
3010
 
3011
      /**
3012
       * @brief Extracts a %fisher_f_distribution random number distribution
3013
       * @p __x from the input stream @p __is.
3014
       *
3015
       * @param __is An input stream.
3016
       * @param __x A %fisher_f_distribution random number
3017
       *            generator engine.
3018
       *
3019
       * @returns The input stream with @p __x extracted or in an error state.
3020
       */
3021
      template<typename _RealType1, typename _CharT, typename _Traits>
3022
        friend std::basic_istream<_CharT, _Traits>&
3023
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
3024
                   std::fisher_f_distribution<_RealType1>& __x);
3025
 
3026
    private:
3027
      param_type _M_param;
3028
 
3029
      std::gamma_distribution<result_type> _M_gd_x, _M_gd_y;
3030
    };
3031
 
3032
  /**
3033
   * @brief Return true if two Fisher f distributions are diferent.
3034
   */
3035
  template<typename _RealType>
3036
    inline bool
3037
    operator!=(const std::fisher_f_distribution<_RealType>& __d1,
3038
               const std::fisher_f_distribution<_RealType>& __d2)
3039
    { return !(__d1 == __d2); }
3040
 
3041
  /**
3042
   * @brief A student_t_distribution random number distribution.
3043
   *
3044
   * The formula for the normal probability mass function is:
3045
   * @f[
3046
   *     p(x|n) = \frac{1}{\sqrt(n\pi)} \frac{\Gamma((n+1)/2)}{\Gamma(n/2)}
3047
   *              (1 + \frac{x^2}{n}) ^{-(n+1)/2}
3048
   * @f]
3049
   */
3050
  template<typename _RealType = double>
3051
    class student_t_distribution
3052
    {
3053
      static_assert(std::is_floating_point<_RealType>::value,
3054
                    "template argument not a floating point type");
3055
 
3056
    public:
3057
      /** The type of the range of the distribution. */
3058
      typedef _RealType result_type;
3059
      /** Parameter type. */
3060
      struct param_type
3061
      {
3062
        typedef student_t_distribution<_RealType> distribution_type;
3063
 
3064
        explicit
3065
        param_type(_RealType __n = _RealType(1))
3066
        : _M_n(__n)
3067
        { }
3068
 
3069
        _RealType
3070
        n() const
3071
        { return _M_n; }
3072
 
3073
        friend bool
3074
        operator==(const param_type& __p1, const param_type& __p2)
3075
        { return __p1._M_n == __p2._M_n; }
3076
 
3077
      private:
3078
        _RealType _M_n;
3079
      };
3080
 
3081
      explicit
3082
      student_t_distribution(_RealType __n = _RealType(1))
3083
      : _M_param(__n), _M_nd(), _M_gd(__n / 2, 2)
3084
      { }
3085
 
3086
      explicit
3087
      student_t_distribution(const param_type& __p)
3088
      : _M_param(__p), _M_nd(), _M_gd(__p.n() / 2, 2)
3089
      { }
3090
 
3091
      /**
3092
       * @brief Resets the distribution state.
3093
       */
3094
      void
3095
      reset()
3096
      {
3097
        _M_nd.reset();
3098
        _M_gd.reset();
3099
      }
3100
 
3101
      /**
3102
       *
3103
       */
3104
      _RealType
3105
      n() const
3106
      { return _M_param.n(); }
3107
 
3108
      /**
3109
       * @brief Returns the parameter set of the distribution.
3110
       */
3111
      param_type
3112
      param() const
3113
      { return _M_param; }
3114
 
3115
      /**
3116
       * @brief Sets the parameter set of the distribution.
3117
       * @param __param The new parameter set of the distribution.
3118
       */
3119
      void
3120
      param(const param_type& __param)
3121
      { _M_param = __param; }
3122
 
3123
      /**
3124
       * @brief Returns the greatest lower bound value of the distribution.
3125
       */
3126
      result_type
3127
      min() const
3128
      { return std::numeric_limits<result_type>::min(); }
3129
 
3130
      /**
3131
       * @brief Returns the least upper bound value of the distribution.
3132
       */
3133
      result_type
3134
      max() const
3135
      { return std::numeric_limits<result_type>::max(); }
3136
 
3137
      /**
3138
       * @brief Generating functions.
3139
       */
3140
      template<typename _UniformRandomNumberGenerator>
3141
        result_type
3142
        operator()(_UniformRandomNumberGenerator& __urng)
3143
        { return _M_nd(__urng) * std::sqrt(n() / _M_gd(__urng)); }
3144
 
3145
      template<typename _UniformRandomNumberGenerator>
3146
        result_type
3147
        operator()(_UniformRandomNumberGenerator& __urng,
3148
                   const param_type& __p)
3149
        {
3150
          typedef typename std::gamma_distribution<result_type>::param_type
3151
            param_type;
3152
 
3153
          const result_type __g = _M_gd(__urng, param_type(__p.n() / 2, 2));
3154
          return _M_nd(__urng) * std::sqrt(__p.n() / __g);
3155
        }
3156
 
3157
      /**
3158
       * @brief Return true if two Student t distributions have
3159
       *        the same parameters and the sequences that would
3160
       *        be generated are equal.
3161
       */
3162
      template<typename _RealType1>
3163
        friend bool
3164
        operator==(const std::student_t_distribution<_RealType1>& __d1,
3165
                   const std::student_t_distribution<_RealType1>& __d2)
3166
        { return (__d1.param() == __d2.param()
3167
                  && __d1._M_nd == __d2._M_nd && __d1._M_gd == __d2._M_gd); }
3168
 
3169
      /**
3170
       * @brief Inserts a %student_t_distribution random number distribution
3171
       * @p __x into the output stream @p __os.
3172
       *
3173
       * @param __os An output stream.
3174
       * @param __x  A %student_t_distribution random number distribution.
3175
       *
3176
       * @returns The output stream with the state of @p __x inserted or in
3177
       * an error state.
3178
       */
3179
      template<typename _RealType1, typename _CharT, typename _Traits>
3180
        friend std::basic_ostream<_CharT, _Traits>&
3181
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3182
                   const std::student_t_distribution<_RealType1>& __x);
3183
 
3184
      /**
3185
       * @brief Extracts a %student_t_distribution random number distribution
3186
       * @p __x from the input stream @p __is.
3187
       *
3188
       * @param __is An input stream.
3189
       * @param __x A %student_t_distribution random number
3190
       *            generator engine.
3191
       *
3192
       * @returns The input stream with @p __x extracted or in an error state.
3193
       */
3194
      template<typename _RealType1, typename _CharT, typename _Traits>
3195
        friend std::basic_istream<_CharT, _Traits>&
3196
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
3197
                   std::student_t_distribution<_RealType1>& __x);
3198
 
3199
    private:
3200
      param_type _M_param;
3201
 
3202
      std::normal_distribution<result_type> _M_nd;
3203
      std::gamma_distribution<result_type> _M_gd;
3204
    };
3205
 
3206
  /**
3207
   * @brief Return true if two Student t distributions are different.
3208
   */
3209
  template<typename _RealType>
3210
    inline bool
3211
    operator!=(const std::student_t_distribution<_RealType>& __d1,
3212
               const std::student_t_distribution<_RealType>& __d2)
3213
    { return !(__d1 == __d2); }
3214
 
3215
 
3216
  /* @} */ // group random_distributions_normal
3217
 
3218
  /**
3219
   * @addtogroup random_distributions_bernoulli Bernoulli Distributions
3220
   * @ingroup random_distributions
3221
   * @{
3222
   */
3223
 
3224
  /**
3225
   * @brief A Bernoulli random number distribution.
3226
   *
3227
   * Generates a sequence of true and false values with likelihood @f$p@f$
3228
   * that true will come up and @f$(1 - p)@f$ that false will appear.
3229
   */
3230
  class bernoulli_distribution
3231
  {
3232
  public:
3233
    /** The type of the range of the distribution. */
3234
    typedef bool result_type;
3235
    /** Parameter type. */
3236
    struct param_type
3237
    {
3238
      typedef bernoulli_distribution distribution_type;
3239
 
3240
      explicit
3241
      param_type(double __p = 0.5)
3242
      : _M_p(__p)
3243
      {
3244
        _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
3245
      }
3246
 
3247
      double
3248
      p() const
3249
      { return _M_p; }
3250
 
3251
      friend bool
3252
      operator==(const param_type& __p1, const param_type& __p2)
3253
      { return __p1._M_p == __p2._M_p; }
3254
 
3255
    private:
3256
      double _M_p;
3257
    };
3258
 
3259
  public:
3260
    /**
3261
     * @brief Constructs a Bernoulli distribution with likelihood @p p.
3262
     *
3263
     * @param __p  [IN]  The likelihood of a true result being returned.
3264
     *                   Must be in the interval @f$[0, 1]@f$.
3265
     */
3266
    explicit
3267
    bernoulli_distribution(double __p = 0.5)
3268
    : _M_param(__p)
3269
    { }
3270
 
3271
    explicit
3272
    bernoulli_distribution(const param_type& __p)
3273
    : _M_param(__p)
3274
    { }
3275
 
3276
    /**
3277
     * @brief Resets the distribution state.
3278
     *
3279
     * Does nothing for a Bernoulli distribution.
3280
     */
3281
    void
3282
    reset() { }
3283
 
3284
    /**
3285
     * @brief Returns the @p p parameter of the distribution.
3286
     */
3287
    double
3288
    p() const
3289
    { return _M_param.p(); }
3290
 
3291
    /**
3292
     * @brief Returns the parameter set of the distribution.
3293
     */
3294
    param_type
3295
    param() const
3296
    { return _M_param; }
3297
 
3298
    /**
3299
     * @brief Sets the parameter set of the distribution.
3300
     * @param __param The new parameter set of the distribution.
3301
     */
3302
    void
3303
    param(const param_type& __param)
3304
    { _M_param = __param; }
3305
 
3306
    /**
3307
     * @brief Returns the greatest lower bound value of the distribution.
3308
     */
3309
    result_type
3310
    min() const
3311
    { return std::numeric_limits<result_type>::min(); }
3312
 
3313
    /**
3314
     * @brief Returns the least upper bound value of the distribution.
3315
     */
3316
    result_type
3317
    max() const
3318
    { return std::numeric_limits<result_type>::max(); }
3319
 
3320
    /**
3321
     * @brief Generating functions.
3322
     */
3323
    template<typename _UniformRandomNumberGenerator>
3324
      result_type
3325
      operator()(_UniformRandomNumberGenerator& __urng)
3326
      { return this->operator()(__urng, this->param()); }
3327
 
3328
    template<typename _UniformRandomNumberGenerator>
3329
      result_type
3330
      operator()(_UniformRandomNumberGenerator& __urng,
3331
                 const param_type& __p)
3332
      {
3333
        __detail::_Adaptor<_UniformRandomNumberGenerator, double>
3334
          __aurng(__urng);
3335
        if ((__aurng() - __aurng.min())
3336
             < __p.p() * (__aurng.max() - __aurng.min()))
3337
          return true;
3338
        return false;
3339
      }
3340
 
3341
  private:
3342
    param_type _M_param;
3343
  };
3344
 
3345
  /**
3346
   * @brief Return true if two Bernoulli distributions have
3347
   *        the same parameters.
3348
   */
3349
  inline bool
3350
  operator==(const std::bernoulli_distribution& __d1,
3351
             const std::bernoulli_distribution& __d2)
3352
  { return __d1.param() == __d2.param(); }
3353
 
3354
  /**
3355
   * @brief Return true if two Bernoulli distributions have
3356
   *        different parameters.
3357
   */
3358
  inline bool
3359
  operator!=(const std::bernoulli_distribution& __d1,
3360
             const std::bernoulli_distribution& __d2)
3361
  { return !(__d1 == __d2); }
3362
 
3363
  /**
3364
   * @brief Inserts a %bernoulli_distribution random number distribution
3365
   * @p __x into the output stream @p __os.
3366
   *
3367
   * @param __os An output stream.
3368
   * @param __x  A %bernoulli_distribution random number distribution.
3369
   *
3370
   * @returns The output stream with the state of @p __x inserted or in
3371
   * an error state.
3372
   */
3373
  template<typename _CharT, typename _Traits>
3374
    std::basic_ostream<_CharT, _Traits>&
3375
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3376
               const std::bernoulli_distribution& __x);
3377
 
3378
  /**
3379
   * @brief Extracts a %bernoulli_distribution random number distribution
3380
   * @p __x from the input stream @p __is.
3381
   *
3382
   * @param __is An input stream.
3383
   * @param __x  A %bernoulli_distribution random number generator engine.
3384
   *
3385
   * @returns The input stream with @p __x extracted or in an error state.
3386
   */
3387
  template<typename _CharT, typename _Traits>
3388
    std::basic_istream<_CharT, _Traits>&
3389
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
3390
               std::bernoulli_distribution& __x)
3391
    {
3392
      double __p;
3393
      __is >> __p;
3394
      __x.param(bernoulli_distribution::param_type(__p));
3395
      return __is;
3396
    }
3397
 
3398
 
3399
  /**
3400
   * @brief A discrete binomial random number distribution.
3401
   *
3402
   * The formula for the binomial probability density function is
3403
   * @f$p(i|t,p) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
3404
   * and @f$p@f$ are the parameters of the distribution.
3405
   */
3406
  template<typename _IntType = int>
3407
    class binomial_distribution
3408
    {
3409
      static_assert(std::is_integral<_IntType>::value,
3410
                    "template argument not an integral type");
3411
 
3412
    public:
3413
      /** The type of the range of the distribution. */
3414
      typedef _IntType result_type;
3415
      /** Parameter type. */
3416
      struct param_type
3417
      {
3418
        typedef binomial_distribution<_IntType> distribution_type;
3419
        friend class binomial_distribution<_IntType>;
3420
 
3421
        explicit
3422
        param_type(_IntType __t = _IntType(1), double __p = 0.5)
3423
        : _M_t(__t), _M_p(__p)
3424
        {
3425
          _GLIBCXX_DEBUG_ASSERT((_M_t >= _IntType(0))
3426
                                && (_M_p >= 0.0)
3427
                                && (_M_p <= 1.0));
3428
          _M_initialize();
3429
        }
3430
 
3431
        _IntType
3432
        t() const
3433
        { return _M_t; }
3434
 
3435
        double
3436
        p() const
3437
        { return _M_p; }
3438
 
3439
        friend bool
3440
        operator==(const param_type& __p1, const param_type& __p2)
3441
        { return __p1._M_t == __p2._M_t && __p1._M_p == __p2._M_p; }
3442
 
3443
      private:
3444
        void
3445
        _M_initialize();
3446
 
3447
        _IntType _M_t;
3448
        double _M_p;
3449
 
3450
        double _M_q;
3451
#if _GLIBCXX_USE_C99_MATH_TR1
3452
        double _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
3453
               _M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
3454
#endif
3455
        bool   _M_easy;
3456
      };
3457
 
3458
      // constructors and member function
3459
      explicit
3460
      binomial_distribution(_IntType __t = _IntType(1),
3461
                            double __p = 0.5)
3462
      : _M_param(__t, __p), _M_nd()
3463
      { }
3464
 
3465
      explicit
3466
      binomial_distribution(const param_type& __p)
3467
      : _M_param(__p), _M_nd()
3468
      { }
3469
 
3470
      /**
3471
       * @brief Resets the distribution state.
3472
       */
3473
      void
3474
      reset()
3475
      { _M_nd.reset(); }
3476
 
3477
      /**
3478
       * @brief Returns the distribution @p t parameter.
3479
       */
3480
      _IntType
3481
      t() const
3482
      { return _M_param.t(); }
3483
 
3484
      /**
3485
       * @brief Returns the distribution @p p parameter.
3486
       */
3487
      double
3488
      p() const
3489
      { return _M_param.p(); }
3490
 
3491
      /**
3492
       * @brief Returns the parameter set of the distribution.
3493
       */
3494
      param_type
3495
      param() const
3496
      { return _M_param; }
3497
 
3498
      /**
3499
       * @brief Sets the parameter set of the distribution.
3500
       * @param __param The new parameter set of the distribution.
3501
       */
3502
      void
3503
      param(const param_type& __param)
3504
      { _M_param = __param; }
3505
 
3506
      /**
3507
       * @brief Returns the greatest lower bound value of the distribution.
3508
       */
3509
      result_type
3510
      min() const
3511
      { return 0; }
3512
 
3513
      /**
3514
       * @brief Returns the least upper bound value of the distribution.
3515
       */
3516
      result_type
3517
      max() const
3518
      { return _M_param.t(); }
3519
 
3520
      /**
3521
       * @brief Generating functions.
3522
       */
3523
      template<typename _UniformRandomNumberGenerator>
3524
        result_type
3525
        operator()(_UniformRandomNumberGenerator& __urng)
3526
        { return this->operator()(__urng, this->param()); }
3527
 
3528
      template<typename _UniformRandomNumberGenerator>
3529
        result_type
3530
        operator()(_UniformRandomNumberGenerator& __urng,
3531
                   const param_type& __p);
3532
 
3533
      /**
3534
       * @brief Return true if two binomial distributions have
3535
       *        the same parameters and the sequences that would
3536
       *        be generated are equal.
3537
       */
3538
      template<typename _IntType1>
3539
        friend bool
3540
        operator==(const std::binomial_distribution<_IntType1>& __d1,
3541
                   const std::binomial_distribution<_IntType1>& __d2)
3542
#ifdef _GLIBCXX_USE_C99_MATH_TR1
3543
        { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
3544
#else
3545
        { return __d1.param() == __d2.param(); }
3546
#endif
3547
 
3548
      /**
3549
       * @brief Inserts a %binomial_distribution random number distribution
3550
       * @p __x into the output stream @p __os.
3551
       *
3552
       * @param __os An output stream.
3553
       * @param __x  A %binomial_distribution random number distribution.
3554
       *
3555
       * @returns The output stream with the state of @p __x inserted or in
3556
       * an error state.
3557
       */
3558
      template<typename _IntType1,
3559
               typename _CharT, typename _Traits>
3560
        friend std::basic_ostream<_CharT, _Traits>&
3561
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3562
                   const std::binomial_distribution<_IntType1>& __x);
3563
 
3564
      /**
3565
       * @brief Extracts a %binomial_distribution random number distribution
3566
       * @p __x from the input stream @p __is.
3567
       *
3568
       * @param __is An input stream.
3569
       * @param __x  A %binomial_distribution random number generator engine.
3570
       *
3571
       * @returns The input stream with @p __x extracted or in an error
3572
       *          state.
3573
       */
3574
      template<typename _IntType1,
3575
               typename _CharT, typename _Traits>
3576
        friend std::basic_istream<_CharT, _Traits>&
3577
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
3578
                   std::binomial_distribution<_IntType1>& __x);
3579
 
3580
    private:
3581
      template<typename _UniformRandomNumberGenerator>
3582
        result_type
3583
        _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t);
3584
 
3585
      param_type _M_param;
3586
 
3587
      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
3588
      std::normal_distribution<double> _M_nd;
3589
    };
3590
 
3591
  /**
3592
   * @brief Return true if two binomial distributions are different.
3593
   */
3594
  template<typename _IntType>
3595
    inline bool
3596
    operator!=(const std::binomial_distribution<_IntType>& __d1,
3597
               const std::binomial_distribution<_IntType>& __d2)
3598
    { return !(__d1 == __d2); }
3599
 
3600
 
3601
  /**
3602
   * @brief A discrete geometric random number distribution.
3603
   *
3604
   * The formula for the geometric probability density function is
3605
   * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
3606
   * distribution.
3607
   */
3608
  template<typename _IntType = int>
3609
    class geometric_distribution
3610
    {
3611
      static_assert(std::is_integral<_IntType>::value,
3612
                    "template argument not an integral type");
3613
 
3614
    public:
3615
      /** The type of the range of the distribution. */
3616
      typedef _IntType  result_type;
3617
      /** Parameter type. */
3618
      struct param_type
3619
      {
3620
        typedef geometric_distribution<_IntType> distribution_type;
3621
        friend class geometric_distribution<_IntType>;
3622
 
3623
        explicit
3624
        param_type(double __p = 0.5)
3625
        : _M_p(__p)
3626
        {
3627
          _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0) && (_M_p < 1.0));
3628
          _M_initialize();
3629
        }
3630
 
3631
        double
3632
        p() const
3633
        { return _M_p; }
3634
 
3635
        friend bool
3636
        operator==(const param_type& __p1, const param_type& __p2)
3637
        { return __p1._M_p == __p2._M_p; }
3638
 
3639
      private:
3640
        void
3641
        _M_initialize()
3642
        { _M_log_1_p = std::log(1.0 - _M_p); }
3643
 
3644
        double _M_p;
3645
 
3646
        double _M_log_1_p;
3647
      };
3648
 
3649
      // constructors and member function
3650
      explicit
3651
      geometric_distribution(double __p = 0.5)
3652
      : _M_param(__p)
3653
      { }
3654
 
3655
      explicit
3656
      geometric_distribution(const param_type& __p)
3657
      : _M_param(__p)
3658
      { }
3659
 
3660
      /**
3661
       * @brief Resets the distribution state.
3662
       *
3663
       * Does nothing for the geometric distribution.
3664
       */
3665
      void
3666
      reset() { }
3667
 
3668
      /**
3669
       * @brief Returns the distribution parameter @p p.
3670
       */
3671
      double
3672
      p() const
3673
      { return _M_param.p(); }
3674
 
3675
      /**
3676
       * @brief Returns the parameter set of the distribution.
3677
       */
3678
      param_type
3679
      param() const
3680
      { return _M_param; }
3681
 
3682
      /**
3683
       * @brief Sets the parameter set of the distribution.
3684
       * @param __param The new parameter set of the distribution.
3685
       */
3686
      void
3687
      param(const param_type& __param)
3688
      { _M_param = __param; }
3689
 
3690
      /**
3691
       * @brief Returns the greatest lower bound value of the distribution.
3692
       */
3693
      result_type
3694
      min() const
3695
      { return 0; }
3696
 
3697
      /**
3698
       * @brief Returns the least upper bound value of the distribution.
3699
       */
3700
      result_type
3701
      max() const
3702
      { return std::numeric_limits<result_type>::max(); }
3703
 
3704
      /**
3705
       * @brief Generating functions.
3706
       */
3707
      template<typename _UniformRandomNumberGenerator>
3708
        result_type
3709
        operator()(_UniformRandomNumberGenerator& __urng)
3710
        { return this->operator()(__urng, this->param()); }
3711
 
3712
      template<typename _UniformRandomNumberGenerator>
3713
        result_type
3714
        operator()(_UniformRandomNumberGenerator& __urng,
3715
                   const param_type& __p);
3716
 
3717
    private:
3718
      param_type _M_param;
3719
    };
3720
 
3721
  /**
3722
   * @brief Return true if two geometric distributions have
3723
   *        the same parameters.
3724
   */
3725
  template<typename _IntType>
3726
    inline bool
3727
    operator==(const std::geometric_distribution<_IntType>& __d1,
3728
               const std::geometric_distribution<_IntType>& __d2)
3729
    { return __d1.param() == __d2.param(); }
3730
 
3731
  /**
3732
   * @brief Return true if two geometric distributions have
3733
   *        different parameters.
3734
   */
3735
  template<typename _IntType>
3736
    inline bool
3737
    operator!=(const std::geometric_distribution<_IntType>& __d1,
3738
               const std::geometric_distribution<_IntType>& __d2)
3739
    { return !(__d1 == __d2); }
3740
 
3741
  /**
3742
   * @brief Inserts a %geometric_distribution random number distribution
3743
   * @p __x into the output stream @p __os.
3744
   *
3745
   * @param __os An output stream.
3746
   * @param __x  A %geometric_distribution random number distribution.
3747
   *
3748
   * @returns The output stream with the state of @p __x inserted or in
3749
   * an error state.
3750
   */
3751
  template<typename _IntType,
3752
           typename _CharT, typename _Traits>
3753
    std::basic_ostream<_CharT, _Traits>&
3754
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3755
               const std::geometric_distribution<_IntType>& __x);
3756
 
3757
  /**
3758
   * @brief Extracts a %geometric_distribution random number distribution
3759
   * @p __x from the input stream @p __is.
3760
   *
3761
   * @param __is An input stream.
3762
   * @param __x  A %geometric_distribution random number generator engine.
3763
   *
3764
   * @returns The input stream with @p __x extracted or in an error state.
3765
   */
3766
  template<typename _IntType,
3767
           typename _CharT, typename _Traits>
3768
    std::basic_istream<_CharT, _Traits>&
3769
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
3770
               std::geometric_distribution<_IntType>& __x);
3771
 
3772
 
3773
  /**
3774
   * @brief A negative_binomial_distribution random number distribution.
3775
   *
3776
   * The formula for the negative binomial probability mass function is
3777
   * @f$p(i) = \binom{n}{i} p^i (1 - p)^{t - i}@f$ where @f$t@f$
3778
   * and @f$p@f$ are the parameters of the distribution.
3779
   */
3780
  template<typename _IntType = int>
3781
    class negative_binomial_distribution
3782
    {
3783
      static_assert(std::is_integral<_IntType>::value,
3784
                    "template argument not an integral type");
3785
 
3786
    public:
3787
      /** The type of the range of the distribution. */
3788
      typedef _IntType result_type;
3789
      /** Parameter type. */
3790
      struct param_type
3791
      {
3792
        typedef negative_binomial_distribution<_IntType> distribution_type;
3793
 
3794
        explicit
3795
        param_type(_IntType __k = 1, double __p = 0.5)
3796
        : _M_k(__k), _M_p(__p)
3797
        {
3798
          _GLIBCXX_DEBUG_ASSERT((_M_k > 0) && (_M_p > 0.0) && (_M_p <= 1.0));
3799
        }
3800
 
3801
        _IntType
3802
        k() const
3803
        { return _M_k; }
3804
 
3805
        double
3806
        p() const
3807
        { return _M_p; }
3808
 
3809
        friend bool
3810
        operator==(const param_type& __p1, const param_type& __p2)
3811
        { return __p1._M_k == __p2._M_k && __p1._M_p == __p2._M_p; }
3812
 
3813
      private:
3814
        _IntType _M_k;
3815
        double _M_p;
3816
      };
3817
 
3818
      explicit
3819
      negative_binomial_distribution(_IntType __k = 1, double __p = 0.5)
3820
      : _M_param(__k, __p), _M_gd(__k, (1.0 - __p) / __p)
3821
      { }
3822
 
3823
      explicit
3824
      negative_binomial_distribution(const param_type& __p)
3825
      : _M_param(__p), _M_gd(__p.k(), (1.0 - __p.p()) / __p.p())
3826
      { }
3827
 
3828
      /**
3829
       * @brief Resets the distribution state.
3830
       */
3831
      void
3832
      reset()
3833
      { _M_gd.reset(); }
3834
 
3835
      /**
3836
       * @brief Return the @f$k@f$ parameter of the distribution.
3837
       */
3838
      _IntType
3839
      k() const
3840
      { return _M_param.k(); }
3841
 
3842
      /**
3843
       * @brief Return the @f$p@f$ parameter of the distribution.
3844
       */
3845
      double
3846
      p() const
3847
      { return _M_param.p(); }
3848
 
3849
      /**
3850
       * @brief Returns the parameter set of the distribution.
3851
       */
3852
      param_type
3853
      param() const
3854
      { return _M_param; }
3855
 
3856
      /**
3857
       * @brief Sets the parameter set of the distribution.
3858
       * @param __param The new parameter set of the distribution.
3859
       */
3860
      void
3861
      param(const param_type& __param)
3862
      { _M_param = __param; }
3863
 
3864
      /**
3865
       * @brief Returns the greatest lower bound value of the distribution.
3866
       */
3867
      result_type
3868
      min() const
3869
      { return result_type(0); }
3870
 
3871
      /**
3872
       * @brief Returns the least upper bound value of the distribution.
3873
       */
3874
      result_type
3875
      max() const
3876
      { return std::numeric_limits<result_type>::max(); }
3877
 
3878
      /**
3879
       * @brief Generating functions.
3880
       */
3881
      template<typename _UniformRandomNumberGenerator>
3882
        result_type
3883
        operator()(_UniformRandomNumberGenerator& __urng);
3884
 
3885
      template<typename _UniformRandomNumberGenerator>
3886
        result_type
3887
        operator()(_UniformRandomNumberGenerator& __urng,
3888
                   const param_type& __p);
3889
 
3890
      /**
3891
       * @brief Return true if two negative binomial distributions have
3892
       *        the same parameters and the sequences that would be
3893
       *        generated are equal.
3894
       */
3895
      template<typename _IntType1>
3896
        friend bool
3897
        operator==(const std::negative_binomial_distribution<_IntType1>& __d1,
3898
                   const std::negative_binomial_distribution<_IntType1>& __d2)
3899
        { return __d1.param() == __d2.param() && __d1._M_gd == __d2._M_gd; }
3900
 
3901
      /**
3902
       * @brief Inserts a %negative_binomial_distribution random
3903
       *        number distribution @p __x into the output stream @p __os.
3904
       *
3905
       * @param __os An output stream.
3906
       * @param __x  A %negative_binomial_distribution random number
3907
       *             distribution.
3908
       *
3909
       * @returns The output stream with the state of @p __x inserted or in
3910
       *          an error state.
3911
       */
3912
      template<typename _IntType1, typename _CharT, typename _Traits>
3913
        friend std::basic_ostream<_CharT, _Traits>&
3914
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3915
                   const std::negative_binomial_distribution<_IntType1>& __x);
3916
 
3917
      /**
3918
       * @brief Extracts a %negative_binomial_distribution random number
3919
       *        distribution @p __x from the input stream @p __is.
3920
       *
3921
       * @param __is An input stream.
3922
       * @param __x A %negative_binomial_distribution random number
3923
       *            generator engine.
3924
       *
3925
       * @returns The input stream with @p __x extracted or in an error state.
3926
       */
3927
      template<typename _IntType1, typename _CharT, typename _Traits>
3928
        friend std::basic_istream<_CharT, _Traits>&
3929
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
3930
                   std::negative_binomial_distribution<_IntType1>& __x);
3931
 
3932
    private:
3933
      param_type _M_param;
3934
 
3935
      std::gamma_distribution<double> _M_gd;
3936
    };
3937
 
3938
  /**
3939
   * @brief Return true if two negative binomial distributions are different.
3940
   */
3941
  template<typename _IntType>
3942
    inline bool
3943
    operator!=(const std::negative_binomial_distribution<_IntType>& __d1,
3944
               const std::negative_binomial_distribution<_IntType>& __d2)
3945
    { return !(__d1 == __d2); }
3946
 
3947
 
3948
  /* @} */ // group random_distributions_bernoulli
3949
 
3950
  /**
3951
   * @addtogroup random_distributions_poisson Poisson Distributions
3952
   * @ingroup random_distributions
3953
   * @{
3954
   */
3955
 
3956
  /**
3957
   * @brief A discrete Poisson random number distribution.
3958
   *
3959
   * The formula for the Poisson probability density function is
3960
   * @f$p(i|\mu) = \frac{\mu^i}{i!} e^{-\mu}@f$ where @f$\mu@f$ is the
3961
   * parameter of the distribution.
3962
   */
3963
  template<typename _IntType = int>
3964
    class poisson_distribution
3965
    {
3966
      static_assert(std::is_integral<_IntType>::value,
3967
                    "template argument not an integral type");
3968
 
3969
    public:
3970
      /** The type of the range of the distribution. */
3971
      typedef _IntType  result_type;
3972
      /** Parameter type. */
3973
      struct param_type
3974
      {
3975
        typedef poisson_distribution<_IntType> distribution_type;
3976
        friend class poisson_distribution<_IntType>;
3977
 
3978
        explicit
3979
        param_type(double __mean = 1.0)
3980
        : _M_mean(__mean)
3981
        {
3982
          _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0);
3983
          _M_initialize();
3984
        }
3985
 
3986
        double
3987
        mean() const
3988
        { return _M_mean; }
3989
 
3990
        friend bool
3991
        operator==(const param_type& __p1, const param_type& __p2)
3992
        { return __p1._M_mean == __p2._M_mean; }
3993
 
3994
      private:
3995
        // Hosts either log(mean) or the threshold of the simple method.
3996
        void
3997
        _M_initialize();
3998
 
3999
        double _M_mean;
4000
 
4001
        double _M_lm_thr;
4002
#if _GLIBCXX_USE_C99_MATH_TR1
4003
        double _M_lfm, _M_sm, _M_d, _M_scx, _M_1cx, _M_c2b, _M_cb;
4004
#endif
4005
      };
4006
 
4007
      // constructors and member function
4008
      explicit
4009
      poisson_distribution(double __mean = 1.0)
4010
      : _M_param(__mean), _M_nd()
4011
      { }
4012
 
4013
      explicit
4014
      poisson_distribution(const param_type& __p)
4015
      : _M_param(__p), _M_nd()
4016
      { }
4017
 
4018
      /**
4019
       * @brief Resets the distribution state.
4020
       */
4021
      void
4022
      reset()
4023
      { _M_nd.reset(); }
4024
 
4025
      /**
4026
       * @brief Returns the distribution parameter @p mean.
4027
       */
4028
      double
4029
      mean() const
4030
      { return _M_param.mean(); }
4031
 
4032
      /**
4033
       * @brief Returns the parameter set of the distribution.
4034
       */
4035
      param_type
4036
      param() const
4037
      { return _M_param; }
4038
 
4039
      /**
4040
       * @brief Sets the parameter set of the distribution.
4041
       * @param __param The new parameter set of the distribution.
4042
       */
4043
      void
4044
      param(const param_type& __param)
4045
      { _M_param = __param; }
4046
 
4047
      /**
4048
       * @brief Returns the greatest lower bound value of the distribution.
4049
       */
4050
      result_type
4051
      min() const
4052
      { return 0; }
4053
 
4054
      /**
4055
       * @brief Returns the least upper bound value of the distribution.
4056
       */
4057
      result_type
4058
      max() const
4059
      { return std::numeric_limits<result_type>::max(); }
4060
 
4061
      /**
4062
       * @brief Generating functions.
4063
       */
4064
      template<typename _UniformRandomNumberGenerator>
4065
        result_type
4066
        operator()(_UniformRandomNumberGenerator& __urng)
4067
        { return this->operator()(__urng, this->param()); }
4068
 
4069
      template<typename _UniformRandomNumberGenerator>
4070
        result_type
4071
        operator()(_UniformRandomNumberGenerator& __urng,
4072
                   const param_type& __p);
4073
 
4074
       /**
4075
        * @brief Return true if two Poisson distributions have the same
4076
        *        parameters and the sequences that would be generated
4077
        *        are equal.
4078
        */
4079
      template<typename _IntType1>
4080
        friend bool
4081
        operator==(const std::poisson_distribution<_IntType1>& __d1,
4082
                   const std::poisson_distribution<_IntType1>& __d2)
4083
#ifdef _GLIBCXX_USE_C99_MATH_TR1
4084
        { return __d1.param() == __d2.param() && __d1._M_nd == __d2._M_nd; }
4085
#else
4086
        { return __d1.param() == __d2.param(); }
4087
#endif
4088
 
4089
      /**
4090
       * @brief Inserts a %poisson_distribution random number distribution
4091
       * @p __x into the output stream @p __os.
4092
       *
4093
       * @param __os An output stream.
4094
       * @param __x  A %poisson_distribution random number distribution.
4095
       *
4096
       * @returns The output stream with the state of @p __x inserted or in
4097
       * an error state.
4098
       */
4099
      template<typename _IntType1, typename _CharT, typename _Traits>
4100
        friend std::basic_ostream<_CharT, _Traits>&
4101
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4102
                   const std::poisson_distribution<_IntType1>& __x);
4103
 
4104
      /**
4105
       * @brief Extracts a %poisson_distribution random number distribution
4106
       * @p __x from the input stream @p __is.
4107
       *
4108
       * @param __is An input stream.
4109
       * @param __x  A %poisson_distribution random number generator engine.
4110
       *
4111
       * @returns The input stream with @p __x extracted or in an error
4112
       *          state.
4113
       */
4114
      template<typename _IntType1, typename _CharT, typename _Traits>
4115
        friend std::basic_istream<_CharT, _Traits>&
4116
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
4117
                   std::poisson_distribution<_IntType1>& __x);
4118
 
4119
    private:
4120
      param_type _M_param;
4121
 
4122
      // NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
4123
      std::normal_distribution<double> _M_nd;
4124
    };
4125
 
4126
  /**
4127
   * @brief Return true if two Poisson distributions are different.
4128
   */
4129
  template<typename _IntType>
4130
    inline bool
4131
    operator!=(const std::poisson_distribution<_IntType>& __d1,
4132
               const std::poisson_distribution<_IntType>& __d2)
4133
    { return !(__d1 == __d2); }
4134
 
4135
 
4136
  /**
4137
   * @brief An exponential continuous distribution for random numbers.
4138
   *
4139
   * The formula for the exponential probability density function is
4140
   * @f$p(x|\lambda) = \lambda e^{-\lambda x}@f$.
4141
   *
4142
   * <table border=1 cellpadding=10 cellspacing=0>
4143
   * <caption align=top>Distribution Statistics</caption>
4144
   * <tr><td>Mean</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
4145
   * <tr><td>Median</td><td>@f$\frac{\ln 2}{\lambda}@f$</td></tr>
4146
   * <tr><td>Mode</td><td>@f$zero@f$</td></tr>
4147
   * <tr><td>Range</td><td>@f$[0, \infty]@f$</td></tr>
4148
   * <tr><td>Standard Deviation</td><td>@f$\frac{1}{\lambda}@f$</td></tr>
4149
   * </table>
4150
   */
4151
  template<typename _RealType = double>
4152
    class exponential_distribution
4153
    {
4154
      static_assert(std::is_floating_point<_RealType>::value,
4155
                    "template argument not a floating point type");
4156
 
4157
    public:
4158
      /** The type of the range of the distribution. */
4159
      typedef _RealType result_type;
4160
      /** Parameter type. */
4161
      struct param_type
4162
      {
4163
        typedef exponential_distribution<_RealType> distribution_type;
4164
 
4165
        explicit
4166
        param_type(_RealType __lambda = _RealType(1))
4167
        : _M_lambda(__lambda)
4168
        {
4169
          _GLIBCXX_DEBUG_ASSERT(_M_lambda > _RealType(0));
4170
        }
4171
 
4172
        _RealType
4173
        lambda() const
4174
        { return _M_lambda; }
4175
 
4176
        friend bool
4177
        operator==(const param_type& __p1, const param_type& __p2)
4178
        { return __p1._M_lambda == __p2._M_lambda; }
4179
 
4180
      private:
4181
        _RealType _M_lambda;
4182
      };
4183
 
4184
    public:
4185
      /**
4186
       * @brief Constructs an exponential distribution with inverse scale
4187
       *        parameter @f$\lambda@f$.
4188
       */
4189
      explicit
4190
      exponential_distribution(const result_type& __lambda = result_type(1))
4191
      : _M_param(__lambda)
4192
      { }
4193
 
4194
      explicit
4195
      exponential_distribution(const param_type& __p)
4196
      : _M_param(__p)
4197
      { }
4198
 
4199
      /**
4200
       * @brief Resets the distribution state.
4201
       *
4202
       * Has no effect on exponential distributions.
4203
       */
4204
      void
4205
      reset() { }
4206
 
4207
      /**
4208
       * @brief Returns the inverse scale parameter of the distribution.
4209
       */
4210
      _RealType
4211
      lambda() const
4212
      { return _M_param.lambda(); }
4213
 
4214
      /**
4215
       * @brief Returns the parameter set of the distribution.
4216
       */
4217
      param_type
4218
      param() const
4219
      { return _M_param; }
4220
 
4221
      /**
4222
       * @brief Sets the parameter set of the distribution.
4223
       * @param __param The new parameter set of the distribution.
4224
       */
4225
      void
4226
      param(const param_type& __param)
4227
      { _M_param = __param; }
4228
 
4229
      /**
4230
       * @brief Returns the greatest lower bound value of the distribution.
4231
       */
4232
      result_type
4233
      min() const
4234
      { return result_type(0); }
4235
 
4236
      /**
4237
       * @brief Returns the least upper bound value of the distribution.
4238
       */
4239
      result_type
4240
      max() const
4241
      { return std::numeric_limits<result_type>::max(); }
4242
 
4243
      /**
4244
       * @brief Generating functions.
4245
       */
4246
      template<typename _UniformRandomNumberGenerator>
4247
        result_type
4248
        operator()(_UniformRandomNumberGenerator& __urng)
4249
        { return this->operator()(__urng, this->param()); }
4250
 
4251
      template<typename _UniformRandomNumberGenerator>
4252
        result_type
4253
        operator()(_UniformRandomNumberGenerator& __urng,
4254
                   const param_type& __p)
4255
        {
4256
          __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
4257
            __aurng(__urng);
4258
          return -std::log(__aurng()) / __p.lambda();
4259
        }
4260
 
4261
    private:
4262
      param_type _M_param;
4263
    };
4264
 
4265
  /**
4266
   * @brief Return true if two exponential distributions have the same
4267
   *        parameters.
4268
   */
4269
  template<typename _RealType>
4270
    inline bool
4271
    operator==(const std::exponential_distribution<_RealType>& __d1,
4272
               const std::exponential_distribution<_RealType>& __d2)
4273
    { return __d1.param() == __d2.param(); }
4274
 
4275
  /**
4276
   * @brief Return true if two exponential distributions have different
4277
   *        parameters.
4278
   */
4279
  template<typename _RealType>
4280
    inline bool
4281
    operator!=(const std::exponential_distribution<_RealType>& __d1,
4282
               const std::exponential_distribution<_RealType>& __d2)
4283
    { return !(__d1 == __d2); }
4284
 
4285
  /**
4286
   * @brief Inserts a %exponential_distribution random number distribution
4287
   * @p __x into the output stream @p __os.
4288
   *
4289
   * @param __os An output stream.
4290
   * @param __x  A %exponential_distribution random number distribution.
4291
   *
4292
   * @returns The output stream with the state of @p __x inserted or in
4293
   * an error state.
4294
   */
4295
  template<typename _RealType, typename _CharT, typename _Traits>
4296
    std::basic_ostream<_CharT, _Traits>&
4297
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4298
               const std::exponential_distribution<_RealType>& __x);
4299
 
4300
  /**
4301
   * @brief Extracts a %exponential_distribution random number distribution
4302
   * @p __x from the input stream @p __is.
4303
   *
4304
   * @param __is An input stream.
4305
   * @param __x A %exponential_distribution random number
4306
   *            generator engine.
4307
   *
4308
   * @returns The input stream with @p __x extracted or in an error state.
4309
   */
4310
  template<typename _RealType, typename _CharT, typename _Traits>
4311
    std::basic_istream<_CharT, _Traits>&
4312
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
4313
               std::exponential_distribution<_RealType>& __x);
4314
 
4315
 
4316
  /**
4317
   * @brief A weibull_distribution random number distribution.
4318
   *
4319
   * The formula for the normal probability density function is:
4320
   * @f[
4321
   *     p(x|\alpha,\beta) = \frac{\alpha}{\beta} (\frac{x}{\beta})^{\alpha-1}
4322
   *                         \exp{(-(\frac{x}{\beta})^\alpha)}
4323
   * @f]
4324
   */
4325
  template<typename _RealType = double>
4326
    class weibull_distribution
4327
    {
4328
      static_assert(std::is_floating_point<_RealType>::value,
4329
                    "template argument not a floating point type");
4330
 
4331
    public:
4332
      /** The type of the range of the distribution. */
4333
      typedef _RealType result_type;
4334
      /** Parameter type. */
4335
      struct param_type
4336
      {
4337
        typedef weibull_distribution<_RealType> distribution_type;
4338
 
4339
        explicit
4340
        param_type(_RealType __a = _RealType(1),
4341
                   _RealType __b = _RealType(1))
4342
        : _M_a(__a), _M_b(__b)
4343
        { }
4344
 
4345
        _RealType
4346
        a() const
4347
        { return _M_a; }
4348
 
4349
        _RealType
4350
        b() const
4351
        { return _M_b; }
4352
 
4353
        friend bool
4354
        operator==(const param_type& __p1, const param_type& __p2)
4355
        { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
4356
 
4357
      private:
4358
        _RealType _M_a;
4359
        _RealType _M_b;
4360
      };
4361
 
4362
      explicit
4363
      weibull_distribution(_RealType __a = _RealType(1),
4364
                           _RealType __b = _RealType(1))
4365
      : _M_param(__a, __b)
4366
      { }
4367
 
4368
      explicit
4369
      weibull_distribution(const param_type& __p)
4370
      : _M_param(__p)
4371
      { }
4372
 
4373
      /**
4374
       * @brief Resets the distribution state.
4375
       */
4376
      void
4377
      reset()
4378
      { }
4379
 
4380
      /**
4381
       * @brief Return the @f$a@f$ parameter of the distribution.
4382
       */
4383
      _RealType
4384
      a() const
4385
      { return _M_param.a(); }
4386
 
4387
      /**
4388
       * @brief Return the @f$b@f$ parameter of the distribution.
4389
       */
4390
      _RealType
4391
      b() const
4392
      { return _M_param.b(); }
4393
 
4394
      /**
4395
       * @brief Returns the parameter set of the distribution.
4396
       */
4397
      param_type
4398
      param() const
4399
      { return _M_param; }
4400
 
4401
      /**
4402
       * @brief Sets the parameter set of the distribution.
4403
       * @param __param The new parameter set of the distribution.
4404
       */
4405
      void
4406
      param(const param_type& __param)
4407
      { _M_param = __param; }
4408
 
4409
      /**
4410
       * @brief Returns the greatest lower bound value of the distribution.
4411
       */
4412
      result_type
4413
      min() const
4414
      { return result_type(0); }
4415
 
4416
      /**
4417
       * @brief Returns the least upper bound value of the distribution.
4418
       */
4419
      result_type
4420
      max() const
4421
      { return std::numeric_limits<result_type>::max(); }
4422
 
4423
      /**
4424
       * @brief Generating functions.
4425
       */
4426
      template<typename _UniformRandomNumberGenerator>
4427
        result_type
4428
        operator()(_UniformRandomNumberGenerator& __urng)
4429
        { return this->operator()(__urng, this->param()); }
4430
 
4431
      template<typename _UniformRandomNumberGenerator>
4432
        result_type
4433
        operator()(_UniformRandomNumberGenerator& __urng,
4434
                   const param_type& __p);
4435
 
4436
    private:
4437
      param_type _M_param;
4438
    };
4439
 
4440
   /**
4441
    * @brief Return true if two Weibull distributions have the same
4442
    *        parameters.
4443
    */
4444
  template<typename _RealType>
4445
    inline bool
4446
    operator==(const std::weibull_distribution<_RealType>& __d1,
4447
               const std::weibull_distribution<_RealType>& __d2)
4448
    { return __d1.param() == __d2.param(); }
4449
 
4450
   /**
4451
    * @brief Return true if two Weibull distributions have different
4452
    *        parameters.
4453
    */
4454
  template<typename _RealType>
4455
    inline bool
4456
    operator!=(const std::weibull_distribution<_RealType>& __d1,
4457
               const std::weibull_distribution<_RealType>& __d2)
4458
    { return !(__d1 == __d2); }
4459
 
4460
  /**
4461
   * @brief Inserts a %weibull_distribution random number distribution
4462
   * @p __x into the output stream @p __os.
4463
   *
4464
   * @param __os An output stream.
4465
   * @param __x  A %weibull_distribution random number distribution.
4466
   *
4467
   * @returns The output stream with the state of @p __x inserted or in
4468
   * an error state.
4469
   */
4470
  template<typename _RealType, typename _CharT, typename _Traits>
4471
    std::basic_ostream<_CharT, _Traits>&
4472
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4473
               const std::weibull_distribution<_RealType>& __x);
4474
 
4475
  /**
4476
   * @brief Extracts a %weibull_distribution random number distribution
4477
   * @p __x from the input stream @p __is.
4478
   *
4479
   * @param __is An input stream.
4480
   * @param __x A %weibull_distribution random number
4481
   *            generator engine.
4482
   *
4483
   * @returns The input stream with @p __x extracted or in an error state.
4484
   */
4485
  template<typename _RealType, typename _CharT, typename _Traits>
4486
    std::basic_istream<_CharT, _Traits>&
4487
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
4488
               std::weibull_distribution<_RealType>& __x);
4489
 
4490
 
4491
  /**
4492
   * @brief A extreme_value_distribution random number distribution.
4493
   *
4494
   * The formula for the normal probability mass function is
4495
   * @f[
4496
   *     p(x|a,b) = \frac{1}{b}
4497
   *                \exp( \frac{a-x}{b} - \exp(\frac{a-x}{b}))
4498
   * @f]
4499
   */
4500
  template<typename _RealType = double>
4501
    class extreme_value_distribution
4502
    {
4503
      static_assert(std::is_floating_point<_RealType>::value,
4504
                    "template argument not a floating point type");
4505
 
4506
    public:
4507
      /** The type of the range of the distribution. */
4508
      typedef _RealType result_type;
4509
      /** Parameter type. */
4510
      struct param_type
4511
      {
4512
        typedef extreme_value_distribution<_RealType> distribution_type;
4513
 
4514
        explicit
4515
        param_type(_RealType __a = _RealType(0),
4516
                   _RealType __b = _RealType(1))
4517
        : _M_a(__a), _M_b(__b)
4518
        { }
4519
 
4520
        _RealType
4521
        a() const
4522
        { return _M_a; }
4523
 
4524
        _RealType
4525
        b() const
4526
        { return _M_b; }
4527
 
4528
        friend bool
4529
        operator==(const param_type& __p1, const param_type& __p2)
4530
        { return __p1._M_a == __p2._M_a && __p1._M_b == __p2._M_b; }
4531
 
4532
      private:
4533
        _RealType _M_a;
4534
        _RealType _M_b;
4535
      };
4536
 
4537
      explicit
4538
      extreme_value_distribution(_RealType __a = _RealType(0),
4539
                                 _RealType __b = _RealType(1))
4540
      : _M_param(__a, __b)
4541
      { }
4542
 
4543
      explicit
4544
      extreme_value_distribution(const param_type& __p)
4545
      : _M_param(__p)
4546
      { }
4547
 
4548
      /**
4549
       * @brief Resets the distribution state.
4550
       */
4551
      void
4552
      reset()
4553
      { }
4554
 
4555
      /**
4556
       * @brief Return the @f$a@f$ parameter of the distribution.
4557
       */
4558
      _RealType
4559
      a() const
4560
      { return _M_param.a(); }
4561
 
4562
      /**
4563
       * @brief Return the @f$b@f$ parameter of the distribution.
4564
       */
4565
      _RealType
4566
      b() const
4567
      { return _M_param.b(); }
4568
 
4569
      /**
4570
       * @brief Returns the parameter set of the distribution.
4571
       */
4572
      param_type
4573
      param() const
4574
      { return _M_param; }
4575
 
4576
      /**
4577
       * @brief Sets the parameter set of the distribution.
4578
       * @param __param The new parameter set of the distribution.
4579
       */
4580
      void
4581
      param(const param_type& __param)
4582
      { _M_param = __param; }
4583
 
4584
      /**
4585
       * @brief Returns the greatest lower bound value of the distribution.
4586
       */
4587
      result_type
4588
      min() const
4589
      { return std::numeric_limits<result_type>::min(); }
4590
 
4591
      /**
4592
       * @brief Returns the least upper bound value of the distribution.
4593
       */
4594
      result_type
4595
      max() const
4596
      { return std::numeric_limits<result_type>::max(); }
4597
 
4598
      /**
4599
       * @brief Generating functions.
4600
       */
4601
      template<typename _UniformRandomNumberGenerator>
4602
        result_type
4603
        operator()(_UniformRandomNumberGenerator& __urng)
4604
        { return this->operator()(__urng, this->param()); }
4605
 
4606
      template<typename _UniformRandomNumberGenerator>
4607
        result_type
4608
        operator()(_UniformRandomNumberGenerator& __urng,
4609
                   const param_type& __p);
4610
 
4611
    private:
4612
      param_type _M_param;
4613
    };
4614
 
4615
  /**
4616
    * @brief Return true if two extreme value distributions have the same
4617
    *        parameters.
4618
   */
4619
  template<typename _RealType>
4620
    inline bool
4621
    operator==(const std::extreme_value_distribution<_RealType>& __d1,
4622
               const std::extreme_value_distribution<_RealType>& __d2)
4623
    { return __d1.param() == __d2.param(); }
4624
 
4625
  /**
4626
    * @brief Return true if two extreme value distributions have different
4627
    *        parameters.
4628
   */
4629
  template<typename _RealType>
4630
    inline bool
4631
    operator!=(const std::extreme_value_distribution<_RealType>& __d1,
4632
               const std::extreme_value_distribution<_RealType>& __d2)
4633
    { return !(__d1 == __d2); }
4634
 
4635
  /**
4636
   * @brief Inserts a %extreme_value_distribution random number distribution
4637
   * @p __x into the output stream @p __os.
4638
   *
4639
   * @param __os An output stream.
4640
   * @param __x  A %extreme_value_distribution random number distribution.
4641
   *
4642
   * @returns The output stream with the state of @p __x inserted or in
4643
   * an error state.
4644
   */
4645
  template<typename _RealType, typename _CharT, typename _Traits>
4646
    std::basic_ostream<_CharT, _Traits>&
4647
    operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4648
               const std::extreme_value_distribution<_RealType>& __x);
4649
 
4650
  /**
4651
   * @brief Extracts a %extreme_value_distribution random number
4652
   *        distribution @p __x from the input stream @p __is.
4653
   *
4654
   * @param __is An input stream.
4655
   * @param __x A %extreme_value_distribution random number
4656
   *            generator engine.
4657
   *
4658
   * @returns The input stream with @p __x extracted or in an error state.
4659
   */
4660
  template<typename _RealType, typename _CharT, typename _Traits>
4661
    std::basic_istream<_CharT, _Traits>&
4662
    operator>>(std::basic_istream<_CharT, _Traits>& __is,
4663
               std::extreme_value_distribution<_RealType>& __x);
4664
 
4665
 
4666
  /**
4667
   * @brief A discrete_distribution random number distribution.
4668
   *
4669
   * The formula for the discrete probability mass function is
4670
   *
4671
   */
4672
  template<typename _IntType = int>
4673
    class discrete_distribution
4674
    {
4675
      static_assert(std::is_integral<_IntType>::value,
4676
                    "template argument not an integral type");
4677
 
4678
    public:
4679
      /** The type of the range of the distribution. */
4680
      typedef _IntType result_type;
4681
      /** Parameter type. */
4682
      struct param_type
4683
      {
4684
        typedef discrete_distribution<_IntType> distribution_type;
4685
        friend class discrete_distribution<_IntType>;
4686
 
4687
        param_type()
4688
        : _M_prob(), _M_cp()
4689
        { }
4690
 
4691
        template<typename _InputIterator>
4692
          param_type(_InputIterator __wbegin,
4693
                     _InputIterator __wend)
4694
          : _M_prob(__wbegin, __wend), _M_cp()
4695
          { _M_initialize(); }
4696
 
4697
        param_type(initializer_list<double> __wil)
4698
        : _M_prob(__wil.begin(), __wil.end()), _M_cp()
4699
        { _M_initialize(); }
4700
 
4701
        template<typename _Func>
4702
          param_type(size_t __nw, double __xmin, double __xmax,
4703
                     _Func __fw);
4704
 
4705
        // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
4706
        param_type(const param_type&) = default;
4707
        param_type& operator=(const param_type&) = default;
4708
 
4709
        std::vector<double>
4710
        probabilities() const
4711
        { return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; }
4712
 
4713
        friend bool
4714
        operator==(const param_type& __p1, const param_type& __p2)
4715
        { return __p1._M_prob == __p2._M_prob; }
4716
 
4717
      private:
4718
        void
4719
        _M_initialize();
4720
 
4721
        std::vector<double> _M_prob;
4722
        std::vector<double> _M_cp;
4723
      };
4724
 
4725
      discrete_distribution()
4726
      : _M_param()
4727
      { }
4728
 
4729
      template<typename _InputIterator>
4730
        discrete_distribution(_InputIterator __wbegin,
4731
                              _InputIterator __wend)
4732
        : _M_param(__wbegin, __wend)
4733
        { }
4734
 
4735
      discrete_distribution(initializer_list<double> __wl)
4736
      : _M_param(__wl)
4737
      { }
4738
 
4739
      template<typename _Func>
4740
        discrete_distribution(size_t __nw, double __xmin, double __xmax,
4741
                              _Func __fw)
4742
        : _M_param(__nw, __xmin, __xmax, __fw)
4743
        { }
4744
 
4745
      explicit
4746
      discrete_distribution(const param_type& __p)
4747
      : _M_param(__p)
4748
      { }
4749
 
4750
      /**
4751
       * @brief Resets the distribution state.
4752
       */
4753
      void
4754
      reset()
4755
      { }
4756
 
4757
      /**
4758
       * @brief Returns the probabilities of the distribution.
4759
       */
4760
      std::vector<double>
4761
      probabilities() const
4762
      {
4763
        return _M_param._M_prob.empty()
4764
          ? std::vector<double>(1, 1.0) : _M_param._M_prob;
4765
      }
4766
 
4767
      /**
4768
       * @brief Returns the parameter set of the distribution.
4769
       */
4770
      param_type
4771
      param() const
4772
      { return _M_param; }
4773
 
4774
      /**
4775
       * @brief Sets the parameter set of the distribution.
4776
       * @param __param The new parameter set of the distribution.
4777
       */
4778
      void
4779
      param(const param_type& __param)
4780
      { _M_param = __param; }
4781
 
4782
      /**
4783
       * @brief Returns the greatest lower bound value of the distribution.
4784
       */
4785
      result_type
4786
      min() const
4787
      { return result_type(0); }
4788
 
4789
      /**
4790
       * @brief Returns the least upper bound value of the distribution.
4791
       */
4792
      result_type
4793
      max() const
4794
      {
4795
        return _M_param._M_prob.empty()
4796
          ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
4797
      }
4798
 
4799
      /**
4800
       * @brief Generating functions.
4801
       */
4802
      template<typename _UniformRandomNumberGenerator>
4803
        result_type
4804
        operator()(_UniformRandomNumberGenerator& __urng)
4805
        { return this->operator()(__urng, this->param()); }
4806
 
4807
      template<typename _UniformRandomNumberGenerator>
4808
        result_type
4809
        operator()(_UniformRandomNumberGenerator& __urng,
4810
                   const param_type& __p);
4811
 
4812
      /**
4813
       * @brief Inserts a %discrete_distribution random number distribution
4814
       * @p __x into the output stream @p __os.
4815
       *
4816
       * @param __os An output stream.
4817
       * @param __x  A %discrete_distribution random number distribution.
4818
       *
4819
       * @returns The output stream with the state of @p __x inserted or in
4820
       * an error state.
4821
       */
4822
      template<typename _IntType1, typename _CharT, typename _Traits>
4823
        friend std::basic_ostream<_CharT, _Traits>&
4824
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
4825
                   const std::discrete_distribution<_IntType1>& __x);
4826
 
4827
      /**
4828
       * @brief Extracts a %discrete_distribution random number distribution
4829
       * @p __x from the input stream @p __is.
4830
       *
4831
       * @param __is An input stream.
4832
       * @param __x A %discrete_distribution random number
4833
       *            generator engine.
4834
       *
4835
       * @returns The input stream with @p __x extracted or in an error
4836
       *          state.
4837
       */
4838
      template<typename _IntType1, typename _CharT, typename _Traits>
4839
        friend std::basic_istream<_CharT, _Traits>&
4840
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
4841
                   std::discrete_distribution<_IntType1>& __x);
4842
 
4843
    private:
4844
      param_type _M_param;
4845
    };
4846
 
4847
  /**
4848
    * @brief Return true if two discrete distributions have the same
4849
    *        parameters.
4850
    */
4851
  template<typename _IntType>
4852
    inline bool
4853
    operator==(const std::discrete_distribution<_IntType>& __d1,
4854
               const std::discrete_distribution<_IntType>& __d2)
4855
    { return __d1.param() == __d2.param(); }
4856
 
4857
  /**
4858
    * @brief Return true if two discrete distributions have different
4859
    *        parameters.
4860
    */
4861
  template<typename _IntType>
4862
    inline bool
4863
    operator!=(const std::discrete_distribution<_IntType>& __d1,
4864
               const std::discrete_distribution<_IntType>& __d2)
4865
    { return !(__d1 == __d2); }
4866
 
4867
 
4868
  /**
4869
   * @brief A piecewise_constant_distribution random number distribution.
4870
   *
4871
   * The formula for the piecewise constant probability mass function is
4872
   *
4873
   */
4874
  template<typename _RealType = double>
4875
    class piecewise_constant_distribution
4876
    {
4877
      static_assert(std::is_floating_point<_RealType>::value,
4878
                    "template argument not a floating point type");
4879
 
4880
    public:
4881
      /** The type of the range of the distribution. */
4882
      typedef _RealType result_type;
4883
      /** Parameter type. */
4884
      struct param_type
4885
      {
4886
        typedef piecewise_constant_distribution<_RealType> distribution_type;
4887
        friend class piecewise_constant_distribution<_RealType>;
4888
 
4889
        param_type()
4890
        : _M_int(), _M_den(), _M_cp()
4891
        { }
4892
 
4893
        template<typename _InputIteratorB, typename _InputIteratorW>
4894
          param_type(_InputIteratorB __bfirst,
4895
                     _InputIteratorB __bend,
4896
                     _InputIteratorW __wbegin);
4897
 
4898
        template<typename _Func>
4899
          param_type(initializer_list<_RealType> __bi, _Func __fw);
4900
 
4901
        template<typename _Func>
4902
          param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
4903
                     _Func __fw);
4904
 
4905
        // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
4906
        param_type(const param_type&) = default;
4907
        param_type& operator=(const param_type&) = default;
4908
 
4909
        std::vector<_RealType>
4910
        intervals() const
4911
        {
4912
          if (_M_int.empty())
4913
            {
4914
              std::vector<_RealType> __tmp(2);
4915
              __tmp[1] = _RealType(1);
4916
              return __tmp;
4917
            }
4918
          else
4919
            return _M_int;
4920
        }
4921
 
4922
        std::vector<double>
4923
        densities() const
4924
        { return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; }
4925
 
4926
        friend bool
4927
        operator==(const param_type& __p1, const param_type& __p2)
4928
        { return __p1._M_int == __p2._M_int && __p1._M_den == __p2._M_den; }
4929
 
4930
      private:
4931
        void
4932
        _M_initialize();
4933
 
4934
        std::vector<_RealType> _M_int;
4935
        std::vector<double> _M_den;
4936
        std::vector<double> _M_cp;
4937
      };
4938
 
4939
      explicit
4940
      piecewise_constant_distribution()
4941
      : _M_param()
4942
      { }
4943
 
4944
      template<typename _InputIteratorB, typename _InputIteratorW>
4945
        piecewise_constant_distribution(_InputIteratorB __bfirst,
4946
                                        _InputIteratorB __bend,
4947
                                        _InputIteratorW __wbegin)
4948
        : _M_param(__bfirst, __bend, __wbegin)
4949
        { }
4950
 
4951
      template<typename _Func>
4952
        piecewise_constant_distribution(initializer_list<_RealType> __bl,
4953
                                        _Func __fw)
4954
        : _M_param(__bl, __fw)
4955
        { }
4956
 
4957
      template<typename _Func>
4958
        piecewise_constant_distribution(size_t __nw,
4959
                                        _RealType __xmin, _RealType __xmax,
4960
                                        _Func __fw)
4961
        : _M_param(__nw, __xmin, __xmax, __fw)
4962
        { }
4963
 
4964
      explicit
4965
      piecewise_constant_distribution(const param_type& __p)
4966
      : _M_param(__p)
4967
      { }
4968
 
4969
      /**
4970
       * @brief Resets the distribution state.
4971
       */
4972
      void
4973
      reset()
4974
      { }
4975
 
4976
      /**
4977
       * @brief Returns a vector of the intervals.
4978
       */
4979
      std::vector<_RealType>
4980
      intervals() const
4981
      {
4982
        if (_M_param._M_int.empty())
4983
          {
4984
            std::vector<_RealType> __tmp(2);
4985
            __tmp[1] = _RealType(1);
4986
            return __tmp;
4987
          }
4988
        else
4989
          return _M_param._M_int;
4990
      }
4991
 
4992
      /**
4993
       * @brief Returns a vector of the probability densities.
4994
       */
4995
      std::vector<double>
4996
      densities() const
4997
      {
4998
        return _M_param._M_den.empty()
4999
          ? std::vector<double>(1, 1.0) : _M_param._M_den;
5000
      }
5001
 
5002
      /**
5003
       * @brief Returns the parameter set of the distribution.
5004
       */
5005
      param_type
5006
      param() const
5007
      { return _M_param; }
5008
 
5009
      /**
5010
       * @brief Sets the parameter set of the distribution.
5011
       * @param __param The new parameter set of the distribution.
5012
       */
5013
      void
5014
      param(const param_type& __param)
5015
      { _M_param = __param; }
5016
 
5017
      /**
5018
       * @brief Returns the greatest lower bound value of the distribution.
5019
       */
5020
      result_type
5021
      min() const
5022
      {
5023
        return _M_param._M_int.empty()
5024
          ? result_type(0) : _M_param._M_int.front();
5025
      }
5026
 
5027
      /**
5028
       * @brief Returns the least upper bound value of the distribution.
5029
       */
5030
      result_type
5031
      max() const
5032
      {
5033
        return _M_param._M_int.empty()
5034
          ? result_type(1) : _M_param._M_int.back();
5035
      }
5036
 
5037
      /**
5038
       * @brief Generating functions.
5039
       */
5040
      template<typename _UniformRandomNumberGenerator>
5041
        result_type
5042
        operator()(_UniformRandomNumberGenerator& __urng)
5043
        { return this->operator()(__urng, this->param()); }
5044
 
5045
      template<typename _UniformRandomNumberGenerator>
5046
        result_type
5047
        operator()(_UniformRandomNumberGenerator& __urng,
5048
                   const param_type& __p);
5049
 
5050
      /**
5051
       * @brief Inserts a %piecewise_constan_distribution random
5052
       *        number distribution @p __x into the output stream @p __os.
5053
       *
5054
       * @param __os An output stream.
5055
       * @param __x  A %piecewise_constan_distribution random number
5056
       *             distribution.
5057
       *
5058
       * @returns The output stream with the state of @p __x inserted or in
5059
       * an error state.
5060
       */
5061
      template<typename _RealType1, typename _CharT, typename _Traits>
5062
        friend std::basic_ostream<_CharT, _Traits>&
5063
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5064
                   const std::piecewise_constant_distribution<_RealType1>& __x);
5065
 
5066
      /**
5067
       * @brief Extracts a %piecewise_constan_distribution random
5068
       *        number distribution @p __x from the input stream @p __is.
5069
       *
5070
       * @param __is An input stream.
5071
       * @param __x A %piecewise_constan_distribution random number
5072
       *            generator engine.
5073
       *
5074
       * @returns The input stream with @p __x extracted or in an error
5075
       *          state.
5076
       */
5077
      template<typename _RealType1, typename _CharT, typename _Traits>
5078
        friend std::basic_istream<_CharT, _Traits>&
5079
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
5080
                   std::piecewise_constant_distribution<_RealType1>& __x);
5081
 
5082
    private:
5083
      param_type _M_param;
5084
    };
5085
 
5086
  /**
5087
    * @brief Return true if two piecewise constant distributions have the
5088
    *        same parameters.
5089
   */
5090
  template<typename _RealType>
5091
    inline bool
5092
    operator==(const std::piecewise_constant_distribution<_RealType>& __d1,
5093
               const std::piecewise_constant_distribution<_RealType>& __d2)
5094
    { return __d1.param() == __d2.param(); }
5095
 
5096
  /**
5097
    * @brief Return true if two piecewise constant distributions have
5098
    *        different parameters.
5099
   */
5100
  template<typename _RealType>
5101
    inline bool
5102
    operator!=(const std::piecewise_constant_distribution<_RealType>& __d1,
5103
               const std::piecewise_constant_distribution<_RealType>& __d2)
5104
    { return !(__d1 == __d2); }
5105
 
5106
 
5107
  /**
5108
   * @brief A piecewise_linear_distribution random number distribution.
5109
   *
5110
   * The formula for the piecewise linear probability mass function is
5111
   *
5112
   */
5113
  template<typename _RealType = double>
5114
    class piecewise_linear_distribution
5115
    {
5116
      static_assert(std::is_floating_point<_RealType>::value,
5117
                    "template argument not a floating point type");
5118
 
5119
    public:
5120
      /** The type of the range of the distribution. */
5121
      typedef _RealType result_type;
5122
      /** Parameter type. */
5123
      struct param_type
5124
      {
5125
        typedef piecewise_linear_distribution<_RealType> distribution_type;
5126
        friend class piecewise_linear_distribution<_RealType>;
5127
 
5128
        param_type()
5129
        : _M_int(), _M_den(), _M_cp(), _M_m()
5130
        { }
5131
 
5132
        template<typename _InputIteratorB, typename _InputIteratorW>
5133
          param_type(_InputIteratorB __bfirst,
5134
                     _InputIteratorB __bend,
5135
                     _InputIteratorW __wbegin);
5136
 
5137
        template<typename _Func>
5138
          param_type(initializer_list<_RealType> __bl, _Func __fw);
5139
 
5140
        template<typename _Func>
5141
          param_type(size_t __nw, _RealType __xmin, _RealType __xmax,
5142
                     _Func __fw);
5143
 
5144
        // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/
5145
        param_type(const param_type&) = default;
5146
        param_type& operator=(const param_type&) = default;
5147
 
5148
        std::vector<_RealType>
5149
        intervals() const
5150
        {
5151
          if (_M_int.empty())
5152
            {
5153
              std::vector<_RealType> __tmp(2);
5154
              __tmp[1] = _RealType(1);
5155
              return __tmp;
5156
            }
5157
          else
5158
            return _M_int;
5159
        }
5160
 
5161
        std::vector<double>
5162
        densities() const
5163
        { return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; }
5164
 
5165
        friend bool
5166
        operator==(const param_type& __p1, const param_type& __p2)
5167
        { return (__p1._M_int == __p2._M_int
5168
                  && __p1._M_den == __p2._M_den); }
5169
 
5170
      private:
5171
        void
5172
        _M_initialize();
5173
 
5174
        std::vector<_RealType> _M_int;
5175
        std::vector<double> _M_den;
5176
        std::vector<double> _M_cp;
5177
        std::vector<double> _M_m;
5178
      };
5179
 
5180
      explicit
5181
      piecewise_linear_distribution()
5182
      : _M_param()
5183
      { }
5184
 
5185
      template<typename _InputIteratorB, typename _InputIteratorW>
5186
        piecewise_linear_distribution(_InputIteratorB __bfirst,
5187
                                      _InputIteratorB __bend,
5188
                                      _InputIteratorW __wbegin)
5189
        : _M_param(__bfirst, __bend, __wbegin)
5190
        { }
5191
 
5192
      template<typename _Func>
5193
        piecewise_linear_distribution(initializer_list<_RealType> __bl,
5194
                                      _Func __fw)
5195
        : _M_param(__bl, __fw)
5196
        { }
5197
 
5198
      template<typename _Func>
5199
        piecewise_linear_distribution(size_t __nw,
5200
                                      _RealType __xmin, _RealType __xmax,
5201
                                      _Func __fw)
5202
        : _M_param(__nw, __xmin, __xmax, __fw)
5203
        { }
5204
 
5205
      explicit
5206
      piecewise_linear_distribution(const param_type& __p)
5207
      : _M_param(__p)
5208
      { }
5209
 
5210
      /**
5211
       * Resets the distribution state.
5212
       */
5213
      void
5214
      reset()
5215
      { }
5216
 
5217
      /**
5218
       * @brief Return the intervals of the distribution.
5219
       */
5220
      std::vector<_RealType>
5221
      intervals() const
5222
      {
5223
        if (_M_param._M_int.empty())
5224
          {
5225
            std::vector<_RealType> __tmp(2);
5226
            __tmp[1] = _RealType(1);
5227
            return __tmp;
5228
          }
5229
        else
5230
          return _M_param._M_int;
5231
      }
5232
 
5233
      /**
5234
       * @brief Return a vector of the probability densities of the
5235
       *        distribution.
5236
       */
5237
      std::vector<double>
5238
      densities() const
5239
      {
5240
        return _M_param._M_den.empty()
5241
          ? std::vector<double>(2, 1.0) : _M_param._M_den;
5242
      }
5243
 
5244
      /**
5245
       * @brief Returns the parameter set of the distribution.
5246
       */
5247
      param_type
5248
      param() const
5249
      { return _M_param; }
5250
 
5251
      /**
5252
       * @brief Sets the parameter set of the distribution.
5253
       * @param __param The new parameter set of the distribution.
5254
       */
5255
      void
5256
      param(const param_type& __param)
5257
      { _M_param = __param; }
5258
 
5259
      /**
5260
       * @brief Returns the greatest lower bound value of the distribution.
5261
       */
5262
      result_type
5263
      min() const
5264
      {
5265
        return _M_param._M_int.empty()
5266
          ? result_type(0) : _M_param._M_int.front();
5267
      }
5268
 
5269
      /**
5270
       * @brief Returns the least upper bound value of the distribution.
5271
       */
5272
      result_type
5273
      max() const
5274
      {
5275
        return _M_param._M_int.empty()
5276
          ? result_type(1) : _M_param._M_int.back();
5277
      }
5278
 
5279
      /**
5280
       * @brief Generating functions.
5281
       */
5282
      template<typename _UniformRandomNumberGenerator>
5283
        result_type
5284
        operator()(_UniformRandomNumberGenerator& __urng)
5285
        { return this->operator()(__urng, this->param()); }
5286
 
5287
      template<typename _UniformRandomNumberGenerator>
5288
        result_type
5289
        operator()(_UniformRandomNumberGenerator& __urng,
5290
                   const param_type& __p);
5291
 
5292
      /**
5293
       * @brief Inserts a %piecewise_linear_distribution random number
5294
       *        distribution @p __x into the output stream @p __os.
5295
       *
5296
       * @param __os An output stream.
5297
       * @param __x  A %piecewise_linear_distribution random number
5298
       *             distribution.
5299
       *
5300
       * @returns The output stream with the state of @p __x inserted or in
5301
       *          an error state.
5302
       */
5303
      template<typename _RealType1, typename _CharT, typename _Traits>
5304
        friend std::basic_ostream<_CharT, _Traits>&
5305
        operator<<(std::basic_ostream<_CharT, _Traits>& __os,
5306
                   const std::piecewise_linear_distribution<_RealType1>& __x);
5307
 
5308
      /**
5309
       * @brief Extracts a %piecewise_linear_distribution random number
5310
       *        distribution @p __x from the input stream @p __is.
5311
       *
5312
       * @param __is An input stream.
5313
       * @param __x  A %piecewise_linear_distribution random number
5314
       *             generator engine.
5315
       *
5316
       * @returns The input stream with @p __x extracted or in an error
5317
       *          state.
5318
       */
5319
      template<typename _RealType1, typename _CharT, typename _Traits>
5320
        friend std::basic_istream<_CharT, _Traits>&
5321
        operator>>(std::basic_istream<_CharT, _Traits>& __is,
5322
                   std::piecewise_linear_distribution<_RealType1>& __x);
5323
 
5324
    private:
5325
      param_type _M_param;
5326
    };
5327
 
5328
  /**
5329
    * @brief Return true if two piecewise linear distributions have the
5330
    *        same parameters.
5331
   */
5332
  template<typename _RealType>
5333
    inline bool
5334
    operator==(const std::piecewise_linear_distribution<_RealType>& __d1,
5335
               const std::piecewise_linear_distribution<_RealType>& __d2)
5336
    { return __d1.param() == __d2.param(); }
5337
 
5338
  /**
5339
    * @brief Return true if two piecewise linear distributions have
5340
    *        different parameters.
5341
   */
5342
  template<typename _RealType>
5343
    inline bool
5344
    operator!=(const std::piecewise_linear_distribution<_RealType>& __d1,
5345
               const std::piecewise_linear_distribution<_RealType>& __d2)
5346
    { return !(__d1 == __d2); }
5347
 
5348
 
5349
  /* @} */ // group random_distributions_poisson
5350
 
5351
  /* @} */ // group random_distributions
5352
 
5353
  /**
5354
   * @addtogroup random_utilities Random Number Utilities
5355
   * @ingroup random
5356
   * @{
5357
   */
5358
 
5359
  /**
5360
   * @brief The seed_seq class generates sequences of seeds for random
5361
   *        number generators.
5362
   */
5363
  class seed_seq
5364
  {
5365
 
5366
  public:
5367
    /** The type of the seed vales. */
5368
    typedef uint_least32_t result_type;
5369
 
5370
    /** Default constructor. */
5371
    seed_seq()
5372
    : _M_v()
5373
    { }
5374
 
5375
    template<typename _IntType>
5376
      seed_seq(std::initializer_list<_IntType> il);
5377
 
5378
    template<typename _InputIterator>
5379
      seed_seq(_InputIterator __begin, _InputIterator __end);
5380
 
5381
    // generating functions
5382
    template<typename _RandomAccessIterator>
5383
      void
5384
      generate(_RandomAccessIterator __begin, _RandomAccessIterator __end);
5385
 
5386
    // property functions
5387
    size_t size() const
5388
    { return _M_v.size(); }
5389
 
5390
    template<typename OutputIterator>
5391
      void
5392
      param(OutputIterator __dest) const
5393
      { std::copy(_M_v.begin(), _M_v.end(), __dest); }
5394
 
5395
  private:
5396
    ///
5397
    std::vector<result_type> _M_v;
5398
  };
5399
 
5400
  /* @} */ // group random_utilities
5401
 
5402
  /* @} */ // group random
5403
 
5404
_GLIBCXX_END_NAMESPACE_VERSION
5405
} // namespace std
5406
 
5407
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.