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