vfs: check userland buffers before reading them.
[haiku.git] / headers / libs / libc++ / random
blob794bf7b3fd1571bd86721c3c719469a8a9e5f76b
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 //===----------------------------------------------------------------------===//
11 #ifndef _LIBCPP_RANDOM
12 #define _LIBCPP_RANDOM
15     random synopsis
17 #include <initializer_list>
19 namespace std
22 // Engines
24 template <class UIntType, UIntType a, UIntType c, UIntType m>
25 class linear_congruential_engine
27 public:
28     // types
29     typedef UIntType result_type;
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;
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);
45     // generating functions
46     result_type operator()();
47     void discard(unsigned long long z);
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);
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);
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);
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);
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
77 public:
78     // types
79     typedef UIntType result_type;
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;
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);
105     // generating functions
106     result_type operator()();
107     void discard(unsigned long long z);
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);
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);
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);
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);
142 template<class UIntType, size_t w, size_t s, size_t r>
143 class subtract_with_carry_engine
145 public:
146     // types
147     typedef UIntType result_type;
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;
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);
163     // generating functions
164     result_type operator()();
165     void discard(unsigned long long z);
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);
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);
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);
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);
192 template<class Engine, size_t p, size_t r>
193 class discard_block_engine
195 public:
196     // types
197     typedef typename Engine::result_type result_type;
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(); }
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);
215     // generating functions
216     result_type operator()();
217     void discard(unsigned long long z);
219     // property functions
220     const Engine& base() const noexcept;
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);
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);
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);
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);
247 template<class Engine, size_t w, class UIntType>
248 class independent_bits_engine
250 public:
251     // types
252     typedef UIntType result_type;
254     // engine characteristics
255     static constexpr result_type min() { return 0; }
256     static constexpr result_type max() { return 2^w - 1; }
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);
268     // generating functions
269     result_type operator()(); void discard(unsigned long long z);
271     // property functions
272     const Engine& base() const noexcept;
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);
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);
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);
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);
299 template<class Engine, size_t k>
300 class shuffle_order_engine
302 public:
303     // types
304     typedef typename Engine::result_type result_type;
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; }
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);
321     // generating functions
322     result_type operator()();
323     void discard(unsigned long long z);
325     // property functions
326     const Engine& base() const noexcept;
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);
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);
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);
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);
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;
376 // Generators
378 class random_device
380 public:
381     // types
382     typedef unsigned int result_type;
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(); }
388     // constructors
389     explicit random_device(const string& token = "/dev/urandom");
391     // generating functions
392     result_type operator()();
394     // property functions
395     double entropy() const noexcept;
397     // no copy functions
398     random_device(const random_device& ) = delete;
399     void operator=(const random_device& ) = delete;
402 // Utilities
404 class seed_seq
406 public:
407     // types
408     typedef uint_least32_t result_type;
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);
417     // generating functions
418     template<class RandomAccessIterator>
419         void generate(RandomAccessIterator begin, RandomAccessIterator end);
421     // property functions
422     size_t size() const;
423     template<class OutputIterator>
424         void param(OutputIterator dest) const;
426     // no copy functions
427     seed_seq(const seed_seq&) = delete;
428     void operator=(const seed_seq& ) = delete;
431 template<class RealType, size_t bits, class URNG>
432     RealType generate_canonical(URNG& g);
434 // Distributions
436 template<class IntType = int>
437 class uniform_int_distribution
439 public:
440     // types
441     typedef IntType result_type;
443     class param_type
444     {
445     public:
446         typedef uniform_int_distribution distribution_type;
448         explicit param_type(IntType a = 0,
449                                     IntType b = numeric_limits<IntType>::max());
451         result_type a() const;
452         result_type b() const;
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     };
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();
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);
468     // property functions
469     result_type a() const;
470     result_type b() const;
472     param_type param() const;
473     void param(const param_type& parm);
475     result_type min() const;
476     result_type max() const;
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);
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);
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);
496 template<class RealType = double>
497 class uniform_real_distribution
499 public:
500     // types
501     typedef RealType result_type;
503     class param_type
504     {
505     public:
506         typedef uniform_real_distribution distribution_type;
508         explicit param_type(RealType a = 0,
509                             RealType b = 1);
511         result_type a() const;
512         result_type b() const;
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     };
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();
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);
527     // property functions
528     result_type a() const;
529     result_type b() const;
531     param_type param() const;
532     void param(const param_type& parm);
534     result_type min() const;
535     result_type max() const;
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);
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);
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);
555 class bernoulli_distribution
557 public:
558     // types
559     typedef bool result_type;
561     class param_type
562     {
563     public:
564         typedef bernoulli_distribution distribution_type;
566         explicit param_type(double p = 0.5);
568         double p() const;
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     };
574     // constructors and reset functions
575     explicit bernoulli_distribution(double p = 0.5);
576     explicit bernoulli_distribution(const param_type& parm);
577     void reset();
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);
583     // property functions
584     double p() const;
586     param_type param() const;
587     void param(const param_type& parm);
589     result_type min() const;
590     result_type max() const;
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);
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);
603     template <class charT, class traits>
604     friend
605     basic_istream<charT, traits>&
606     operator>>(basic_istream<charT, traits>& is,
607                bernoulli_distribution& x);
610 template<class IntType = int>
611 class binomial_distribution
613 public:
614     // types
615     typedef IntType result_type;
617     class param_type
618     {
619     public:
620         typedef binomial_distribution distribution_type;
622         explicit param_type(IntType t = 1, double p = 0.5);
624         IntType t() const;
625         double p() const;
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     };
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();
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);
640     // property functions
641     IntType t() const;
642     double p() const;
644     param_type param() const;
645     void param(const param_type& parm);
647     result_type min() const;
648     result_type max() const;
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);
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);
661     template <class charT, class traits>
662     friend
663     basic_istream<charT, traits>&
664     operator>>(basic_istream<charT, traits>& is,
665                binomial_distribution& x);
668 template<class IntType = int>
669 class geometric_distribution
671 public:
672     // types
673     typedef IntType result_type;
675     class param_type
676     {
677     public:
678         typedef geometric_distribution distribution_type;
680         explicit param_type(double p = 0.5);
682         double p() const;
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     };
688     // constructors and reset functions
689     explicit geometric_distribution(double p = 0.5);
690     explicit geometric_distribution(const param_type& parm);
691     void reset();
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);
697     // property functions
698     double p() const;
700     param_type param() const;
701     void param(const param_type& parm);
703     result_type min() const;
704     result_type max() const;
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);
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);
717     template <class charT, class traits>
718     friend
719     basic_istream<charT, traits>&
720     operator>>(basic_istream<charT, traits>& is,
721                geometric_distribution& x);
724 template<class IntType = int>
725 class negative_binomial_distribution
727 public:
728     // types
729     typedef IntType result_type;
731     class param_type
732     {
733     public:
734         typedef negative_binomial_distribution distribution_type;
736         explicit param_type(result_type k = 1, double p = 0.5);
738         result_type k() const;
739         double p() const;
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     };
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();
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);
754     // property functions
755     result_type k() const;
756     double p() const;
758     param_type param() const;
759     void param(const param_type& parm);
761     result_type min() const;
762     result_type max() const;
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);
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);
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);
782 template<class IntType = int>
783 class poisson_distribution
785 public:
786     // types
787     typedef IntType result_type;
789     class param_type
790     {
791     public:
792         typedef poisson_distribution distribution_type;
794         explicit param_type(double mean = 1.0);
796         double mean() const;
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     };
802     // constructors and reset functions
803     explicit poisson_distribution(double mean = 1.0);
804     explicit poisson_distribution(const param_type& parm);
805     void reset();
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);
811     // property functions
812     double mean() const;
814     param_type param() const;
815     void param(const param_type& parm);
817     result_type min() const;
818     result_type max() const;
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);
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);
831     template <class charT, class traits>
832     friend
833     basic_istream<charT, traits>&
834     operator>>(basic_istream<charT, traits>& is,
835                poisson_distribution& x);
838 template<class RealType = double>
839 class exponential_distribution
841 public:
842     // types
843     typedef RealType result_type;
845     class param_type
846     {
847     public:
848         typedef exponential_distribution distribution_type;
850         explicit param_type(result_type lambda = 1.0);
852         result_type lambda() const;
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     };
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();
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);
867     // property functions
868     result_type lambda() const;
870     param_type param() const;
871     void param(const param_type& parm);
873     result_type min() const;
874     result_type max() const;
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);
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);
887     template <class charT, class traits>
888     friend
889     basic_istream<charT, traits>&
890     operator>>(basic_istream<charT, traits>& is,
891                exponential_distribution& x);
894 template<class RealType = double>
895 class gamma_distribution
897 public:
898     // types
899     typedef RealType result_type;
901     class param_type
902     {
903     public:
904         typedef gamma_distribution distribution_type;
906         explicit param_type(result_type alpha = 1, result_type beta = 1);
908         result_type alpha() const;
909         result_type beta() const;
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     };
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();
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);
924     // property functions
925     result_type alpha() const;
926     result_type beta() const;
928     param_type param() const;
929     void param(const param_type& parm);
931     result_type min() const;
932     result_type max() const;
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);
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);
945     template <class charT, class traits>
946     friend
947     basic_istream<charT, traits>&
948     operator>>(basic_istream<charT, traits>& is,
949                gamma_distribution& x);
952 template<class RealType = double>
953 class weibull_distribution
955 public:
956     // types
957     typedef RealType result_type;
959     class param_type
960     {
961     public:
962         typedef weibull_distribution distribution_type;
964         explicit param_type(result_type alpha = 1, result_type beta = 1);
966         result_type a() const;
967         result_type b() const;
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     };
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();
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);
982     // property functions
983     result_type a() const;
984     result_type b() const;
986     param_type param() const;
987     void param(const param_type& parm);
989     result_type min() const;
990     result_type max() const;
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);
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);
1003     template <class charT, class traits>
1004     friend
1005     basic_istream<charT, traits>&
1006     operator>>(basic_istream<charT, traits>& is,
1007                weibull_distribution& x);
1010 template<class RealType = double>
1011 class extreme_value_distribution
1013 public:
1014     // types
1015     typedef RealType result_type;
1017     class param_type
1018     {
1019     public:
1020         typedef extreme_value_distribution distribution_type;
1022         explicit param_type(result_type a = 0, result_type b = 1);
1024         result_type a() const;
1025         result_type b() const;
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     };
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();
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);
1040     // property functions
1041     result_type a() const;
1042     result_type b() const;
1044     param_type param() const;
1045     void param(const param_type& parm);
1047     result_type min() const;
1048     result_type max() const;
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);
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);
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);
1068 template<class RealType = double>
1069 class normal_distribution
1071 public:
1072     // types
1073     typedef RealType result_type;
1075     class param_type
1076     {
1077     public:
1078         typedef normal_distribution distribution_type;
1080         explicit param_type(result_type mean = 0, result_type stddev = 1);
1082         result_type mean() const;
1083         result_type stddev() const;
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     };
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();
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);
1098     // property functions
1099     result_type mean() const;
1100     result_type stddev() const;
1102     param_type param() const;
1103     void param(const param_type& parm);
1105     result_type min() const;
1106     result_type max() const;
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);
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);
1119     template <class charT, class traits>
1120     friend
1121     basic_istream<charT, traits>&
1122     operator>>(basic_istream<charT, traits>& is,
1123                normal_distribution& x);
1126 template<class RealType = double>
1127 class lognormal_distribution
1129 public:
1130     // types
1131     typedef RealType result_type;
1133     class param_type
1134     {
1135     public:
1136         typedef lognormal_distribution distribution_type;
1138         explicit param_type(result_type m = 0, result_type s = 1);
1140         result_type m() const;
1141         result_type s() const;
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     };
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();
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);
1156     // property functions
1157     result_type m() const;
1158     result_type s() const;
1160     param_type param() const;
1161     void param(const param_type& parm);
1163     result_type min() const;
1164     result_type max() const;
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);
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);
1177     template <class charT, class traits>
1178     friend
1179     basic_istream<charT, traits>&
1180     operator>>(basic_istream<charT, traits>& is,
1181                lognormal_distribution& x);
1184 template<class RealType = double>
1185 class chi_squared_distribution
1187 public:
1188     // types
1189     typedef RealType result_type;
1191     class param_type
1192     {
1193     public:
1194         typedef chi_squared_distribution distribution_type;
1196         explicit param_type(result_type n = 1);
1198         result_type n() const;
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     };
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();
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);
1213     // property functions
1214     result_type n() const;
1216     param_type param() const;
1217     void param(const param_type& parm);
1219     result_type min() const;
1220     result_type max() const;
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);
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);
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);
1240 template<class RealType = double>
1241 class cauchy_distribution
1243 public:
1244     // types
1245     typedef RealType result_type;
1247     class param_type
1248     {
1249     public:
1250         typedef cauchy_distribution distribution_type;
1252         explicit param_type(result_type a = 0, result_type b = 1);
1254         result_type a() const;
1255         result_type b() const;
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     };
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();
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);
1270     // property functions
1271     result_type a() const;
1272     result_type b() const;
1274     param_type param() const;
1275     void param(const param_type& parm);
1277     result_type min() const;
1278     result_type max() const;
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);
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);
1291     template <class charT, class traits>
1292     friend
1293     basic_istream<charT, traits>&
1294     operator>>(basic_istream<charT, traits>& is,
1295                cauchy_distribution& x);
1298 template<class RealType = double>
1299 class fisher_f_distribution
1301 public:
1302     // types
1303     typedef RealType result_type;
1305     class param_type
1306     {
1307     public:
1308         typedef fisher_f_distribution distribution_type;
1310         explicit param_type(result_type m = 1, result_type n = 1);
1312         result_type m() const;
1313         result_type n() const;
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     };
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();
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);
1328     // property functions
1329     result_type m() const;
1330     result_type n() const;
1332     param_type param() const;
1333     void param(const param_type& parm);
1335     result_type min() const;
1336     result_type max() const;
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);
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);
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);
1356 template<class RealType = double>
1357 class student_t_distribution
1359 public:
1360     // types
1361     typedef RealType result_type;
1363     class param_type
1364     {
1365     public:
1366         typedef student_t_distribution distribution_type;
1368         explicit param_type(result_type n = 1);
1370         result_type n() const;
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     };
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();
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);
1385     // property functions
1386     result_type n() const;
1388     param_type param() const;
1389     void param(const param_type& parm);
1391     result_type min() const;
1392     result_type max() const;
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);
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);
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);
1412 template<class IntType = int>
1413 class discrete_distribution
1415 public:
1416     // types
1417     typedef IntType result_type;
1419     class param_type
1420     {
1421     public:
1422         typedef discrete_distribution distribution_type;
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);
1431         vector<double> probabilities() const;
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     };
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();
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);
1452     // property functions
1453     vector<double> probabilities() const;
1455     param_type param() const;
1456     void param(const param_type& parm);
1458     result_type min() const;
1459     result_type max() const;
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);
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);
1472     template <class charT, class traits>
1473     friend
1474     basic_istream<charT, traits>&
1475     operator>>(basic_istream<charT, traits>& is,
1476                discrete_distribution& x);
1479 template<class RealType = double>
1480 class piecewise_constant_distribution
1482     // types
1483     typedef RealType result_type;
1485     class param_type
1486     {
1487     public:
1488         typedef piecewise_constant_distribution distribution_type;
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);
1500         vector<result_type> intervals() const;
1501         vector<result_type> densities() const;
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     };
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();
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);
1526     // property functions
1527     vector<result_type> intervals() const;
1528     vector<result_type> densities() const;
1530     param_type param() const;
1531     void param(const param_type& parm);
1533     result_type min() const;
1534     result_type max() const;
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);
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);
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);
1554 template<class RealType = double>
1555 class piecewise_linear_distribution
1557     // types
1558     typedef RealType result_type;
1560     class param_type
1561     {
1562     public:
1563         typedef piecewise_linear_distribution distribution_type;
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);
1575         vector<result_type> intervals() const;
1576         vector<result_type> densities() const;
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     };
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);
1589     template<class UnaryOperation>
1590         piecewise_linear_distribution(initializer_list<result_type> bl,
1591                                       UnaryOperation fw);
1593     template<class UnaryOperation>
1594         piecewise_linear_distribution(size_t nw, result_type xmin,
1595                                       result_type xmax, UnaryOperation fw);
1597     explicit piecewise_linear_distribution(const param_type& parm);
1598     void reset();
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);
1604     // property functions
1605     vector<result_type> intervals() const;
1606     vector<result_type> densities() const;
1608     param_type param() const;
1609     void param(const param_type& parm);
1611     result_type min() const;
1612     result_type max() const;
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);
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);
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);
1632 } // std
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>
1649 #include <__undef_min_max>
1651 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1652 #pragma GCC system_header
1653 #endif
1655 _LIBCPP_BEGIN_NAMESPACE_STD
1657 // __is_seed_sequence
1659 template <class _Sseq, class _Engine>
1660 struct __is_seed_sequence
1662     static _LIBCPP_CONSTEXPR const bool value =
1663               !is_convertible<_Sseq, typename _Engine::result_type>::value &&
1664               !is_same<typename remove_cv<_Sseq>::type, _Engine>::value;
1667 // linear_congruential_engine
1669 template <unsigned long long __a, unsigned long long __c,
1670           unsigned long long __m, unsigned long long _Mp,
1671           bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)>
1672 struct __lce_ta;
1674 // 64
1676 template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
1677 struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true>
1679     typedef unsigned long long result_type;
1680     _LIBCPP_INLINE_VISIBILITY
1681     static result_type next(result_type __x)
1682     {
1683         // Schrage's algorithm
1684         const result_type __q = __m / __a;
1685         const result_type __r = __m % __a;
1686         const result_type __t0 = __a * (__x % __q);
1687         const result_type __t1 = __r * (__x / __q);
1688         __x = __t0 + (__t0 < __t1) * __m - __t1;
1689         __x += __c - (__x >= __m - __c) * __m;
1690         return __x;
1691     }
1694 template <unsigned long long __a, unsigned long long __m>
1695 struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true>
1697     typedef unsigned long long result_type;
1698     _LIBCPP_INLINE_VISIBILITY
1699     static result_type next(result_type __x)
1700     {
1701         // Schrage's algorithm
1702         const result_type __q = __m / __a;
1703         const result_type __r = __m % __a;
1704         const result_type __t0 = __a * (__x % __q);
1705         const result_type __t1 = __r * (__x / __q);
1706         __x = __t0 + (__t0 < __t1) * __m - __t1;
1707         return __x;
1708     }
1711 template <unsigned long long __a, unsigned long long __c, unsigned long long __m>
1712 struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false>
1714     typedef unsigned long long result_type;
1715     _LIBCPP_INLINE_VISIBILITY
1716     static result_type next(result_type __x)
1717     {
1718         return (__a * __x + __c) % __m;
1719     }
1722 template <unsigned long long __a, unsigned long long __c>
1723 struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false>
1725     typedef unsigned long long result_type;
1726     _LIBCPP_INLINE_VISIBILITY
1727     static result_type next(result_type __x)
1728     {
1729         return __a * __x + __c;
1730     }
1733 // 32
1735 template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
1736 struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true>
1738     typedef unsigned result_type;
1739     _LIBCPP_INLINE_VISIBILITY
1740     static result_type next(result_type __x)
1741     {
1742         const result_type __a = static_cast<result_type>(_Ap);
1743         const result_type __c = static_cast<result_type>(_Cp);
1744         const result_type __m = static_cast<result_type>(_Mp);
1745         // Schrage's algorithm
1746         const result_type __q = __m / __a;
1747         const result_type __r = __m % __a;
1748         const result_type __t0 = __a * (__x % __q);
1749         const result_type __t1 = __r * (__x / __q);
1750         __x = __t0 + (__t0 < __t1) * __m - __t1;
1751         __x += __c - (__x >= __m - __c) * __m;
1752         return __x;
1753     }
1756 template <unsigned long long _Ap, unsigned long long _Mp>
1757 struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true>
1759     typedef unsigned result_type;
1760     _LIBCPP_INLINE_VISIBILITY
1761     static result_type next(result_type __x)
1762     {
1763         const result_type __a = static_cast<result_type>(_Ap);
1764         const result_type __m = static_cast<result_type>(_Mp);
1765         // Schrage's algorithm
1766         const result_type __q = __m / __a;
1767         const result_type __r = __m % __a;
1768         const result_type __t0 = __a * (__x % __q);
1769         const result_type __t1 = __r * (__x / __q);
1770         __x = __t0 + (__t0 < __t1) * __m - __t1;
1771         return __x;
1772     }
1775 template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp>
1776 struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false>
1778     typedef unsigned result_type;
1779     _LIBCPP_INLINE_VISIBILITY
1780     static result_type next(result_type __x)
1781     {
1782         const result_type __a = static_cast<result_type>(_Ap);
1783         const result_type __c = static_cast<result_type>(_Cp);
1784         const result_type __m = static_cast<result_type>(_Mp);
1785         return (__a * __x + __c) % __m;
1786     }
1789 template <unsigned long long _Ap, unsigned long long _Cp>
1790 struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false>
1792     typedef unsigned result_type;
1793     _LIBCPP_INLINE_VISIBILITY
1794     static result_type next(result_type __x)
1795     {
1796         const result_type __a = static_cast<result_type>(_Ap);
1797         const result_type __c = static_cast<result_type>(_Cp);
1798         return __a * __x + __c;
1799     }
1802 // 16
1804 template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b>
1805 struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b>
1807     typedef unsigned short result_type;
1808     _LIBCPP_INLINE_VISIBILITY
1809     static result_type next(result_type __x)
1810     {
1811         return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x));
1812     }
1815 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1816 class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine;
1818 template <class _CharT, class _Traits,
1819           class _Up, _Up _Ap, _Up _Cp, _Up _Np>
1820 _LIBCPP_INLINE_VISIBILITY
1821 basic_ostream<_CharT, _Traits>&
1822 operator<<(basic_ostream<_CharT, _Traits>& __os,
1823            const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
1825 template <class _CharT, class _Traits,
1826           class _Up, _Up _Ap, _Up _Cp, _Up _Np>
1827 basic_istream<_CharT, _Traits>&
1828 operator>>(basic_istream<_CharT, _Traits>& __is,
1829            linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
1831 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1832 class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine
1834 public:
1835     // types
1836     typedef _UIntType result_type;
1838 private:
1839     result_type __x_;
1841     static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0);
1843     static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters");
1844     static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters");
1845 public:
1846     static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u;
1847     static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u;
1848     static_assert(_Min < _Max,           "linear_congruential_engine invalid parameters");
1850     // engine characteristics
1851     static _LIBCPP_CONSTEXPR const result_type multiplier = __a;
1852     static _LIBCPP_CONSTEXPR const result_type increment = __c;
1853     static _LIBCPP_CONSTEXPR const result_type modulus = __m;
1854     _LIBCPP_INLINE_VISIBILITY
1855     static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
1856     _LIBCPP_INLINE_VISIBILITY
1857     static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
1858     static _LIBCPP_CONSTEXPR const result_type default_seed = 1u;
1860     // constructors and seeding functions
1861     _LIBCPP_INLINE_VISIBILITY
1862     explicit linear_congruential_engine(result_type __s = default_seed)
1863         {seed(__s);}
1864     template<class _Sseq>
1865         _LIBCPP_INLINE_VISIBILITY
1866         explicit linear_congruential_engine(_Sseq& __q,
1867         typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0)
1868         {seed(__q);}
1869     _LIBCPP_INLINE_VISIBILITY
1870     void seed(result_type __s = default_seed)
1871         {seed(integral_constant<bool, __m == 0>(),
1872               integral_constant<bool, __c == 0>(), __s);}
1873     template<class _Sseq>
1874         _LIBCPP_INLINE_VISIBILITY
1875         typename enable_if
1876         <
1877             __is_seed_sequence<_Sseq, linear_congruential_engine>::value,
1878             void
1879         >::type
1880         seed(_Sseq& __q)
1881             {__seed(__q, integral_constant<unsigned,
1882                 1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32
1883                              :  (__m > 0x100000000ull))>());}
1885     // generating functions
1886     _LIBCPP_INLINE_VISIBILITY
1887     result_type operator()()
1888         {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));}
1889     _LIBCPP_INLINE_VISIBILITY
1890     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
1892     friend _LIBCPP_INLINE_VISIBILITY
1893     bool operator==(const linear_congruential_engine& __x,
1894                     const linear_congruential_engine& __y)
1895         {return __x.__x_ == __y.__x_;}
1896     friend _LIBCPP_INLINE_VISIBILITY
1897     bool operator!=(const linear_congruential_engine& __x,
1898                     const linear_congruential_engine& __y)
1899         {return !(__x == __y);}
1901 private:
1903     _LIBCPP_INLINE_VISIBILITY
1904     void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;}
1905     _LIBCPP_INLINE_VISIBILITY
1906     void seed(true_type, false_type, result_type __s) {__x_ = __s;}
1907     _LIBCPP_INLINE_VISIBILITY
1908     void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ?
1909                                                                  1 : __s % __m;}
1910     _LIBCPP_INLINE_VISIBILITY
1911     void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;}
1913     template<class _Sseq>
1914         void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
1915     template<class _Sseq>
1916         void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
1918     template <class _CharT, class _Traits,
1919               class _Up, _Up _Ap, _Up _Cp, _Up _Np>
1920     friend
1921     basic_ostream<_CharT, _Traits>&
1922     operator<<(basic_ostream<_CharT, _Traits>& __os,
1923                const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
1925     template <class _CharT, class _Traits,
1926               class _Up, _Up _Ap, _Up _Cp, _Up _Np>
1927     friend
1928     basic_istream<_CharT, _Traits>&
1929     operator>>(basic_istream<_CharT, _Traits>& __is,
1930                linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
1933 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1934     _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
1935     linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
1937 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1938     _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
1939     linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
1941 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1942     _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
1943     linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
1945 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1946     _LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
1947     linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
1949 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1950 template<class _Sseq>
1951 void
1952 linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
1953                                                  integral_constant<unsigned, 1>)
1955     const unsigned __k = 1;
1956     uint32_t __ar[__k+3];
1957     __q.generate(__ar, __ar + __k + 3);
1958     result_type __s = static_cast<result_type>(__ar[3] % __m);
1959     __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
1962 template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1963 template<class _Sseq>
1964 void
1965 linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
1966                                                  integral_constant<unsigned, 2>)
1968     const unsigned __k = 2;
1969     uint32_t __ar[__k+3];
1970     __q.generate(__ar, __ar + __k + 3);
1971     result_type __s = static_cast<result_type>((__ar[3] +
1972                                               ((uint64_t)__ar[4] << 32)) % __m);
1973     __x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
1976 template <class _CharT, class _Traits,
1977           class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1978 inline _LIBCPP_INLINE_VISIBILITY
1979 basic_ostream<_CharT, _Traits>&
1980 operator<<(basic_ostream<_CharT, _Traits>& __os,
1981            const linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
1983     __save_flags<_CharT, _Traits> __lx(__os);
1984     __os.flags(ios_base::dec | ios_base::left);
1985     __os.fill(__os.widen(' '));
1986     return __os << __x.__x_;
1989 template <class _CharT, class _Traits,
1990           class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
1991 basic_istream<_CharT, _Traits>&
1992 operator>>(basic_istream<_CharT, _Traits>& __is,
1993            linear_congruential_engine<_UIntType, __a, __c, __m>& __x)
1995     __save_flags<_CharT, _Traits> __lx(__is);
1996     __is.flags(ios_base::dec | ios_base::skipws);
1997     _UIntType __t;
1998     __is >> __t;
1999     if (!__is.fail())
2000         __x.__x_ = __t;
2001     return __is;
2004 typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
2005                                                                    minstd_rand0;
2006 typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>
2007                                                                     minstd_rand;
2008 typedef minstd_rand                                       default_random_engine;
2009 // mersenne_twister_engine
2011 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2012           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2013           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2014 class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine;
2016 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2017           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2018           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2019 bool
2020 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2021                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2022            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2023                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2025 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2026           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2027           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2028 _LIBCPP_INLINE_VISIBILITY
2029 bool
2030 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2031                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2032            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2033                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2035 template <class _CharT, class _Traits,
2036           class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2037           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2038           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2039 basic_ostream<_CharT, _Traits>&
2040 operator<<(basic_ostream<_CharT, _Traits>& __os,
2041            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2042                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2044 template <class _CharT, class _Traits,
2045           class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2046           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2047           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2048 basic_istream<_CharT, _Traits>&
2049 operator>>(basic_istream<_CharT, _Traits>& __is,
2050            mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2051                                    _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2053 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2054           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2055           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2056 class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine
2058 public:
2059     // types
2060     typedef _UIntType result_type;
2062 private:
2063     result_type __x_[__n];
2064     size_t      __i_;
2066     static_assert(  0 <  __m, "mersenne_twister_engine invalid parameters");
2067     static_assert(__m <= __n, "mersenne_twister_engine invalid parameters");
2068     static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
2069     static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters");
2070     static_assert(  2 <= __w, "mersenne_twister_engine invalid parameters");
2071     static_assert(__r <= __w, "mersenne_twister_engine invalid parameters");
2072     static_assert(__u <= __w, "mersenne_twister_engine invalid parameters");
2073     static_assert(__s <= __w, "mersenne_twister_engine invalid parameters");
2074     static_assert(__t <= __w, "mersenne_twister_engine invalid parameters");
2075     static_assert(__l <= __w, "mersenne_twister_engine invalid parameters");
2076 public:
2077     static _LIBCPP_CONSTEXPR const result_type _Min = 0;
2078     static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
2079                                                       (result_type(1) << __w) - result_type(1);
2080     static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters");
2081     static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters");
2082     static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters");
2083     static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters");
2084     static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters");
2085     static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters");
2087     // engine characteristics
2088     static _LIBCPP_CONSTEXPR const size_t word_size = __w;
2089     static _LIBCPP_CONSTEXPR const size_t state_size = __n;
2090     static _LIBCPP_CONSTEXPR const size_t shift_size = __m;
2091     static _LIBCPP_CONSTEXPR const size_t mask_bits = __r;
2092     static _LIBCPP_CONSTEXPR const result_type xor_mask = __a;
2093     static _LIBCPP_CONSTEXPR const size_t tempering_u = __u;
2094     static _LIBCPP_CONSTEXPR const result_type tempering_d = __d;
2095     static _LIBCPP_CONSTEXPR const size_t tempering_s = __s;
2096     static _LIBCPP_CONSTEXPR const result_type tempering_b = __b;
2097     static _LIBCPP_CONSTEXPR const size_t tempering_t = __t;
2098     static _LIBCPP_CONSTEXPR const result_type tempering_c = __c;
2099     static _LIBCPP_CONSTEXPR const size_t tempering_l = __l;
2100     static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f;
2101     _LIBCPP_INLINE_VISIBILITY
2102     static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
2103     _LIBCPP_INLINE_VISIBILITY
2104     static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
2105     static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
2107     // constructors and seeding functions
2108     _LIBCPP_INLINE_VISIBILITY
2109     explicit mersenne_twister_engine(result_type __sd = default_seed)
2110         {seed(__sd);}
2111     template<class _Sseq>
2112         _LIBCPP_INLINE_VISIBILITY
2113         explicit mersenne_twister_engine(_Sseq& __q,
2114         typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0)
2115         {seed(__q);}
2116     void seed(result_type __sd = default_seed);
2117     template<class _Sseq>
2118         _LIBCPP_INLINE_VISIBILITY
2119         typename enable_if
2120         <
2121             __is_seed_sequence<_Sseq, mersenne_twister_engine>::value,
2122             void
2123         >::type
2124         seed(_Sseq& __q)
2125             {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
2127     // generating functions
2128     result_type operator()();
2129     _LIBCPP_INLINE_VISIBILITY
2130     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
2132     template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2133               _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2134               _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2135     friend
2136     bool
2137     operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2138                                              _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2139                const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2140                                              _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2142     template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2143               _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2144               _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2145     friend
2146     bool
2147     operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2148                                              _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2149                const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2150                                              _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2152     template <class _CharT, class _Traits,
2153               class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2154               _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2155               _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2156     friend
2157     basic_ostream<_CharT, _Traits>&
2158     operator<<(basic_ostream<_CharT, _Traits>& __os,
2159                const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2160                                              _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2162     template <class _CharT, class _Traits,
2163               class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2164               _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2165               _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2166     friend
2167     basic_istream<_CharT, _Traits>&
2168     operator>>(basic_istream<_CharT, _Traits>& __is,
2169                mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2170                                        _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2171 private:
2173     template<class _Sseq>
2174         void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
2175     template<class _Sseq>
2176         void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
2178     template <size_t __count>
2179         _LIBCPP_INLINE_VISIBILITY
2180         static
2181         typename enable_if
2182         <
2183             __count < __w,
2184             result_type
2185         >::type
2186         __lshift(result_type __x) {return (__x << __count) & _Max;}
2188     template <size_t __count>
2189         _LIBCPP_INLINE_VISIBILITY
2190         static
2191         typename enable_if
2192         <
2193             (__count >= __w),
2194             result_type
2195         >::type
2196         __lshift(result_type) {return result_type(0);}
2198     template <size_t __count>
2199         _LIBCPP_INLINE_VISIBILITY
2200         static
2201         typename enable_if
2202         <
2203             __count < _Dt,
2204             result_type
2205         >::type
2206         __rshift(result_type __x) {return __x >> __count;}
2208     template <size_t __count>
2209         _LIBCPP_INLINE_VISIBILITY
2210         static
2211         typename enable_if
2212         <
2213             (__count >= _Dt),
2214             result_type
2215         >::type
2216         __rshift(result_type) {return result_type(0);}
2219 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2220           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2221           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2222     _LIBCPP_CONSTEXPR const size_t
2223     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size;
2225 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2226           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2227           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2228     _LIBCPP_CONSTEXPR const size_t 
2229     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size;
2231 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2232           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2233           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2234     _LIBCPP_CONSTEXPR const size_t 
2235     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size;
2237 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2238           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2239           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2240     _LIBCPP_CONSTEXPR const size_t 
2241     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits;
2243 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2244           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2245           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2246     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2247     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask;
2249 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2250           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2251           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2252     _LIBCPP_CONSTEXPR const size_t 
2253     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u;
2255 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2256           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2257           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2258     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2259     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d;
2261 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2262           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2263           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2264     _LIBCPP_CONSTEXPR const size_t 
2265     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s;
2267 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2268           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2269           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2270     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2271     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b;
2273 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2274           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2275           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2276     _LIBCPP_CONSTEXPR const size_t 
2277     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t;
2279 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2280           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2281           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2282     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2283     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c;
2285 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2286           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2287           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2288     _LIBCPP_CONSTEXPR const size_t 
2289     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l;
2291 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2292           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2293           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2294     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2295     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier;
2297 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2298           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2299           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2300     _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type
2301     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed;
2303 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2304           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2305           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2306 void
2307 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
2308     __t, __c, __l, __f>::seed(result_type __sd)
2309 {   // __w >= 2
2310     __x_[0] = __sd & _Max;
2311     for (size_t __i = 1; __i < __n; ++__i)
2312         __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max;
2313     __i_ = 0;
2316 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2317           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2318           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2319 template<class _Sseq>
2320 void
2321 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
2322     __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>)
2324     const unsigned __k = 1;
2325     uint32_t __ar[__n * __k];
2326     __q.generate(__ar, __ar + __n * __k);
2327     for (size_t __i = 0; __i < __n; ++__i)
2328         __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
2329     const result_type __mask = __r == _Dt ? result_type(~0) :
2330                                        (result_type(1) << __r) - result_type(1);
2331     __i_ = 0;
2332     if ((__x_[0] & ~__mask) == 0)
2333     {
2334         for (size_t __i = 1; __i < __n; ++__i)
2335             if (__x_[__i] != 0)
2336                 return;
2337         __x_[0] = _Max;
2338     }
2341 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2342           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2343           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2344 template<class _Sseq>
2345 void
2346 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
2347     __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>)
2349     const unsigned __k = 2;
2350     uint32_t __ar[__n * __k];
2351     __q.generate(__ar, __ar + __n * __k);
2352     for (size_t __i = 0; __i < __n; ++__i)
2353         __x_[__i] = static_cast<result_type>(
2354             (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
2355     const result_type __mask = __r == _Dt ? result_type(~0) :
2356                                        (result_type(1) << __r) - result_type(1);
2357     __i_ = 0;
2358     if ((__x_[0] & ~__mask) == 0)
2359     {
2360         for (size_t __i = 1; __i < __n; ++__i)
2361             if (__x_[__i] != 0)
2362                 return;
2363         __x_[0] = _Max;
2364     }
2367 template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
2368           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
2369           _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
2370 _UIntType
2371 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b,
2372     __t, __c, __l, __f>::operator()()
2374     const size_t __j = (__i_ + 1) % __n;
2375     const result_type __mask = __r == _Dt ? result_type(~0) :
2376                                        (result_type(1) << __r) - result_type(1);
2377     const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
2378     const size_t __k = (__i_ + __m) % __n;
2379     __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1));
2380     result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d);
2381     __i_ = __j;
2382     __z ^= __lshift<__s>(__z) & __b;
2383     __z ^= __lshift<__t>(__z) & __c;
2384     return __z ^ __rshift<__l>(__z);
2387 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2388           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2389           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2390 bool
2391 operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2392                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2393            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2394                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
2396     if (__x.__i_ == __y.__i_)
2397         return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_);
2398     if (__x.__i_ == 0 || __y.__i_ == 0)
2399     {
2400         size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_);
2401         if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
2402                          __y.__x_ + __y.__i_))
2403             return false;
2404         if (__x.__i_ == 0)
2405             return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_);
2406         return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j);
2407     }
2408     if (__x.__i_ < __y.__i_)
2409     {
2410         size_t __j = _Np - __y.__i_;
2411         if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
2412                          __y.__x_ + __y.__i_))
2413             return false;
2414         if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np,
2415                          __y.__x_))
2416             return false;
2417         return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
2418                            __y.__x_ + (_Np - (__x.__i_ + __j)));
2419     }
2420     size_t __j = _Np - __x.__i_;
2421     if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
2422                      __x.__x_ + __x.__i_))
2423         return false;
2424     if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np,
2425                      __x.__x_))
2426         return false;
2427     return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
2428                        __x.__x_ + (_Np - (__y.__i_ + __j)));
2431 template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2432           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2433           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2434 inline _LIBCPP_INLINE_VISIBILITY
2435 bool
2436 operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2437                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
2438            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2439                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __y)
2441     return !(__x == __y);
2444 template <class _CharT, class _Traits,
2445           class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2446           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2447           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2448 basic_ostream<_CharT, _Traits>&
2449 operator<<(basic_ostream<_CharT, _Traits>& __os,
2450            const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2451                                          _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
2453     __save_flags<_CharT, _Traits> __lx(__os);
2454     __os.flags(ios_base::dec | ios_base::left);
2455     _CharT __sp = __os.widen(' ');
2456     __os.fill(__sp);
2457     __os << __x.__x_[__x.__i_];
2458     for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j)
2459         __os << __sp << __x.__x_[__j];
2460     for (size_t __j = 0; __j < __x.__i_; ++__j)
2461         __os << __sp << __x.__x_[__j];
2462     return __os;
2465 template <class _CharT, class _Traits,
2466           class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
2467           _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
2468           _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp>
2469 basic_istream<_CharT, _Traits>&
2470 operator>>(basic_istream<_CharT, _Traits>& __is,
2471            mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp,
2472                                    _Bp, _Tp, _Cp, _Lp, _Fp>& __x)
2474     __save_flags<_CharT, _Traits> __lx(__is);
2475     __is.flags(ios_base::dec | ios_base::skipws);
2476     _UI __t[_Np];
2477     for (size_t __i = 0; __i < _Np; ++__i)
2478         __is >> __t[__i];
2479     if (!__is.fail())
2480     {
2481         for (size_t __i = 0; __i < _Np; ++__i)
2482             __x.__x_[__i] = __t[__i];
2483         __x.__i_ = 0;
2484     }
2485     return __is;
2488 typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31,
2489                                 0x9908b0df, 11, 0xffffffff,
2490                                 7,  0x9d2c5680,
2491                                 15, 0xefc60000,
2492                                 18, 1812433253>                         mt19937;
2493 typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
2494                                 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL,
2495                                 17, 0x71d67fffeda60000ULL,
2496                                 37, 0xfff7eee000000000ULL,
2497                                 43, 6364136223846793005ULL>          mt19937_64;
2499 // subtract_with_carry_engine
2501 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2502 class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine;
2504 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2505 bool
2506 operator==(
2507     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2508     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y);
2510 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2511 _LIBCPP_INLINE_VISIBILITY
2512 bool
2513 operator!=(
2514     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2515     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y);
2517 template <class _CharT, class _Traits,
2518           class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2519 basic_ostream<_CharT, _Traits>&
2520 operator<<(basic_ostream<_CharT, _Traits>& __os,
2521            const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x);
2523 template <class _CharT, class _Traits,
2524           class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2525 basic_istream<_CharT, _Traits>&
2526 operator>>(basic_istream<_CharT, _Traits>& __is,
2527            subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x);
2529 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2530 class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine
2532 public:
2533     // types
2534     typedef _UIntType result_type;
2536 private:
2537     result_type __x_[__r];
2538     result_type  __c_;
2539     size_t      __i_;
2541     static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
2542     static_assert(  0 <  __w, "subtract_with_carry_engine invalid parameters");
2543     static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters");
2544     static_assert(  0 <  __s, "subtract_with_carry_engine invalid parameters");
2545     static_assert(__s <  __r, "subtract_with_carry_engine invalid parameters");
2546 public:
2547     static _LIBCPP_CONSTEXPR const result_type _Min = 0;
2548     static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
2549                                                       (result_type(1) << __w) - result_type(1);
2550     static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters");
2552     // engine characteristics
2553     static _LIBCPP_CONSTEXPR const size_t word_size = __w;
2554     static _LIBCPP_CONSTEXPR const size_t short_lag = __s;
2555     static _LIBCPP_CONSTEXPR const size_t long_lag = __r;
2556     _LIBCPP_INLINE_VISIBILITY
2557     static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
2558     _LIBCPP_INLINE_VISIBILITY
2559     static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
2560     static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u;
2562     // constructors and seeding functions
2563     _LIBCPP_INLINE_VISIBILITY
2564     explicit subtract_with_carry_engine(result_type __sd = default_seed)
2565         {seed(__sd);}
2566     template<class _Sseq>
2567         _LIBCPP_INLINE_VISIBILITY
2568         explicit subtract_with_carry_engine(_Sseq& __q,
2569         typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0)
2570         {seed(__q);}
2571     _LIBCPP_INLINE_VISIBILITY
2572     void seed(result_type __sd = default_seed)
2573         {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
2574     template<class _Sseq>
2575         _LIBCPP_INLINE_VISIBILITY
2576         typename enable_if
2577         <
2578             __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value,
2579             void
2580         >::type
2581         seed(_Sseq& __q)
2582             {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());}
2584     // generating functions
2585     result_type operator()();
2586     _LIBCPP_INLINE_VISIBILITY
2587     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
2589     template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2590     friend
2591     bool
2592     operator==(
2593         const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2594         const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y);
2596     template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2597     friend
2598     bool
2599     operator!=(
2600         const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2601         const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y);
2603     template <class _CharT, class _Traits,
2604               class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2605     friend
2606     basic_ostream<_CharT, _Traits>&
2607     operator<<(basic_ostream<_CharT, _Traits>& __os,
2608                const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x);
2610     template <class _CharT, class _Traits,
2611               class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2612     friend
2613     basic_istream<_CharT, _Traits>&
2614     operator>>(basic_istream<_CharT, _Traits>& __is,
2615                subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x);
2617 private:
2619     void seed(result_type __sd, integral_constant<unsigned, 1>);
2620     void seed(result_type __sd, integral_constant<unsigned, 2>);
2621     template<class _Sseq>
2622         void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
2623     template<class _Sseq>
2624         void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
2627 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2628     _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
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>::short_lag;
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>::long_lag;
2636 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2637     _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type
2638     subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed;
2640 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2641 void
2642 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
2643         integral_constant<unsigned, 1>)
2645     linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
2646         __e(__sd == 0u ? default_seed : __sd);
2647     for (size_t __i = 0; __i < __r; ++__i)
2648         __x_[__i] = static_cast<result_type>(__e() & _Max);
2649     __c_ = __x_[__r-1] == 0;
2650     __i_ = 0;
2653 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2654 void
2655 subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd,
2656         integral_constant<unsigned, 2>)
2658     linear_congruential_engine<result_type, 40014u, 0u, 2147483563u>
2659         __e(__sd == 0u ? default_seed : __sd);
2660     for (size_t __i = 0; __i < __r; ++__i)
2661     {
2662         result_type __e0 = __e();
2663         __x_[__i] = static_cast<result_type>(
2664                                     (__e0 + ((uint64_t)__e() << 32)) & _Max);
2665     }
2666     __c_ = __x_[__r-1] == 0;
2667     __i_ = 0;
2670 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2671 template<class _Sseq>
2672 void
2673 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
2674         integral_constant<unsigned, 1>)
2676     const unsigned __k = 1;
2677     uint32_t __ar[__r * __k];
2678     __q.generate(__ar, __ar + __r * __k);
2679     for (size_t __i = 0; __i < __r; ++__i)
2680         __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
2681     __c_ = __x_[__r-1] == 0;
2682     __i_ = 0;
2685 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2686 template<class _Sseq>
2687 void
2688 subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q,
2689         integral_constant<unsigned, 2>)
2691     const unsigned __k = 2;
2692     uint32_t __ar[__r * __k];
2693     __q.generate(__ar, __ar + __r * __k);
2694     for (size_t __i = 0; __i < __r; ++__i)
2695         __x_[__i] = static_cast<result_type>(
2696                   (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
2697     __c_ = __x_[__r-1] == 0;
2698     __i_ = 0;
2701 template<class _UIntType, size_t __w, size_t __s, size_t __r>
2702 _UIntType
2703 subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()()
2705     const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r];
2706     result_type& __xr = __x_[__i_];
2707     result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1;
2708     __xr = (__xs - __xr - __c_) & _Max;
2709     __c_ = __new_c;
2710     __i_ = (__i_ + 1) % __r;
2711     return __xr;
2714 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2715 bool
2716 operator==(
2717     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2718     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y)
2720     if (__x.__c_ != __y.__c_)
2721         return false;
2722     if (__x.__i_ == __y.__i_)
2723         return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_);
2724     if (__x.__i_ == 0 || __y.__i_ == 0)
2725     {
2726         size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_);
2727         if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j,
2728                          __y.__x_ + __y.__i_))
2729             return false;
2730         if (__x.__i_ == 0)
2731             return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_);
2732         return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j);
2733     }
2734     if (__x.__i_ < __y.__i_)
2735     {
2736         size_t __j = _Rp - __y.__i_;
2737         if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j),
2738                          __y.__x_ + __y.__i_))
2739             return false;
2740         if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp,
2741                          __y.__x_))
2742             return false;
2743         return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
2744                            __y.__x_ + (_Rp - (__x.__i_ + __j)));
2745     }
2746     size_t __j = _Rp - __x.__i_;
2747     if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j),
2748                      __x.__x_ + __x.__i_))
2749         return false;
2750     if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp,
2751                      __x.__x_))
2752         return false;
2753     return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
2754                        __x.__x_ + (_Rp - (__y.__i_ + __j)));
2757 template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2758 inline _LIBCPP_INLINE_VISIBILITY
2759 bool
2760 operator!=(
2761     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x,
2762     const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y)
2764     return !(__x == __y);
2767 template <class _CharT, class _Traits,
2768           class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2769 basic_ostream<_CharT, _Traits>&
2770 operator<<(basic_ostream<_CharT, _Traits>& __os,
2771            const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x)
2773     __save_flags<_CharT, _Traits> __lx(__os);
2774     __os.flags(ios_base::dec | ios_base::left);
2775     _CharT __sp = __os.widen(' ');
2776     __os.fill(__sp);
2777     __os << __x.__x_[__x.__i_];
2778     for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j)
2779         __os << __sp << __x.__x_[__j];
2780     for (size_t __j = 0; __j < __x.__i_; ++__j)
2781         __os << __sp << __x.__x_[__j];
2782     __os << __sp << __x.__c_;
2783     return __os;
2786 template <class _CharT, class _Traits,
2787           class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
2788 basic_istream<_CharT, _Traits>&
2789 operator>>(basic_istream<_CharT, _Traits>& __is,
2790            subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x)
2792     __save_flags<_CharT, _Traits> __lx(__is);
2793     __is.flags(ios_base::dec | ios_base::skipws);
2794     _UI __t[_Rp+1];
2795     for (size_t __i = 0; __i < _Rp+1; ++__i)
2796         __is >> __t[__i];
2797     if (!__is.fail())
2798     {
2799         for (size_t __i = 0; __i < _Rp; ++__i)
2800             __x.__x_[__i] = __t[__i];
2801         __x.__c_ = __t[_Rp];
2802         __x.__i_ = 0;
2803     }
2804     return __is;
2807 typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>     ranlux24_base;
2808 typedef subtract_with_carry_engine<uint_fast64_t, 48,  5, 12>     ranlux48_base;
2810 // discard_block_engine
2812 template<class _Engine, size_t __p, size_t __r>
2813 class _LIBCPP_TYPE_VIS_ONLY discard_block_engine
2815     _Engine __e_;
2816     int     __n_;
2818     static_assert(  0 <  __r, "discard_block_engine invalid parameters");
2819     static_assert(__r <= __p, "discard_block_engine invalid parameters");
2820 public:
2821     // types
2822     typedef typename _Engine::result_type result_type;
2824     // engine characteristics
2825     static _LIBCPP_CONSTEXPR const size_t block_size = __p;
2826     static _LIBCPP_CONSTEXPR const size_t used_block = __r;
2828 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
2829     static const result_type _Min = _Engine::_Min;
2830     static const result_type _Max = _Engine::_Max;
2831 #else
2832     static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
2833     static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
2834 #endif
2836     _LIBCPP_INLINE_VISIBILITY
2837     static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); }
2838     _LIBCPP_INLINE_VISIBILITY
2839     static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); }
2841     // constructors and seeding functions
2842     _LIBCPP_INLINE_VISIBILITY
2843     discard_block_engine() : __n_(0) {}
2844     _LIBCPP_INLINE_VISIBILITY
2845     explicit discard_block_engine(const _Engine& __e)
2846         : __e_(__e), __n_(0) {}
2847 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2848     _LIBCPP_INLINE_VISIBILITY
2849     explicit discard_block_engine(_Engine&& __e)
2850         : __e_(_VSTD::move(__e)), __n_(0) {}
2851 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2852     _LIBCPP_INLINE_VISIBILITY
2853     explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {}
2854     template<class _Sseq>
2855         _LIBCPP_INLINE_VISIBILITY
2856         explicit discard_block_engine(_Sseq& __q,
2857         typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value &&
2858                            !is_convertible<_Sseq, _Engine>::value>::type* = 0)
2859         : __e_(__q), __n_(0) {}
2860     _LIBCPP_INLINE_VISIBILITY
2861     void seed() {__e_.seed(); __n_ = 0;}
2862     _LIBCPP_INLINE_VISIBILITY
2863     void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;}
2864     template<class _Sseq>
2865         _LIBCPP_INLINE_VISIBILITY
2866         typename enable_if
2867         <
2868             __is_seed_sequence<_Sseq, discard_block_engine>::value,
2869             void
2870         >::type
2871         seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;}
2873     // generating functions
2874     result_type operator()();
2875     _LIBCPP_INLINE_VISIBILITY
2876     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
2878     // property functions
2879     _LIBCPP_INLINE_VISIBILITY
2880     const _Engine& base() const _NOEXCEPT {return __e_;}
2882     template<class _Eng, size_t _Pp, size_t _Rp>
2883     friend
2884     bool
2885     operator==(
2886         const discard_block_engine<_Eng, _Pp, _Rp>& __x,
2887         const discard_block_engine<_Eng, _Pp, _Rp>& __y);
2889     template<class _Eng, size_t _Pp, size_t _Rp>
2890     friend
2891     bool
2892     operator!=(
2893         const discard_block_engine<_Eng, _Pp, _Rp>& __x,
2894         const discard_block_engine<_Eng, _Pp, _Rp>& __y);
2896     template <class _CharT, class _Traits,
2897               class _Eng, size_t _Pp, size_t _Rp>
2898     friend
2899     basic_ostream<_CharT, _Traits>&
2900     operator<<(basic_ostream<_CharT, _Traits>& __os,
2901                const discard_block_engine<_Eng, _Pp, _Rp>& __x);
2903     template <class _CharT, class _Traits,
2904               class _Eng, size_t _Pp, size_t _Rp>
2905     friend
2906     basic_istream<_CharT, _Traits>&
2907     operator>>(basic_istream<_CharT, _Traits>& __is,
2908                discard_block_engine<_Eng, _Pp, _Rp>& __x);
2911 template<class _Engine, size_t __p, size_t __r>
2912     _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size;
2914 template<class _Engine, size_t __p, size_t __r>
2915     _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block;
2917 template<class _Engine, size_t __p, size_t __r>
2918 typename discard_block_engine<_Engine, __p, __r>::result_type
2919 discard_block_engine<_Engine, __p, __r>::operator()()
2921     if (__n_ >= __r)
2922     {
2923         __e_.discard(__p - __r);
2924         __n_ = 0;
2925     }
2926     ++__n_;
2927     return __e_();
2930 template<class _Eng, size_t _Pp, size_t _Rp>
2931 inline _LIBCPP_INLINE_VISIBILITY
2932 bool
2933 operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
2934            const discard_block_engine<_Eng, _Pp, _Rp>& __y)
2936     return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_;
2939 template<class _Eng, size_t _Pp, size_t _Rp>
2940 inline _LIBCPP_INLINE_VISIBILITY
2941 bool
2942 operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x,
2943            const discard_block_engine<_Eng, _Pp, _Rp>& __y)
2945     return !(__x == __y);
2948 template <class _CharT, class _Traits,
2949           class _Eng, size_t _Pp, size_t _Rp>
2950 basic_ostream<_CharT, _Traits>&
2951 operator<<(basic_ostream<_CharT, _Traits>& __os,
2952            const discard_block_engine<_Eng, _Pp, _Rp>& __x)
2954     __save_flags<_CharT, _Traits> __lx(__os);
2955     __os.flags(ios_base::dec | ios_base::left);
2956     _CharT __sp = __os.widen(' ');
2957     __os.fill(__sp);
2958     return __os << __x.__e_ << __sp << __x.__n_;
2961 template <class _CharT, class _Traits,
2962           class _Eng, size_t _Pp, size_t _Rp>
2963 basic_istream<_CharT, _Traits>&
2964 operator>>(basic_istream<_CharT, _Traits>& __is,
2965            discard_block_engine<_Eng, _Pp, _Rp>& __x)
2967     __save_flags<_CharT, _Traits> __lx(__is);
2968     __is.flags(ios_base::dec | ios_base::skipws);
2969     _Eng __e;
2970     int __n;
2971     __is >> __e >> __n;
2972     if (!__is.fail())
2973     {
2974         __x.__e_ = __e;
2975         __x.__n_ = __n;
2976     }
2977     return __is;
2980 typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
2981 typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
2983 // independent_bits_engine
2985 template<class _Engine, size_t __w, class _UIntType>
2986 class _LIBCPP_TYPE_VIS_ONLY independent_bits_engine
2988     template <class _UI, _UI _R0, size_t _Wp, size_t _Mp>
2989     class __get_n
2990     {
2991         static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UI>::digits;
2992         static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0);
2993         static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np;
2994         static _LIBCPP_CONSTEXPR const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0;
2995     public:
2996         static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np;
2997     };
2998 public:
2999     // types
3000     typedef _UIntType result_type;
3002 private:
3003     _Engine __e_;
3005     static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
3006     static_assert(  0 <  __w, "independent_bits_engine invalid parameters");
3007     static_assert(__w <= _Dt, "independent_bits_engine invalid parameters");
3009     typedef typename _Engine::result_type _Engine_result_type;
3010     typedef typename conditional
3011         <
3012             sizeof(_Engine_result_type) <= sizeof(result_type),
3013                 result_type,
3014                 _Engine_result_type
3015         >::type _Working_result_type;
3016 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
3017     static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min
3018                                           + _Working_result_type(1);
3019 #else
3020     static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
3021                                                             + _Working_result_type(1);
3022 #endif
3023     static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value;
3024     static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value;
3025     static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n;
3026     static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n;
3027     static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits;
3028     static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
3029     static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 :
3030                                                                (_Rp >> __w0) << __w0;
3031     static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 :
3032                                                                (_Rp >> (__w0+1)) << (__w0+1);
3033     static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ?
3034                                 _Engine_result_type(~0) >> (_EDt - __w0) :
3035                                 _Engine_result_type(0);
3036     static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ?
3037                                 _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) :
3038                                 _Engine_result_type(~0);
3039 public:
3040     static _LIBCPP_CONSTEXPR const result_type _Min = 0;
3041     static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) :
3042                                                       (result_type(1) << __w) - result_type(1);
3043     static_assert(_Min < _Max, "independent_bits_engine invalid parameters");
3045     // engine characteristics
3046     _LIBCPP_INLINE_VISIBILITY
3047     static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
3048     _LIBCPP_INLINE_VISIBILITY
3049     static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
3051     // constructors and seeding functions
3052     _LIBCPP_INLINE_VISIBILITY
3053     independent_bits_engine() {}
3054     _LIBCPP_INLINE_VISIBILITY
3055     explicit independent_bits_engine(const _Engine& __e)
3056         : __e_(__e) {}
3057 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3058     _LIBCPP_INLINE_VISIBILITY
3059     explicit independent_bits_engine(_Engine&& __e)
3060         : __e_(_VSTD::move(__e)) {}
3061 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3062     _LIBCPP_INLINE_VISIBILITY
3063     explicit independent_bits_engine(result_type __sd) : __e_(__sd) {}
3064     template<class _Sseq>
3065         _LIBCPP_INLINE_VISIBILITY
3066         explicit independent_bits_engine(_Sseq& __q,
3067         typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value &&
3068                            !is_convertible<_Sseq, _Engine>::value>::type* = 0)
3069          : __e_(__q) {}
3070     _LIBCPP_INLINE_VISIBILITY
3071     void seed() {__e_.seed();}
3072     _LIBCPP_INLINE_VISIBILITY
3073     void seed(result_type __sd) {__e_.seed(__sd);}
3074     template<class _Sseq>
3075         _LIBCPP_INLINE_VISIBILITY
3076         typename enable_if
3077         <
3078             __is_seed_sequence<_Sseq, independent_bits_engine>::value,
3079             void
3080         >::type
3081         seed(_Sseq& __q) {__e_.seed(__q);}
3083     // generating functions
3084     _LIBCPP_INLINE_VISIBILITY
3085     result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
3086     _LIBCPP_INLINE_VISIBILITY
3087     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
3089     // property functions
3090     _LIBCPP_INLINE_VISIBILITY
3091     const _Engine& base() const _NOEXCEPT {return __e_;}
3093     template<class _Eng, size_t _Wp, class _UI>
3094     friend
3095     bool
3096     operator==(
3097         const independent_bits_engine<_Eng, _Wp, _UI>& __x,
3098         const independent_bits_engine<_Eng, _Wp, _UI>& __y);
3100     template<class _Eng, size_t _Wp, class _UI>
3101     friend
3102     bool
3103     operator!=(
3104         const independent_bits_engine<_Eng, _Wp, _UI>& __x,
3105         const independent_bits_engine<_Eng, _Wp, _UI>& __y);
3107     template <class _CharT, class _Traits,
3108               class _Eng, size_t _Wp, class _UI>
3109     friend
3110     basic_ostream<_CharT, _Traits>&
3111     operator<<(basic_ostream<_CharT, _Traits>& __os,
3112                const independent_bits_engine<_Eng, _Wp, _UI>& __x);
3114     template <class _CharT, class _Traits,
3115               class _Eng, size_t _Wp, class _UI>
3116     friend
3117     basic_istream<_CharT, _Traits>&
3118     operator>>(basic_istream<_CharT, _Traits>& __is,
3119                independent_bits_engine<_Eng, _Wp, _UI>& __x);
3121 private:
3122     _LIBCPP_INLINE_VISIBILITY
3123     result_type __eval(false_type);
3124     result_type __eval(true_type);
3126     template <size_t __count>
3127         _LIBCPP_INLINE_VISIBILITY
3128         static
3129         typename enable_if
3130         <
3131             __count < _Dt,
3132             result_type
3133         >::type
3134         __lshift(result_type __x) {return __x << __count;}
3136     template <size_t __count>
3137         _LIBCPP_INLINE_VISIBILITY
3138         static
3139         typename enable_if
3140         <
3141             (__count >= _Dt),
3142             result_type
3143         >::type
3144         __lshift(result_type) {return result_type(0);}
3147 template<class _Engine, size_t __w, class _UIntType>
3148 inline
3149 _UIntType
3150 independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type)
3152     return static_cast<result_type>(__e_() & __mask0);
3155 template<class _Engine, size_t __w, class _UIntType>
3156 _UIntType
3157 independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type)
3159     result_type _Sp = 0;
3160     for (size_t __k = 0; __k < __n0; ++__k)
3161     {
3162         _Engine_result_type __u;
3163         do
3164         {
3165             __u = __e_() - _Engine::min();
3166         } while (__u >= __y0);
3167         _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0));
3168     }
3169     for (size_t __k = __n0; __k < __n; ++__k)
3170     {
3171         _Engine_result_type __u;
3172         do
3173         {
3174             __u = __e_() - _Engine::min();
3175         } while (__u >= __y1);
3176         _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1));
3177     }
3178     return _Sp;
3181 template<class _Eng, size_t _Wp, class _UI>
3182 inline _LIBCPP_INLINE_VISIBILITY
3183 bool
3184 operator==(
3185     const independent_bits_engine<_Eng, _Wp, _UI>& __x,
3186     const independent_bits_engine<_Eng, _Wp, _UI>& __y)
3188     return __x.base() == __y.base();
3191 template<class _Eng, size_t _Wp, class _UI>
3192 inline _LIBCPP_INLINE_VISIBILITY
3193 bool
3194 operator!=(
3195     const independent_bits_engine<_Eng, _Wp, _UI>& __x,
3196     const independent_bits_engine<_Eng, _Wp, _UI>& __y)
3198     return !(__x == __y);
3201 template <class _CharT, class _Traits,
3202           class _Eng, size_t _Wp, class _UI>
3203 basic_ostream<_CharT, _Traits>&
3204 operator<<(basic_ostream<_CharT, _Traits>& __os,
3205            const independent_bits_engine<_Eng, _Wp, _UI>& __x)
3207     return __os << __x.base();
3210 template <class _CharT, class _Traits,
3211           class _Eng, size_t _Wp, class _UI>
3212 basic_istream<_CharT, _Traits>&
3213 operator>>(basic_istream<_CharT, _Traits>& __is,
3214            independent_bits_engine<_Eng, _Wp, _UI>& __x)
3216     _Eng __e;
3217     __is >> __e;
3218     if (!__is.fail())
3219         __x.__e_ = __e;
3220     return __is;
3223 // shuffle_order_engine
3225 template <uint64_t _Xp, uint64_t _Yp>
3226 struct __ugcd
3228     static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value;
3231 template <uint64_t _Xp>
3232 struct __ugcd<_Xp, 0>
3234     static _LIBCPP_CONSTEXPR const uint64_t value = _Xp;
3237 template <uint64_t _Np, uint64_t _Dp>
3238 class __uratio
3240     static_assert(_Dp != 0, "__uratio divide by 0");
3241     static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value;
3242 public:
3243     static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd;
3244     static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd;
3246     typedef __uratio<num, den> type;
3249 template<class _Engine, size_t __k>
3250 class _LIBCPP_TYPE_VIS_ONLY shuffle_order_engine
3252     static_assert(0 < __k, "shuffle_order_engine invalid parameters");
3253 public:
3254     // types
3255     typedef typename _Engine::result_type result_type;
3257 private:
3258     _Engine __e_;
3259     result_type _V_[__k];
3260     result_type _Y_;
3262 public:
3263     // engine characteristics
3264     static _LIBCPP_CONSTEXPR const size_t table_size = __k;
3266 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
3267     static const result_type _Min = _Engine::_Min;
3268     static const result_type _Max = _Engine::_Max;
3269 #else
3270     static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min();
3271     static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max();
3272 #endif
3273     static_assert(_Min < _Max, "shuffle_order_engine invalid parameters");
3274     _LIBCPP_INLINE_VISIBILITY
3275     static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
3276     _LIBCPP_INLINE_VISIBILITY
3277     static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
3279     static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull;
3281     // constructors and seeding functions
3282     _LIBCPP_INLINE_VISIBILITY
3283     shuffle_order_engine() {__init();}
3284     _LIBCPP_INLINE_VISIBILITY
3285     explicit shuffle_order_engine(const _Engine& __e)
3286         : __e_(__e) {__init();}
3287 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3288     _LIBCPP_INLINE_VISIBILITY
3289     explicit shuffle_order_engine(_Engine&& __e)
3290         : __e_(_VSTD::move(__e)) {__init();}
3291 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3292     _LIBCPP_INLINE_VISIBILITY
3293     explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();}
3294     template<class _Sseq>
3295         _LIBCPP_INLINE_VISIBILITY
3296         explicit shuffle_order_engine(_Sseq& __q,
3297         typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value &&
3298                            !is_convertible<_Sseq, _Engine>::value>::type* = 0)
3299          : __e_(__q) {__init();}
3300     _LIBCPP_INLINE_VISIBILITY
3301     void seed() {__e_.seed(); __init();}
3302     _LIBCPP_INLINE_VISIBILITY
3303     void seed(result_type __sd) {__e_.seed(__sd); __init();}
3304     template<class _Sseq>
3305         _LIBCPP_INLINE_VISIBILITY
3306         typename enable_if
3307         <
3308             __is_seed_sequence<_Sseq, shuffle_order_engine>::value,
3309             void
3310         >::type
3311         seed(_Sseq& __q) {__e_.seed(__q); __init();}
3313     // generating functions
3314     _LIBCPP_INLINE_VISIBILITY
3315     result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());}
3316     _LIBCPP_INLINE_VISIBILITY
3317     void discard(unsigned long long __z) {for (; __z; --__z) operator()();}
3319     // property functions
3320     _LIBCPP_INLINE_VISIBILITY
3321     const _Engine& base() const _NOEXCEPT {return __e_;}
3323 private:
3324     template<class _Eng, size_t _Kp>
3325     friend
3326     bool
3327     operator==(
3328         const shuffle_order_engine<_Eng, _Kp>& __x,
3329         const shuffle_order_engine<_Eng, _Kp>& __y);
3331     template<class _Eng, size_t _Kp>
3332     friend
3333     bool
3334     operator!=(
3335         const shuffle_order_engine<_Eng, _Kp>& __x,
3336         const shuffle_order_engine<_Eng, _Kp>& __y);
3338     template <class _CharT, class _Traits,
3339               class _Eng, size_t _Kp>
3340     friend
3341     basic_ostream<_CharT, _Traits>&
3342     operator<<(basic_ostream<_CharT, _Traits>& __os,
3343                const shuffle_order_engine<_Eng, _Kp>& __x);
3345     template <class _CharT, class _Traits,
3346               class _Eng, size_t _Kp>
3347     friend
3348     basic_istream<_CharT, _Traits>&
3349     operator>>(basic_istream<_CharT, _Traits>& __is,
3350                shuffle_order_engine<_Eng, _Kp>& __x);
3352     _LIBCPP_INLINE_VISIBILITY
3353     void __init()
3354     {
3355         for (size_t __i = 0; __i < __k; ++__i)
3356             _V_[__i] = __e_();
3357         _Y_ = __e_();
3358     }
3360     _LIBCPP_INLINE_VISIBILITY
3361     result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());}
3362     _LIBCPP_INLINE_VISIBILITY
3363     result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());}
3365     _LIBCPP_INLINE_VISIBILITY
3366     result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());}
3367     _LIBCPP_INLINE_VISIBILITY
3368     result_type __eval2(true_type) {return __evalf<__k, 0>();}
3370     template <uint64_t _Np, uint64_t _Dp>
3371         _LIBCPP_INLINE_VISIBILITY
3372         typename enable_if
3373         <
3374             (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)),
3375             result_type
3376         >::type
3377         __eval(__uratio<_Np, _Dp>)
3378             {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();}
3380     template <uint64_t _Np, uint64_t _Dp>
3381         _LIBCPP_INLINE_VISIBILITY
3382         typename enable_if
3383         <
3384             __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min),
3385             result_type
3386         >::type
3387         __eval(__uratio<_Np, _Dp>)
3388         {
3389             const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min)
3390                                                    / __uratio<_Np, _Dp>::den);
3391             _Y_ = _V_[__j];
3392             _V_[__j] = __e_();
3393             return _Y_;
3394         }
3396     template <uint64_t __n, uint64_t __d>
3397         _LIBCPP_INLINE_VISIBILITY
3398         result_type __evalf()
3399         {
3400             const double _Fp = __d == 0 ?
3401                 __n / (2. * 0x8000000000000000ull) :
3402                 __n / (double)__d;
3403             const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min));
3404             _Y_ = _V_[__j];
3405             _V_[__j] = __e_();
3406             return _Y_;
3407         }
3410 template<class _Engine, size_t __k>
3411     _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size;
3413 template<class _Eng, size_t _Kp>
3414 bool
3415 operator==(
3416     const shuffle_order_engine<_Eng, _Kp>& __x,
3417     const shuffle_order_engine<_Eng, _Kp>& __y)
3419     return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) &&
3420            __x.__e_ == __y.__e_;
3423 template<class _Eng, size_t _Kp>
3424 inline _LIBCPP_INLINE_VISIBILITY
3425 bool
3426 operator!=(
3427     const shuffle_order_engine<_Eng, _Kp>& __x,
3428     const shuffle_order_engine<_Eng, _Kp>& __y)
3430     return !(__x == __y);
3433 template <class _CharT, class _Traits,
3434           class _Eng, size_t _Kp>
3435 basic_ostream<_CharT, _Traits>&
3436 operator<<(basic_ostream<_CharT, _Traits>& __os,
3437            const shuffle_order_engine<_Eng, _Kp>& __x)
3439     __save_flags<_CharT, _Traits> __lx(__os);
3440     __os.flags(ios_base::dec | ios_base::left);
3441     _CharT __sp = __os.widen(' ');
3442     __os.fill(__sp);
3443     __os << __x.__e_ << __sp << __x._V_[0];
3444     for (size_t __i = 1; __i < _Kp; ++__i)
3445         __os << __sp << __x._V_[__i];
3446     return __os << __sp << __x._Y_;
3449 template <class _CharT, class _Traits,
3450           class _Eng, size_t _Kp>
3451 basic_istream<_CharT, _Traits>&
3452 operator>>(basic_istream<_CharT, _Traits>& __is,
3453            shuffle_order_engine<_Eng, _Kp>& __x)
3455     typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type;
3456     __save_flags<_CharT, _Traits> __lx(__is);
3457     __is.flags(ios_base::dec | ios_base::skipws);
3458     _Eng __e;
3459     result_type _Vp[_Kp+1];
3460     __is >> __e;
3461     for (size_t __i = 0; __i < _Kp+1; ++__i)
3462         __is >> _Vp[__i];
3463     if (!__is.fail())
3464     {
3465         __x.__e_ = __e;
3466         for (size_t __i = 0; __i < _Kp; ++__i)
3467             __x._V_[__i] = _Vp[__i];
3468         __x._Y_ = _Vp[_Kp];
3469     }
3470     return __is;
3473 typedef shuffle_order_engine<minstd_rand0, 256>                         knuth_b;
3475 // random_device
3477 class _LIBCPP_TYPE_VIS random_device
3479 #ifdef _LIBCPP_USING_DEV_RANDOM
3480     int __f_;
3481 #endif // defined(_LIBCPP_USING_DEV_RANDOM)
3482 public:
3483     // types
3484     typedef unsigned result_type;
3486     // generator characteristics
3487     static _LIBCPP_CONSTEXPR const result_type _Min = 0;
3488     static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu;
3490     _LIBCPP_INLINE_VISIBILITY
3491     static _LIBCPP_CONSTEXPR result_type min() { return _Min;}
3492     _LIBCPP_INLINE_VISIBILITY
3493     static _LIBCPP_CONSTEXPR result_type max() { return _Max;}
3495     // constructors
3496     explicit random_device(const string& __token = "/dev/urandom");
3497     ~random_device();
3499     // generating functions
3500     result_type operator()();
3502     // property functions
3503     double entropy() const _NOEXCEPT;
3505 private:
3506     // no copy functions
3507     random_device(const random_device&); // = delete;
3508     random_device& operator=(const random_device&); // = delete;
3511 // seed_seq
3513 class _LIBCPP_TYPE_VIS_ONLY seed_seq
3515 public:
3516     // types
3517     typedef uint32_t result_type;
3519 private:
3520     vector<result_type> __v_;
3522     template<class _InputIterator>
3523         void init(_InputIterator __first, _InputIterator __last);
3524 public:
3525     // constructors
3526     _LIBCPP_INLINE_VISIBILITY
3527     seed_seq() _NOEXCEPT {}
3528 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
3529     template<class _Tp>
3530         _LIBCPP_INLINE_VISIBILITY
3531         seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());}
3532 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
3534     template<class _InputIterator>
3535         _LIBCPP_INLINE_VISIBILITY
3536         seed_seq(_InputIterator __first, _InputIterator __last)
3537              {init(__first, __last);}
3539     // generating functions
3540     template<class _RandomAccessIterator>
3541         void generate(_RandomAccessIterator __first, _RandomAccessIterator __last);
3543     // property functions
3544     _LIBCPP_INLINE_VISIBILITY
3545     size_t size() const _NOEXCEPT {return __v_.size();}
3546     template<class _OutputIterator>
3547         _LIBCPP_INLINE_VISIBILITY
3548         void param(_OutputIterator __dest) const
3549             {_VSTD::copy(__v_.begin(), __v_.end(), __dest);}
3551 private:
3552     // no copy functions
3553     seed_seq(const seed_seq&); // = delete;
3554     void operator=(const seed_seq&); // = delete;
3556     _LIBCPP_INLINE_VISIBILITY
3557     static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);}
3560 template<class _InputIterator>
3561 void
3562 seed_seq::init(_InputIterator __first, _InputIterator __last)
3564     for (_InputIterator __s = __first; __s != __last; ++__s)
3565         __v_.push_back(*__s & 0xFFFFFFFF);
3568 template<class _RandomAccessIterator>
3569 void
3570 seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last)
3572     if (__first != __last)
3573     {
3574         _VSTD::fill(__first, __last, 0x8b8b8b8b);
3575         const size_t __n = static_cast<size_t>(__last - __first);
3576         const size_t __s = __v_.size();
3577         const size_t __t = (__n >= 623) ? 11
3578                          : (__n >= 68) ? 7
3579                          : (__n >= 39) ? 5
3580                          : (__n >= 7)  ? 3
3581                          : (__n - 1) / 2;
3582         const size_t __p = (__n - __t) / 2;
3583         const size_t __q = __p + __t;
3584         const size_t __m = _VSTD::max(__s + 1, __n);
3585         // __k = 0;
3586         {
3587             result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p]
3588                                                       ^  __first[__n - 1]);
3589             __first[__p] += __r;
3590             __r += __s;
3591             __first[__q] += __r;
3592             __first[0] = __r;
3593         }
3594         for (size_t __k = 1; __k <= __s; ++__k)
3595         {
3596             const size_t __kmodn = __k % __n;
3597             const size_t __kpmodn = (__k + __p) % __n;
3598             result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
3599                                            ^ __first[(__k - 1) % __n]);
3600             __first[__kpmodn] += __r;
3601             __r +=  __kmodn + __v_[__k-1];
3602             __first[(__k + __q) % __n] += __r;
3603             __first[__kmodn] = __r;
3604         }
3605         for (size_t __k = __s + 1; __k < __m; ++__k)
3606         {
3607             const size_t __kmodn = __k % __n;
3608             const size_t __kpmodn = (__k + __p) % __n;
3609             result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn]
3610                                            ^ __first[(__k - 1) % __n]);
3611             __first[__kpmodn] += __r;
3612             __r +=  __kmodn;
3613             __first[(__k + __q) % __n] += __r;
3614             __first[__kmodn] = __r;
3615         }
3616         for (size_t __k = __m; __k < __m + __n; ++__k)
3617         {
3618             const size_t __kmodn = __k % __n;
3619             const size_t __kpmodn = (__k + __p) % __n;
3620             result_type __r = 1566083941 * _Tp(__first[__kmodn] +
3621                                               __first[__kpmodn] +
3622                                               __first[(__k - 1) % __n]);
3623             __first[__kpmodn] ^= __r;
3624             __r -= __kmodn;
3625             __first[(__k + __q) % __n] ^= __r;
3626             __first[__kmodn] = __r;
3627         }
3628     }
3631 // generate_canonical
3633 template<class _RealType, size_t __bits, class _URNG>
3634 _RealType
3635 generate_canonical(_URNG& __g)
3637     const size_t _Dt = numeric_limits<_RealType>::digits;
3638     const size_t __b = _Dt < __bits ? _Dt : __bits;
3639 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
3640     const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value;
3641 #else
3642     const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;
3643 #endif
3644     const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0);
3645     const _RealType _Rp = _URNG::max() - _URNG::min() + _RealType(1);
3646     _RealType __base = _Rp;
3647     _RealType _Sp = __g() - _URNG::min();
3648     for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp)
3649         _Sp += (__g() - _URNG::min()) * __base;
3650     return _Sp / __base;
3653 // uniform_int_distribution
3655 // in <algorithm>
3657 template <class _CharT, class _Traits, class _IT>
3658 basic_ostream<_CharT, _Traits>&
3659 operator<<(basic_ostream<_CharT, _Traits>& __os,
3660            const uniform_int_distribution<_IT>& __x)
3662     __save_flags<_CharT, _Traits> __lx(__os);
3663     __os.flags(ios_base::dec | ios_base::left);
3664     _CharT __sp = __os.widen(' ');
3665     __os.fill(__sp);
3666     return __os << __x.a() << __sp << __x.b();
3669 template <class _CharT, class _Traits, class _IT>
3670 basic_istream<_CharT, _Traits>&
3671 operator>>(basic_istream<_CharT, _Traits>& __is,
3672            uniform_int_distribution<_IT>& __x)
3674     typedef uniform_int_distribution<_IT> _Eng;
3675     typedef typename _Eng::result_type result_type;
3676     typedef typename _Eng::param_type param_type;
3677     __save_flags<_CharT, _Traits> __lx(__is);
3678     __is.flags(ios_base::dec | ios_base::skipws);
3679     result_type __a;
3680     result_type __b;
3681     __is >> __a >> __b;
3682     if (!__is.fail())
3683         __x.param(param_type(__a, __b));
3684     return __is;
3687 // uniform_real_distribution
3689 template<class _RealType = double>
3690 class _LIBCPP_TYPE_VIS_ONLY uniform_real_distribution
3692 public:
3693     // types
3694     typedef _RealType result_type;
3696     class _LIBCPP_TYPE_VIS_ONLY param_type
3697     {
3698         result_type __a_;
3699         result_type __b_;
3700     public:
3701         typedef uniform_real_distribution distribution_type;
3703         _LIBCPP_INLINE_VISIBILITY
3704         explicit param_type(result_type __a = 0,
3705                             result_type __b = 1)
3706             : __a_(__a), __b_(__b) {}
3708         _LIBCPP_INLINE_VISIBILITY
3709         result_type a() const {return __a_;}
3710         _LIBCPP_INLINE_VISIBILITY
3711         result_type b() const {return __b_;}
3713         friend _LIBCPP_INLINE_VISIBILITY
3714         bool operator==(const param_type& __x, const param_type& __y)
3715             {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
3716         friend _LIBCPP_INLINE_VISIBILITY
3717         bool operator!=(const param_type& __x, const param_type& __y)
3718             {return !(__x == __y);}
3719     };
3721 private:
3722     param_type __p_;
3724 public:
3725     // constructors and reset functions
3726     _LIBCPP_INLINE_VISIBILITY
3727     explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1)
3728         : __p_(param_type(__a, __b)) {}
3729     _LIBCPP_INLINE_VISIBILITY
3730     explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {}
3731     _LIBCPP_INLINE_VISIBILITY
3732     void reset() {}
3734     // generating functions
3735     template<class _URNG>
3736         _LIBCPP_INLINE_VISIBILITY
3737         result_type operator()(_URNG& __g)
3738         {return (*this)(__g, __p_);}
3739     template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
3741     // property functions
3742     _LIBCPP_INLINE_VISIBILITY
3743     result_type a() const {return __p_.a();}
3744     _LIBCPP_INLINE_VISIBILITY
3745     result_type b() const {return __p_.b();}
3747     _LIBCPP_INLINE_VISIBILITY
3748     param_type param() const {return __p_;}
3749     _LIBCPP_INLINE_VISIBILITY
3750     void param(const param_type& __p) {__p_ = __p;}
3752     _LIBCPP_INLINE_VISIBILITY
3753     result_type min() const {return a();}
3754     _LIBCPP_INLINE_VISIBILITY
3755     result_type max() const {return b();}
3757     friend _LIBCPP_INLINE_VISIBILITY
3758         bool operator==(const uniform_real_distribution& __x,
3759                         const uniform_real_distribution& __y)
3760         {return __x.__p_ == __y.__p_;}
3761     friend _LIBCPP_INLINE_VISIBILITY
3762         bool operator!=(const uniform_real_distribution& __x,
3763                         const uniform_real_distribution& __y)
3764         {return !(__x == __y);}
3767 template<class _RealType>
3768 template<class _URNG>
3769 inline
3770 typename uniform_real_distribution<_RealType>::result_type
3771 uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
3773     return (__p.b() - __p.a())
3774         * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
3775         + __p.a();
3778 template <class _CharT, class _Traits, class _RT>
3779 basic_ostream<_CharT, _Traits>&
3780 operator<<(basic_ostream<_CharT, _Traits>& __os,
3781            const uniform_real_distribution<_RT>& __x)
3783     __save_flags<_CharT, _Traits> __lx(__os);
3784     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
3785                ios_base::scientific);
3786     _CharT __sp = __os.widen(' ');
3787     __os.fill(__sp);
3788     return __os << __x.a() << __sp << __x.b();
3791 template <class _CharT, class _Traits, class _RT>
3792 basic_istream<_CharT, _Traits>&
3793 operator>>(basic_istream<_CharT, _Traits>& __is,
3794            uniform_real_distribution<_RT>& __x)
3796     typedef uniform_real_distribution<_RT> _Eng;
3797     typedef typename _Eng::result_type result_type;
3798     typedef typename _Eng::param_type param_type;
3799     __save_flags<_CharT, _Traits> __lx(__is);
3800     __is.flags(ios_base::dec | ios_base::skipws);
3801     result_type __a;
3802     result_type __b;
3803     __is >> __a >> __b;
3804     if (!__is.fail())
3805         __x.param(param_type(__a, __b));
3806     return __is;
3809 // bernoulli_distribution
3811 class _LIBCPP_TYPE_VIS_ONLY bernoulli_distribution
3813 public:
3814     // types
3815     typedef bool result_type;
3817     class _LIBCPP_TYPE_VIS_ONLY param_type
3818     {
3819         double __p_;
3820     public:
3821         typedef bernoulli_distribution distribution_type;
3823         _LIBCPP_INLINE_VISIBILITY
3824         explicit param_type(double __p = 0.5) : __p_(__p) {}
3826         _LIBCPP_INLINE_VISIBILITY
3827         double p() const {return __p_;}
3829         friend _LIBCPP_INLINE_VISIBILITY
3830             bool operator==(const param_type& __x, const param_type& __y)
3831             {return __x.__p_ == __y.__p_;}
3832         friend _LIBCPP_INLINE_VISIBILITY
3833             bool operator!=(const param_type& __x, const param_type& __y)
3834             {return !(__x == __y);}
3835     };
3837 private:
3838     param_type __p_;
3840 public:
3841     // constructors and reset functions
3842     _LIBCPP_INLINE_VISIBILITY
3843     explicit bernoulli_distribution(double __p = 0.5)
3844         : __p_(param_type(__p)) {}
3845     _LIBCPP_INLINE_VISIBILITY
3846     explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {}
3847     _LIBCPP_INLINE_VISIBILITY
3848     void reset() {}
3850     // generating functions
3851     template<class _URNG>
3852         _LIBCPP_INLINE_VISIBILITY
3853         result_type operator()(_URNG& __g)
3854         {return (*this)(__g, __p_);}
3855     template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
3857     // property functions
3858     _LIBCPP_INLINE_VISIBILITY
3859     double p() const {return __p_.p();}
3861     _LIBCPP_INLINE_VISIBILITY
3862     param_type param() const {return __p_;}
3863     _LIBCPP_INLINE_VISIBILITY
3864     void param(const param_type& __p) {__p_ = __p;}
3866     _LIBCPP_INLINE_VISIBILITY
3867     result_type min() const {return false;}
3868     _LIBCPP_INLINE_VISIBILITY
3869     result_type max() const {return true;}
3871     friend _LIBCPP_INLINE_VISIBILITY
3872         bool operator==(const bernoulli_distribution& __x,
3873                         const bernoulli_distribution& __y)
3874         {return __x.__p_ == __y.__p_;}
3875     friend _LIBCPP_INLINE_VISIBILITY
3876         bool operator!=(const bernoulli_distribution& __x,
3877                         const bernoulli_distribution& __y)
3878         {return !(__x == __y);}
3881 template<class _URNG>
3882 inline
3883 bernoulli_distribution::result_type
3884 bernoulli_distribution::operator()(_URNG& __g, const param_type& __p)
3886     uniform_real_distribution<double> __gen;
3887     return __gen(__g) < __p.p();
3890 template <class _CharT, class _Traits>
3891 basic_ostream<_CharT, _Traits>&
3892 operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x)
3894     __save_flags<_CharT, _Traits> __lx(__os);
3895     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
3896                ios_base::scientific);
3897     _CharT __sp = __os.widen(' ');
3898     __os.fill(__sp);
3899     return __os << __x.p();
3902 template <class _CharT, class _Traits>
3903 basic_istream<_CharT, _Traits>&
3904 operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x)
3906     typedef bernoulli_distribution _Eng;
3907     typedef typename _Eng::param_type param_type;
3908     __save_flags<_CharT, _Traits> __lx(__is);
3909     __is.flags(ios_base::dec | ios_base::skipws);
3910     double __p;
3911     __is >> __p;
3912     if (!__is.fail())
3913         __x.param(param_type(__p));
3914     return __is;
3917 // binomial_distribution
3919 template<class _IntType = int>
3920 class _LIBCPP_TYPE_VIS_ONLY binomial_distribution
3922 public:
3923     // types
3924     typedef _IntType result_type;
3926     class _LIBCPP_TYPE_VIS_ONLY param_type
3927     {
3928         result_type __t_;
3929         double __p_;
3930         double __pr_;
3931         double __odds_ratio_;
3932         result_type __r0_;
3933     public:
3934         typedef binomial_distribution distribution_type;
3936         explicit param_type(result_type __t = 1, double __p = 0.5);
3938         _LIBCPP_INLINE_VISIBILITY
3939         result_type t() const {return __t_;}
3940         _LIBCPP_INLINE_VISIBILITY
3941         double p() const {return __p_;}
3943         friend _LIBCPP_INLINE_VISIBILITY
3944             bool operator==(const param_type& __x, const param_type& __y)
3945             {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;}
3946         friend _LIBCPP_INLINE_VISIBILITY
3947             bool operator!=(const param_type& __x, const param_type& __y)
3948             {return !(__x == __y);}
3950         friend class binomial_distribution;
3951     };
3953 private:
3954     param_type __p_;
3956 public:
3957     // constructors and reset functions
3958     _LIBCPP_INLINE_VISIBILITY
3959     explicit binomial_distribution(result_type __t = 1, double __p = 0.5)
3960         : __p_(param_type(__t, __p)) {}
3961     _LIBCPP_INLINE_VISIBILITY
3962     explicit binomial_distribution(const param_type& __p) : __p_(__p) {}
3963     _LIBCPP_INLINE_VISIBILITY
3964     void reset() {}
3966     // generating functions
3967     template<class _URNG>
3968         _LIBCPP_INLINE_VISIBILITY
3969         result_type operator()(_URNG& __g)
3970         {return (*this)(__g, __p_);}
3971     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
3973     // property functions
3974     _LIBCPP_INLINE_VISIBILITY
3975     result_type t() const {return __p_.t();}
3976     _LIBCPP_INLINE_VISIBILITY
3977     double p() const {return __p_.p();}
3979     _LIBCPP_INLINE_VISIBILITY
3980     param_type param() const {return __p_;}
3981     _LIBCPP_INLINE_VISIBILITY
3982     void param(const param_type& __p) {__p_ = __p;}
3984     _LIBCPP_INLINE_VISIBILITY
3985     result_type min() const {return 0;}
3986     _LIBCPP_INLINE_VISIBILITY
3987     result_type max() const {return t();}
3989     friend _LIBCPP_INLINE_VISIBILITY
3990         bool operator==(const binomial_distribution& __x,
3991                         const binomial_distribution& __y)
3992         {return __x.__p_ == __y.__p_;}
3993     friend _LIBCPP_INLINE_VISIBILITY
3994         bool operator!=(const binomial_distribution& __x,
3995                         const binomial_distribution& __y)
3996         {return !(__x == __y);}
3999 template<class _IntType>
4000 binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p)
4001     : __t_(__t), __p_(__p)
4003     if (0 < __p_ && __p_ < 1)
4004     {
4005         __r0_ = static_cast<result_type>((__t_ + 1) * __p_);
4006         __pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) -
4007                           _VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) +
4008                           (__t_ - __r0_) * _VSTD::log(1 - __p_));
4009         __odds_ratio_ = __p_ / (1 - __p_);
4010     }
4013 // Reference: Kemp, C.D. (1986). `A modal method for generating binomial
4014 //           variables', Commun. Statist. - Theor. Meth. 15(3), 805-813.
4015 template<class _IntType>
4016 template<class _URNG>
4017 _IntType
4018 binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr)
4020     if (__pr.__t_ == 0 || __pr.__p_ == 0)
4021         return 0;
4022     if (__pr.__p_ == 1)
4023         return __pr.__t_;
4024     uniform_real_distribution<double> __gen;
4025     double __u = __gen(__g) - __pr.__pr_;
4026     if (__u < 0)
4027         return __pr.__r0_;
4028     double __pu = __pr.__pr_;
4029     double __pd = __pu;
4030     result_type __ru = __pr.__r0_;
4031     result_type __rd = __ru;
4032     while (true)
4033     {
4034         if (__rd >= 1)
4035         {
4036             __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1));
4037             __u -= __pd;
4038             if (__u < 0)
4039                 return __rd - 1;
4040         }
4041         if ( __rd != 0 )
4042             --__rd;
4043         ++__ru;
4044         if (__ru <= __pr.__t_)
4045         {
4046             __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru;
4047             __u -= __pu;
4048             if (__u < 0)
4049                 return __ru;
4050         }
4051     }
4054 template <class _CharT, class _Traits, class _IntType>
4055 basic_ostream<_CharT, _Traits>&
4056 operator<<(basic_ostream<_CharT, _Traits>& __os,
4057            const binomial_distribution<_IntType>& __x)
4059     __save_flags<_CharT, _Traits> __lx(__os);
4060     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4061                ios_base::scientific);
4062     _CharT __sp = __os.widen(' ');
4063     __os.fill(__sp);
4064     return __os << __x.t() << __sp << __x.p();
4067 template <class _CharT, class _Traits, class _IntType>
4068 basic_istream<_CharT, _Traits>&
4069 operator>>(basic_istream<_CharT, _Traits>& __is,
4070            binomial_distribution<_IntType>& __x)
4072     typedef binomial_distribution<_IntType> _Eng;
4073     typedef typename _Eng::result_type result_type;
4074     typedef typename _Eng::param_type param_type;
4075     __save_flags<_CharT, _Traits> __lx(__is);
4076     __is.flags(ios_base::dec | ios_base::skipws);
4077     result_type __t;
4078     double __p;
4079     __is >> __t >> __p;
4080     if (!__is.fail())
4081         __x.param(param_type(__t, __p));
4082     return __is;
4085 // exponential_distribution
4087 template<class _RealType = double>
4088 class _LIBCPP_TYPE_VIS_ONLY exponential_distribution
4090 public:
4091     // types
4092     typedef _RealType result_type;
4094     class _LIBCPP_TYPE_VIS_ONLY param_type
4095     {
4096         result_type __lambda_;
4097     public:
4098         typedef exponential_distribution distribution_type;
4100         _LIBCPP_INLINE_VISIBILITY
4101         explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {}
4103         _LIBCPP_INLINE_VISIBILITY
4104         result_type lambda() const {return __lambda_;}
4106         friend _LIBCPP_INLINE_VISIBILITY
4107             bool operator==(const param_type& __x, const param_type& __y)
4108             {return __x.__lambda_ == __y.__lambda_;}
4109         friend _LIBCPP_INLINE_VISIBILITY
4110             bool operator!=(const param_type& __x, const param_type& __y)
4111             {return !(__x == __y);}
4112     };
4114 private:
4115     param_type __p_;
4117 public:
4118     // constructors and reset functions
4119     _LIBCPP_INLINE_VISIBILITY
4120     explicit exponential_distribution(result_type __lambda = 1)
4121         : __p_(param_type(__lambda)) {}
4122     _LIBCPP_INLINE_VISIBILITY
4123     explicit exponential_distribution(const param_type& __p) : __p_(__p) {}
4124     _LIBCPP_INLINE_VISIBILITY
4125     void reset() {}
4127     // generating functions
4128     template<class _URNG>
4129         _LIBCPP_INLINE_VISIBILITY
4130         result_type operator()(_URNG& __g)
4131         {return (*this)(__g, __p_);}
4132     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
4134     // property functions
4135     _LIBCPP_INLINE_VISIBILITY
4136     result_type lambda() const {return __p_.lambda();}
4138     _LIBCPP_INLINE_VISIBILITY
4139     param_type param() const {return __p_;}
4140     _LIBCPP_INLINE_VISIBILITY
4141     void param(const param_type& __p) {__p_ = __p;}
4143     _LIBCPP_INLINE_VISIBILITY
4144     result_type min() const {return 0;}
4145     _LIBCPP_INLINE_VISIBILITY
4146     result_type max() const {return numeric_limits<result_type>::infinity();}
4148     friend _LIBCPP_INLINE_VISIBILITY
4149         bool operator==(const exponential_distribution& __x,
4150                         const exponential_distribution& __y)
4151         {return __x.__p_ == __y.__p_;}
4152     friend _LIBCPP_INLINE_VISIBILITY
4153         bool operator!=(const exponential_distribution& __x,
4154                         const exponential_distribution& __y)
4155         {return !(__x == __y);}
4158 template <class _RealType>
4159 template<class _URNG>
4160 _RealType
4161 exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
4163     return -_VSTD::log
4164                   (
4165                       result_type(1) -
4166                       _VSTD::generate_canonical<result_type,
4167                                        numeric_limits<result_type>::digits>(__g)
4168                   )
4169                   / __p.lambda();
4172 template <class _CharT, class _Traits, class _RealType>
4173 basic_ostream<_CharT, _Traits>&
4174 operator<<(basic_ostream<_CharT, _Traits>& __os,
4175            const exponential_distribution<_RealType>& __x)
4177     __save_flags<_CharT, _Traits> __lx(__os);
4178     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4179                ios_base::scientific);
4180     return __os << __x.lambda();
4183 template <class _CharT, class _Traits, class _RealType>
4184 basic_istream<_CharT, _Traits>&
4185 operator>>(basic_istream<_CharT, _Traits>& __is,
4186            exponential_distribution<_RealType>& __x)
4188     typedef exponential_distribution<_RealType> _Eng;
4189     typedef typename _Eng::result_type result_type;
4190     typedef typename _Eng::param_type param_type;
4191     __save_flags<_CharT, _Traits> __lx(__is);
4192     __is.flags(ios_base::dec | ios_base::skipws);
4193     result_type __lambda;
4194     __is >> __lambda;
4195     if (!__is.fail())
4196         __x.param(param_type(__lambda));
4197     return __is;
4200 // normal_distribution
4202 template<class _RealType = double>
4203 class _LIBCPP_TYPE_VIS_ONLY normal_distribution
4205 public:
4206     // types
4207     typedef _RealType result_type;
4209     class _LIBCPP_TYPE_VIS_ONLY param_type
4210     {
4211         result_type __mean_;
4212         result_type __stddev_;
4213     public:
4214         typedef normal_distribution distribution_type;
4216         _LIBCPP_INLINE_VISIBILITY
4217         explicit param_type(result_type __mean = 0, result_type __stddev = 1)
4218             : __mean_(__mean), __stddev_(__stddev) {}
4220         _LIBCPP_INLINE_VISIBILITY
4221         result_type mean() const {return __mean_;}
4222         _LIBCPP_INLINE_VISIBILITY
4223         result_type stddev() const {return __stddev_;}
4225         friend _LIBCPP_INLINE_VISIBILITY
4226             bool operator==(const param_type& __x, const param_type& __y)
4227             {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;}
4228         friend _LIBCPP_INLINE_VISIBILITY
4229             bool operator!=(const param_type& __x, const param_type& __y)
4230             {return !(__x == __y);}
4231     };
4233 private:
4234     param_type __p_;
4235     result_type _V_;
4236     bool _V_hot_;
4238 public:
4239     // constructors and reset functions
4240     _LIBCPP_INLINE_VISIBILITY
4241     explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1)
4242         : __p_(param_type(__mean, __stddev)), _V_hot_(false) {}
4243     _LIBCPP_INLINE_VISIBILITY
4244     explicit normal_distribution(const param_type& __p)
4245         : __p_(__p), _V_hot_(false) {}
4246     _LIBCPP_INLINE_VISIBILITY
4247     void reset() {_V_hot_ = false;}
4249     // generating functions
4250     template<class _URNG>
4251         _LIBCPP_INLINE_VISIBILITY
4252         result_type operator()(_URNG& __g)
4253         {return (*this)(__g, __p_);}
4254     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
4256     // property functions
4257     _LIBCPP_INLINE_VISIBILITY
4258     result_type mean() const {return __p_.mean();}
4259     _LIBCPP_INLINE_VISIBILITY
4260     result_type stddev() const {return __p_.stddev();}
4262     _LIBCPP_INLINE_VISIBILITY
4263     param_type param() const {return __p_;}
4264     _LIBCPP_INLINE_VISIBILITY
4265     void param(const param_type& __p) {__p_ = __p;}
4267     _LIBCPP_INLINE_VISIBILITY
4268     result_type min() const {return -numeric_limits<result_type>::infinity();}
4269     _LIBCPP_INLINE_VISIBILITY
4270     result_type max() const {return numeric_limits<result_type>::infinity();}
4272     friend _LIBCPP_INLINE_VISIBILITY
4273         bool operator==(const normal_distribution& __x,
4274                         const normal_distribution& __y)
4275         {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ &&
4276                 (!__x._V_hot_ || __x._V_ == __y._V_);}
4277     friend _LIBCPP_INLINE_VISIBILITY
4278         bool operator!=(const normal_distribution& __x,
4279                         const normal_distribution& __y)
4280         {return !(__x == __y);}
4282     template <class _CharT, class _Traits, class _RT>
4283     friend
4284     basic_ostream<_CharT, _Traits>&
4285     operator<<(basic_ostream<_CharT, _Traits>& __os,
4286                const normal_distribution<_RT>& __x);
4288     template <class _CharT, class _Traits, class _RT>
4289     friend
4290     basic_istream<_CharT, _Traits>&
4291     operator>>(basic_istream<_CharT, _Traits>& __is,
4292                normal_distribution<_RT>& __x);
4295 template <class _RealType>
4296 template<class _URNG>
4297 _RealType
4298 normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
4300     result_type _Up;
4301     if (_V_hot_)
4302     {
4303         _V_hot_ = false;
4304         _Up = _V_;
4305     }
4306     else
4307     {
4308         uniform_real_distribution<result_type> _Uni(-1, 1);
4309         result_type __u;
4310         result_type __v;
4311         result_type __s;
4312         do
4313         {
4314             __u = _Uni(__g);
4315             __v = _Uni(__g);
4316             __s = __u * __u + __v * __v;
4317         } while (__s > 1 || __s == 0);
4318         result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s);
4319         _V_ = __v * _Fp;
4320         _V_hot_ = true;
4321         _Up = __u * _Fp;
4322     }
4323     return _Up * __p.stddev() + __p.mean();
4326 template <class _CharT, class _Traits, class _RT>
4327 basic_ostream<_CharT, _Traits>&
4328 operator<<(basic_ostream<_CharT, _Traits>& __os,
4329            const normal_distribution<_RT>& __x)
4331     __save_flags<_CharT, _Traits> __lx(__os);
4332     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4333                ios_base::scientific);
4334     _CharT __sp = __os.widen(' ');
4335     __os.fill(__sp);
4336     __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_;
4337     if (__x._V_hot_)
4338         __os << __sp << __x._V_;
4339     return __os;
4342 template <class _CharT, class _Traits, class _RT>
4343 basic_istream<_CharT, _Traits>&
4344 operator>>(basic_istream<_CharT, _Traits>& __is,
4345            normal_distribution<_RT>& __x)
4347     typedef normal_distribution<_RT> _Eng;
4348     typedef typename _Eng::result_type result_type;
4349     typedef typename _Eng::param_type param_type;
4350     __save_flags<_CharT, _Traits> __lx(__is);
4351     __is.flags(ios_base::dec | ios_base::skipws);
4352     result_type __mean;
4353     result_type __stddev;
4354     result_type _Vp = 0;
4355     bool _V_hot = false;
4356     __is >> __mean >> __stddev >> _V_hot;
4357     if (_V_hot)
4358         __is >> _Vp;
4359     if (!__is.fail())
4360     {
4361         __x.param(param_type(__mean, __stddev));
4362         __x._V_hot_ = _V_hot;
4363         __x._V_ = _Vp;
4364     }
4365     return __is;
4368 // lognormal_distribution
4370 template<class _RealType = double>
4371 class _LIBCPP_TYPE_VIS_ONLY lognormal_distribution
4373 public:
4374     // types
4375     typedef _RealType result_type;
4377     class _LIBCPP_TYPE_VIS_ONLY param_type
4378     {
4379         normal_distribution<result_type> __nd_;
4380     public:
4381         typedef lognormal_distribution distribution_type;
4383         _LIBCPP_INLINE_VISIBILITY
4384         explicit param_type(result_type __m = 0, result_type __s = 1)
4385             : __nd_(__m, __s) {}
4387         _LIBCPP_INLINE_VISIBILITY
4388         result_type m() const {return __nd_.mean();}
4389         _LIBCPP_INLINE_VISIBILITY
4390         result_type s() const {return __nd_.stddev();}
4392         friend _LIBCPP_INLINE_VISIBILITY
4393             bool operator==(const param_type& __x, const param_type& __y)
4394             {return __x.__nd_ == __y.__nd_;}
4395         friend _LIBCPP_INLINE_VISIBILITY
4396             bool operator!=(const param_type& __x, const param_type& __y)
4397             {return !(__x == __y);}
4398         friend class lognormal_distribution;
4400         template <class _CharT, class _Traits, class _RT>
4401         friend
4402         basic_ostream<_CharT, _Traits>&
4403         operator<<(basic_ostream<_CharT, _Traits>& __os,
4404                    const lognormal_distribution<_RT>& __x);
4406         template <class _CharT, class _Traits, class _RT>
4407         friend
4408         basic_istream<_CharT, _Traits>&
4409         operator>>(basic_istream<_CharT, _Traits>& __is,
4410                    lognormal_distribution<_RT>& __x);
4411     };
4413 private:
4414     param_type __p_;
4416 public:
4417     // constructor and reset functions
4418     _LIBCPP_INLINE_VISIBILITY
4419     explicit lognormal_distribution(result_type __m = 0, result_type __s = 1)
4420         : __p_(param_type(__m, __s)) {}
4421     _LIBCPP_INLINE_VISIBILITY
4422     explicit lognormal_distribution(const param_type& __p)
4423         : __p_(__p) {}
4424     _LIBCPP_INLINE_VISIBILITY
4425     void reset() {__p_.__nd_.reset();}
4427     // generating functions
4428     template<class _URNG>
4429         _LIBCPP_INLINE_VISIBILITY
4430         result_type operator()(_URNG& __g)
4431         {return (*this)(__g, __p_);}
4432     template<class _URNG>
4433         _LIBCPP_INLINE_VISIBILITY
4434         result_type operator()(_URNG& __g, const param_type& __p)
4435         {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));}
4437     // property functions
4438     _LIBCPP_INLINE_VISIBILITY
4439     result_type m() const {return __p_.m();}
4440     _LIBCPP_INLINE_VISIBILITY
4441     result_type s() const {return __p_.s();}
4443     _LIBCPP_INLINE_VISIBILITY
4444     param_type param() const {return __p_;}
4445     _LIBCPP_INLINE_VISIBILITY
4446     void param(const param_type& __p) {__p_ = __p;}
4448     _LIBCPP_INLINE_VISIBILITY
4449     result_type min() const {return 0;}
4450     _LIBCPP_INLINE_VISIBILITY
4451     result_type max() const {return numeric_limits<result_type>::infinity();}
4453     friend _LIBCPP_INLINE_VISIBILITY
4454         bool operator==(const lognormal_distribution& __x,
4455                         const lognormal_distribution& __y)
4456         {return __x.__p_ == __y.__p_;}
4457     friend _LIBCPP_INLINE_VISIBILITY
4458         bool operator!=(const lognormal_distribution& __x,
4459                         const lognormal_distribution& __y)
4460         {return !(__x == __y);}
4462     template <class _CharT, class _Traits, class _RT>
4463     friend
4464     basic_ostream<_CharT, _Traits>&
4465     operator<<(basic_ostream<_CharT, _Traits>& __os,
4466                const lognormal_distribution<_RT>& __x);
4468     template <class _CharT, class _Traits, class _RT>
4469     friend
4470     basic_istream<_CharT, _Traits>&
4471     operator>>(basic_istream<_CharT, _Traits>& __is,
4472                lognormal_distribution<_RT>& __x);
4475 template <class _CharT, class _Traits, class _RT>
4476 inline _LIBCPP_INLINE_VISIBILITY
4477 basic_ostream<_CharT, _Traits>&
4478 operator<<(basic_ostream<_CharT, _Traits>& __os,
4479            const lognormal_distribution<_RT>& __x)
4481     return __os << __x.__p_.__nd_;
4484 template <class _CharT, class _Traits, class _RT>
4485 inline _LIBCPP_INLINE_VISIBILITY
4486 basic_istream<_CharT, _Traits>&
4487 operator>>(basic_istream<_CharT, _Traits>& __is,
4488            lognormal_distribution<_RT>& __x)
4490     return __is >> __x.__p_.__nd_;
4493 // poisson_distribution
4495 template<class _IntType = int>
4496 class _LIBCPP_TYPE_VIS_ONLY poisson_distribution
4498 public:
4499     // types
4500     typedef _IntType result_type;
4502     class _LIBCPP_TYPE_VIS_ONLY param_type
4503     {
4504         double __mean_;
4505         double __s_;
4506         double __d_;
4507         double __l_;
4508         double __omega_;
4509         double __c0_;
4510         double __c1_;
4511         double __c2_;
4512         double __c3_;
4513         double __c_;
4515     public:
4516         typedef poisson_distribution distribution_type;
4518         explicit param_type(double __mean = 1.0);
4520         _LIBCPP_INLINE_VISIBILITY
4521         double mean() const {return __mean_;}
4523         friend _LIBCPP_INLINE_VISIBILITY
4524             bool operator==(const param_type& __x, const param_type& __y)
4525             {return __x.__mean_ == __y.__mean_;}
4526         friend _LIBCPP_INLINE_VISIBILITY
4527             bool operator!=(const param_type& __x, const param_type& __y)
4528             {return !(__x == __y);}
4530         friend class poisson_distribution;
4531     };
4533 private:
4534     param_type __p_;
4536 public:
4537     // constructors and reset functions
4538     _LIBCPP_INLINE_VISIBILITY
4539     explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {}
4540     _LIBCPP_INLINE_VISIBILITY
4541     explicit poisson_distribution(const param_type& __p) : __p_(__p) {}
4542     _LIBCPP_INLINE_VISIBILITY
4543     void reset() {}
4545     // generating functions
4546     template<class _URNG>
4547         _LIBCPP_INLINE_VISIBILITY
4548         result_type operator()(_URNG& __g)
4549         {return (*this)(__g, __p_);}
4550     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
4552     // property functions
4553     _LIBCPP_INLINE_VISIBILITY
4554     double mean() const {return __p_.mean();}
4556     _LIBCPP_INLINE_VISIBILITY
4557     param_type param() const {return __p_;}
4558     _LIBCPP_INLINE_VISIBILITY
4559     void param(const param_type& __p) {__p_ = __p;}
4561     _LIBCPP_INLINE_VISIBILITY
4562     result_type min() const {return 0;}
4563     _LIBCPP_INLINE_VISIBILITY
4564     result_type max() const {return numeric_limits<result_type>::max();}
4566     friend _LIBCPP_INLINE_VISIBILITY
4567         bool operator==(const poisson_distribution& __x,
4568                         const poisson_distribution& __y)
4569         {return __x.__p_ == __y.__p_;}
4570     friend _LIBCPP_INLINE_VISIBILITY
4571         bool operator!=(const poisson_distribution& __x,
4572                         const poisson_distribution& __y)
4573         {return !(__x == __y);}
4576 template<class _IntType>
4577 poisson_distribution<_IntType>::param_type::param_type(double __mean)
4578     : __mean_(__mean)
4580     if (__mean_ < 10)
4581     {
4582         __s_ = 0;
4583         __d_ = 0;
4584         __l_ = _VSTD::exp(-__mean_);
4585         __omega_ = 0;
4586         __c3_ = 0;
4587         __c2_ = 0;
4588         __c1_ = 0;
4589         __c0_ = 0;
4590         __c_ = 0;
4591     }
4592     else
4593     {
4594         __s_ = _VSTD::sqrt(__mean_);
4595         __d_ = 6 * __mean_ * __mean_;
4596         __l_ = static_cast<result_type>(__mean_ - 1.1484);
4597         __omega_ = .3989423 / __s_;
4598         double __b1_ = .4166667E-1 / __mean_;
4599         double __b2_ = .3 * __b1_ * __b1_;
4600         __c3_ = .1428571 * __b1_ * __b2_;
4601         __c2_ = __b2_ - 15. * __c3_;
4602         __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_;
4603         __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_;
4604         __c_ = .1069 / __mean_;
4605     }
4608 template <class _IntType>
4609 template<class _URNG>
4610 _IntType
4611 poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
4613     result_type __x;
4614     uniform_real_distribution<double> __urd;
4615     if (__pr.__mean_ < 10)
4616     {
4617          __x = 0;
4618         for (double __p = __urd(__urng); __p > __pr.__l_; ++__x)
4619             __p *= __urd(__urng);
4620     }
4621     else
4622     {
4623         double __difmuk;
4624         double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng);
4625         double __u;
4626         if (__g > 0)
4627         {
4628             __x = static_cast<result_type>(__g);
4629             if (__x >= __pr.__l_)
4630                 return __x;
4631             __difmuk = __pr.__mean_ - __x;
4632             __u = __urd(__urng);
4633             if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk)
4634                 return __x;
4635         }
4636         exponential_distribution<double> __edist;
4637         for (bool __using_exp_dist = false; true; __using_exp_dist = true)
4638         {
4639             double __e;
4640             if (__using_exp_dist || __g < 0)
4641             {
4642                 double __t;
4643                 do
4644                 {
4645                     __e = __edist(__urng);
4646                     __u = __urd(__urng);
4647                     __u += __u - 1;
4648                     __t = 1.8 + (__u < 0 ? -__e : __e);
4649                 } while (__t <= -.6744);
4650                 __x = __pr.__mean_ + __pr.__s_ * __t;
4651                 __difmuk = __pr.__mean_ - __x;
4652                 __using_exp_dist = true;
4653             }
4654             double __px;
4655             double __py;
4656             if (__x < 10)
4657             {
4658                 const result_type __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040,
4659                                              40320, 362880};
4660                 __px = -__pr.__mean_;
4661                 __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x];
4662             }
4663             else
4664             {
4665                 double __del = .8333333E-1 / __x;
4666                 __del -= 4.8 * __del * __del * __del;
4667                 double __v = __difmuk / __x;
4668                 if (_VSTD::abs(__v) > 0.25)
4669                     __px = __x * _VSTD::log(1 + __v) - __difmuk - __del;
4670                 else
4671                     __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) *
4672                            __v + .1421878) * __v + -.1661269) * __v + .2000118) *
4673                            __v + -.2500068) * __v + .3333333) * __v + -.5) - __del;
4674                 __py = .3989423 / _VSTD::sqrt(__x);
4675             }
4676             double __r = (0.5 - __difmuk) / __pr.__s_;
4677             double __r2 = __r * __r;
4678             double __fx = -0.5 * __r2;
4679             double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) *
4680                                         __r2 + __pr.__c1_) * __r2 + __pr.__c0_);
4681             if (__using_exp_dist)
4682             {
4683                 if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) -
4684                                                    __fy * _VSTD::exp(__fx + __e))
4685                     break;
4686             }
4687             else
4688             {
4689                 if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx))
4690                     break;
4691             }
4692         }
4693     }
4694     return __x;
4697 template <class _CharT, class _Traits, class _IntType>
4698 basic_ostream<_CharT, _Traits>&
4699 operator<<(basic_ostream<_CharT, _Traits>& __os,
4700            const poisson_distribution<_IntType>& __x)
4702     __save_flags<_CharT, _Traits> __lx(__os);
4703     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4704                ios_base::scientific);
4705     return __os << __x.mean();
4708 template <class _CharT, class _Traits, class _IntType>
4709 basic_istream<_CharT, _Traits>&
4710 operator>>(basic_istream<_CharT, _Traits>& __is,
4711            poisson_distribution<_IntType>& __x)
4713     typedef poisson_distribution<_IntType> _Eng;
4714     typedef typename _Eng::param_type param_type;
4715     __save_flags<_CharT, _Traits> __lx(__is);
4716     __is.flags(ios_base::dec | ios_base::skipws);
4717     double __mean;
4718     __is >> __mean;
4719     if (!__is.fail())
4720         __x.param(param_type(__mean));
4721     return __is;
4724 // weibull_distribution
4726 template<class _RealType = double>
4727 class _LIBCPP_TYPE_VIS_ONLY weibull_distribution
4729 public:
4730     // types
4731     typedef _RealType result_type;
4733     class _LIBCPP_TYPE_VIS_ONLY param_type
4734     {
4735         result_type __a_;
4736         result_type __b_;
4737     public:
4738         typedef weibull_distribution distribution_type;
4740         _LIBCPP_INLINE_VISIBILITY
4741         explicit param_type(result_type __a = 1, result_type __b = 1)
4742             : __a_(__a), __b_(__b) {}
4744         _LIBCPP_INLINE_VISIBILITY
4745         result_type a() const {return __a_;}
4746         _LIBCPP_INLINE_VISIBILITY
4747         result_type b() const {return __b_;}
4749         friend _LIBCPP_INLINE_VISIBILITY
4750             bool operator==(const param_type& __x, const param_type& __y)
4751             {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
4752         friend _LIBCPP_INLINE_VISIBILITY
4753             bool operator!=(const param_type& __x, const param_type& __y)
4754             {return !(__x == __y);}
4755     };
4757 private:
4758     param_type __p_;
4760 public:
4761     // constructor and reset functions
4762     _LIBCPP_INLINE_VISIBILITY
4763     explicit weibull_distribution(result_type __a = 1, result_type __b = 1)
4764         : __p_(param_type(__a, __b)) {}
4765     _LIBCPP_INLINE_VISIBILITY
4766     explicit weibull_distribution(const param_type& __p)
4767         : __p_(__p) {}
4768     _LIBCPP_INLINE_VISIBILITY
4769     void reset() {}
4771     // generating functions
4772     template<class _URNG>
4773         _LIBCPP_INLINE_VISIBILITY
4774         result_type operator()(_URNG& __g)
4775         {return (*this)(__g, __p_);}
4776     template<class _URNG>
4777         _LIBCPP_INLINE_VISIBILITY
4778         result_type operator()(_URNG& __g, const param_type& __p)
4779         {return __p.b() *
4780             _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());}
4782     // property functions
4783     _LIBCPP_INLINE_VISIBILITY
4784     result_type a() const {return __p_.a();}
4785     _LIBCPP_INLINE_VISIBILITY
4786     result_type b() const {return __p_.b();}
4788     _LIBCPP_INLINE_VISIBILITY
4789     param_type param() const {return __p_;}
4790     _LIBCPP_INLINE_VISIBILITY
4791     void param(const param_type& __p) {__p_ = __p;}
4793     _LIBCPP_INLINE_VISIBILITY
4794     result_type min() const {return 0;}
4795     _LIBCPP_INLINE_VISIBILITY
4796     result_type max() const {return numeric_limits<result_type>::infinity();}
4798     friend _LIBCPP_INLINE_VISIBILITY
4799         bool operator==(const weibull_distribution& __x,
4800                         const weibull_distribution& __y)
4801         {return __x.__p_ == __y.__p_;}
4802     friend _LIBCPP_INLINE_VISIBILITY
4803         bool operator!=(const weibull_distribution& __x,
4804                         const weibull_distribution& __y)
4805         {return !(__x == __y);}
4808 template <class _CharT, class _Traits, class _RT>
4809 basic_ostream<_CharT, _Traits>&
4810 operator<<(basic_ostream<_CharT, _Traits>& __os,
4811            const weibull_distribution<_RT>& __x)
4813     __save_flags<_CharT, _Traits> __lx(__os);
4814     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4815                ios_base::scientific);
4816     _CharT __sp = __os.widen(' ');
4817     __os.fill(__sp);
4818     __os << __x.a() << __sp << __x.b();
4819     return __os;
4822 template <class _CharT, class _Traits, class _RT>
4823 basic_istream<_CharT, _Traits>&
4824 operator>>(basic_istream<_CharT, _Traits>& __is,
4825            weibull_distribution<_RT>& __x)
4827     typedef weibull_distribution<_RT> _Eng;
4828     typedef typename _Eng::result_type result_type;
4829     typedef typename _Eng::param_type param_type;
4830     __save_flags<_CharT, _Traits> __lx(__is);
4831     __is.flags(ios_base::dec | ios_base::skipws);
4832     result_type __a;
4833     result_type __b;
4834     __is >> __a >> __b;
4835     if (!__is.fail())
4836         __x.param(param_type(__a, __b));
4837     return __is;
4840 template<class _RealType = double>
4841 class _LIBCPP_TYPE_VIS_ONLY extreme_value_distribution
4843 public:
4844     // types
4845     typedef _RealType result_type;
4847     class _LIBCPP_TYPE_VIS_ONLY param_type
4848     {
4849         result_type __a_;
4850         result_type __b_;
4851     public:
4852         typedef extreme_value_distribution distribution_type;
4854         _LIBCPP_INLINE_VISIBILITY
4855         explicit param_type(result_type __a = 0, result_type __b = 1)
4856             : __a_(__a), __b_(__b) {}
4858         _LIBCPP_INLINE_VISIBILITY
4859         result_type a() const {return __a_;}
4860         _LIBCPP_INLINE_VISIBILITY
4861         result_type b() const {return __b_;}
4863         friend _LIBCPP_INLINE_VISIBILITY
4864             bool operator==(const param_type& __x, const param_type& __y)
4865             {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
4866         friend _LIBCPP_INLINE_VISIBILITY
4867             bool operator!=(const param_type& __x, const param_type& __y)
4868             {return !(__x == __y);}
4869     };
4871 private:
4872     param_type __p_;
4874 public:
4875     // constructor and reset functions
4876     _LIBCPP_INLINE_VISIBILITY
4877     explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1)
4878         : __p_(param_type(__a, __b)) {}
4879     _LIBCPP_INLINE_VISIBILITY
4880     explicit extreme_value_distribution(const param_type& __p)
4881         : __p_(__p) {}
4882     _LIBCPP_INLINE_VISIBILITY
4883     void reset() {}
4885     // generating functions
4886     template<class _URNG>
4887         _LIBCPP_INLINE_VISIBILITY
4888         result_type operator()(_URNG& __g)
4889         {return (*this)(__g, __p_);}
4890     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
4892     // property functions
4893     _LIBCPP_INLINE_VISIBILITY
4894     result_type a() const {return __p_.a();}
4895     _LIBCPP_INLINE_VISIBILITY
4896     result_type b() const {return __p_.b();}
4898     _LIBCPP_INLINE_VISIBILITY
4899     param_type param() const {return __p_;}
4900     _LIBCPP_INLINE_VISIBILITY
4901     void param(const param_type& __p) {__p_ = __p;}
4903     _LIBCPP_INLINE_VISIBILITY
4904     result_type min() const {return -numeric_limits<result_type>::infinity();}
4905     _LIBCPP_INLINE_VISIBILITY
4906     result_type max() const {return numeric_limits<result_type>::infinity();}
4908     friend _LIBCPP_INLINE_VISIBILITY
4909         bool operator==(const extreme_value_distribution& __x,
4910                         const extreme_value_distribution& __y)
4911         {return __x.__p_ == __y.__p_;}
4912     friend _LIBCPP_INLINE_VISIBILITY
4913         bool operator!=(const extreme_value_distribution& __x,
4914                         const extreme_value_distribution& __y)
4915         {return !(__x == __y);}
4918 template<class _RealType>
4919 template<class _URNG>
4920 _RealType
4921 extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
4923     return __p.a() - __p.b() *
4924          _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g)));
4927 template <class _CharT, class _Traits, class _RT>
4928 basic_ostream<_CharT, _Traits>&
4929 operator<<(basic_ostream<_CharT, _Traits>& __os,
4930            const extreme_value_distribution<_RT>& __x)
4932     __save_flags<_CharT, _Traits> __lx(__os);
4933     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
4934                ios_base::scientific);
4935     _CharT __sp = __os.widen(' ');
4936     __os.fill(__sp);
4937     __os << __x.a() << __sp << __x.b();
4938     return __os;
4941 template <class _CharT, class _Traits, class _RT>
4942 basic_istream<_CharT, _Traits>&
4943 operator>>(basic_istream<_CharT, _Traits>& __is,
4944            extreme_value_distribution<_RT>& __x)
4946     typedef extreme_value_distribution<_RT> _Eng;
4947     typedef typename _Eng::result_type result_type;
4948     typedef typename _Eng::param_type param_type;
4949     __save_flags<_CharT, _Traits> __lx(__is);
4950     __is.flags(ios_base::dec | ios_base::skipws);
4951     result_type __a;
4952     result_type __b;
4953     __is >> __a >> __b;
4954     if (!__is.fail())
4955         __x.param(param_type(__a, __b));
4956     return __is;
4959 // gamma_distribution
4961 template<class _RealType = double>
4962 class _LIBCPP_TYPE_VIS_ONLY gamma_distribution
4964 public:
4965     // types
4966     typedef _RealType result_type;
4968     class _LIBCPP_TYPE_VIS_ONLY param_type
4969     {
4970         result_type __alpha_;
4971         result_type __beta_;
4972     public:
4973         typedef gamma_distribution distribution_type;
4975         _LIBCPP_INLINE_VISIBILITY
4976         explicit param_type(result_type __alpha = 1, result_type __beta = 1)
4977             : __alpha_(__alpha), __beta_(__beta) {}
4979         _LIBCPP_INLINE_VISIBILITY
4980         result_type alpha() const {return __alpha_;}
4981         _LIBCPP_INLINE_VISIBILITY
4982         result_type beta() const {return __beta_;}
4984         friend _LIBCPP_INLINE_VISIBILITY
4985             bool operator==(const param_type& __x, const param_type& __y)
4986             {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;}
4987         friend _LIBCPP_INLINE_VISIBILITY
4988             bool operator!=(const param_type& __x, const param_type& __y)
4989             {return !(__x == __y);}
4990     };
4992 private:
4993     param_type __p_;
4995 public:
4996     // constructors and reset functions
4997     _LIBCPP_INLINE_VISIBILITY
4998     explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1)
4999         : __p_(param_type(__alpha, __beta)) {}
5000     _LIBCPP_INLINE_VISIBILITY
5001     explicit gamma_distribution(const param_type& __p)
5002         : __p_(__p) {}
5003     _LIBCPP_INLINE_VISIBILITY
5004     void reset() {}
5006     // generating functions
5007     template<class _URNG>
5008         _LIBCPP_INLINE_VISIBILITY
5009         result_type operator()(_URNG& __g)
5010         {return (*this)(__g, __p_);}
5011     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
5013     // property functions
5014     _LIBCPP_INLINE_VISIBILITY
5015     result_type alpha() const {return __p_.alpha();}
5016     _LIBCPP_INLINE_VISIBILITY
5017     result_type beta() const {return __p_.beta();}
5019     _LIBCPP_INLINE_VISIBILITY
5020     param_type param() const {return __p_;}
5021     _LIBCPP_INLINE_VISIBILITY
5022     void param(const param_type& __p) {__p_ = __p;}
5024     _LIBCPP_INLINE_VISIBILITY
5025     result_type min() const {return 0;}
5026     _LIBCPP_INLINE_VISIBILITY
5027     result_type max() const {return numeric_limits<result_type>::infinity();}
5029     friend _LIBCPP_INLINE_VISIBILITY
5030         bool operator==(const gamma_distribution& __x,
5031                         const gamma_distribution& __y)
5032         {return __x.__p_ == __y.__p_;}
5033     friend _LIBCPP_INLINE_VISIBILITY
5034         bool operator!=(const gamma_distribution& __x,
5035                         const gamma_distribution& __y)
5036         {return !(__x == __y);}
5039 template <class _RealType>
5040 template<class _URNG>
5041 _RealType
5042 gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
5044     result_type __a = __p.alpha();
5045     uniform_real_distribution<result_type> __gen(0, 1);
5046     exponential_distribution<result_type> __egen;
5047     result_type __x;
5048     if (__a == 1)
5049         __x = __egen(__g);
5050     else if (__a > 1)
5051     {
5052         const result_type __b = __a - 1;
5053         const result_type __c = 3 * __a - result_type(0.75);
5054         while (true)
5055         {
5056             const result_type __u = __gen(__g);
5057             const result_type __v = __gen(__g);
5058             const result_type __w = __u * (1 - __u);
5059             if (__w != 0)
5060             {
5061                 const result_type __y = _VSTD::sqrt(__c / __w) *
5062                                         (__u - result_type(0.5));
5063                 __x = __b + __y;
5064                 if (__x >= 0)
5065                 {
5066                     const result_type __z = 64 * __w * __w * __w * __v * __v;
5067                     if (__z <= 1 - 2 * __y * __y / __x)
5068                         break;
5069                     if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y))
5070                         break;
5071                 }
5072             }
5073         }
5074     }
5075     else  // __a < 1
5076     {
5077         while (true)
5078         {
5079             const result_type __u = __gen(__g);
5080             const result_type __es = __egen(__g);
5081             if (__u <= 1 - __a)
5082             {
5083                 __x = _VSTD::pow(__u, 1 / __a);
5084                 if (__x <= __es)
5085                     break;
5086             }
5087             else
5088             {
5089                 const result_type __e = -_VSTD::log((1-__u)/__a);
5090                 __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a);
5091                 if (__x <= __e + __es)
5092                     break;
5093             }
5094         }
5095     }
5096     return __x * __p.beta();
5099 template <class _CharT, class _Traits, class _RT>
5100 basic_ostream<_CharT, _Traits>&
5101 operator<<(basic_ostream<_CharT, _Traits>& __os,
5102            const gamma_distribution<_RT>& __x)
5104     __save_flags<_CharT, _Traits> __lx(__os);
5105     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5106                ios_base::scientific);
5107     _CharT __sp = __os.widen(' ');
5108     __os.fill(__sp);
5109     __os << __x.alpha() << __sp << __x.beta();
5110     return __os;
5113 template <class _CharT, class _Traits, class _RT>
5114 basic_istream<_CharT, _Traits>&
5115 operator>>(basic_istream<_CharT, _Traits>& __is,
5116            gamma_distribution<_RT>& __x)
5118     typedef gamma_distribution<_RT> _Eng;
5119     typedef typename _Eng::result_type result_type;
5120     typedef typename _Eng::param_type param_type;
5121     __save_flags<_CharT, _Traits> __lx(__is);
5122     __is.flags(ios_base::dec | ios_base::skipws);
5123     result_type __alpha;
5124     result_type __beta;
5125     __is >> __alpha >> __beta;
5126     if (!__is.fail())
5127         __x.param(param_type(__alpha, __beta));
5128     return __is;
5131 // negative_binomial_distribution
5133 template<class _IntType = int>
5134 class _LIBCPP_TYPE_VIS_ONLY negative_binomial_distribution
5136 public:
5137     // types
5138     typedef _IntType result_type;
5140     class _LIBCPP_TYPE_VIS_ONLY param_type
5141     {
5142         result_type __k_;
5143         double __p_;
5144     public:
5145         typedef negative_binomial_distribution distribution_type;
5147         _LIBCPP_INLINE_VISIBILITY
5148         explicit param_type(result_type __k = 1, double __p = 0.5)
5149             : __k_(__k), __p_(__p) {}
5151         _LIBCPP_INLINE_VISIBILITY
5152         result_type k() const {return __k_;}
5153         _LIBCPP_INLINE_VISIBILITY
5154         double p() const {return __p_;}
5156         friend _LIBCPP_INLINE_VISIBILITY
5157             bool operator==(const param_type& __x, const param_type& __y)
5158             {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;}
5159         friend _LIBCPP_INLINE_VISIBILITY
5160             bool operator!=(const param_type& __x, const param_type& __y)
5161             {return !(__x == __y);}
5162     };
5164 private:
5165     param_type __p_;
5167 public:
5168     // constructor and reset functions
5169     _LIBCPP_INLINE_VISIBILITY
5170     explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5)
5171         : __p_(__k, __p) {}
5172     _LIBCPP_INLINE_VISIBILITY
5173     explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {}
5174     _LIBCPP_INLINE_VISIBILITY
5175     void reset() {}
5177     // generating functions
5178     template<class _URNG>
5179         _LIBCPP_INLINE_VISIBILITY
5180         result_type operator()(_URNG& __g)
5181         {return (*this)(__g, __p_);}
5182     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
5184     // property functions
5185     _LIBCPP_INLINE_VISIBILITY
5186     result_type k() const {return __p_.k();}
5187     _LIBCPP_INLINE_VISIBILITY
5188     double p() const {return __p_.p();}
5190     _LIBCPP_INLINE_VISIBILITY
5191     param_type param() const {return __p_;}
5192     _LIBCPP_INLINE_VISIBILITY
5193     void param(const param_type& __p) {__p_ = __p;}
5195     _LIBCPP_INLINE_VISIBILITY
5196     result_type min() const {return 0;}
5197     _LIBCPP_INLINE_VISIBILITY
5198     result_type max() const {return numeric_limits<result_type>::max();}
5200     friend _LIBCPP_INLINE_VISIBILITY
5201         bool operator==(const negative_binomial_distribution& __x,
5202                         const negative_binomial_distribution& __y)
5203         {return __x.__p_ == __y.__p_;}
5204     friend _LIBCPP_INLINE_VISIBILITY
5205         bool operator!=(const negative_binomial_distribution& __x,
5206                         const negative_binomial_distribution& __y)
5207         {return !(__x == __y);}
5210 template <class _IntType>
5211 template<class _URNG>
5212 _IntType
5213 negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr)
5215     result_type __k = __pr.k();
5216     double __p = __pr.p();
5217     if (__k <= 21 * __p)
5218     {
5219         bernoulli_distribution __gen(__p);
5220         result_type __f = 0;
5221         result_type __s = 0;
5222         while (__s < __k)
5223         {
5224             if (__gen(__urng))
5225                 ++__s;
5226             else
5227                 ++__f;
5228         }
5229         return __f;
5230     }
5231     return poisson_distribution<result_type>(gamma_distribution<double>
5232                                             (__k, (1-__p)/__p)(__urng))(__urng);
5235 template <class _CharT, class _Traits, class _IntType>
5236 basic_ostream<_CharT, _Traits>&
5237 operator<<(basic_ostream<_CharT, _Traits>& __os,
5238            const negative_binomial_distribution<_IntType>& __x)
5240     __save_flags<_CharT, _Traits> __lx(__os);
5241     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5242                ios_base::scientific);
5243     _CharT __sp = __os.widen(' ');
5244     __os.fill(__sp);
5245     return __os << __x.k() << __sp << __x.p();
5248 template <class _CharT, class _Traits, class _IntType>
5249 basic_istream<_CharT, _Traits>&
5250 operator>>(basic_istream<_CharT, _Traits>& __is,
5251            negative_binomial_distribution<_IntType>& __x)
5253     typedef negative_binomial_distribution<_IntType> _Eng;
5254     typedef typename _Eng::result_type result_type;
5255     typedef typename _Eng::param_type param_type;
5256     __save_flags<_CharT, _Traits> __lx(__is);
5257     __is.flags(ios_base::dec | ios_base::skipws);
5258     result_type __k;
5259     double __p;
5260     __is >> __k >> __p;
5261     if (!__is.fail())
5262         __x.param(param_type(__k, __p));
5263     return __is;
5266 // geometric_distribution
5268 template<class _IntType = int>
5269 class _LIBCPP_TYPE_VIS_ONLY geometric_distribution
5271 public:
5272     // types
5273     typedef _IntType result_type;
5275     class _LIBCPP_TYPE_VIS_ONLY param_type
5276     {
5277         double __p_;
5278     public:
5279         typedef geometric_distribution distribution_type;
5281         _LIBCPP_INLINE_VISIBILITY
5282         explicit param_type(double __p = 0.5) : __p_(__p) {}
5284         _LIBCPP_INLINE_VISIBILITY
5285         double p() const {return __p_;}
5287         friend _LIBCPP_INLINE_VISIBILITY
5288             bool operator==(const param_type& __x, const param_type& __y)
5289             {return __x.__p_ == __y.__p_;}
5290         friend _LIBCPP_INLINE_VISIBILITY
5291             bool operator!=(const param_type& __x, const param_type& __y)
5292             {return !(__x == __y);}
5293     };
5295 private:
5296     param_type __p_;
5298 public:
5299     // constructors and reset functions
5300     _LIBCPP_INLINE_VISIBILITY
5301     explicit geometric_distribution(double __p = 0.5) : __p_(__p) {}
5302     _LIBCPP_INLINE_VISIBILITY
5303     explicit geometric_distribution(const param_type& __p) : __p_(__p) {}
5304     _LIBCPP_INLINE_VISIBILITY
5305     void reset() {}
5307     // generating functions
5308     template<class _URNG>
5309         _LIBCPP_INLINE_VISIBILITY
5310         result_type operator()(_URNG& __g)
5311         {return (*this)(__g, __p_);}
5312     template<class _URNG>
5313         _LIBCPP_INLINE_VISIBILITY
5314         result_type operator()(_URNG& __g, const param_type& __p)
5315         {return negative_binomial_distribution<result_type>(1, __p.p())(__g);}
5317     // property functions
5318     _LIBCPP_INLINE_VISIBILITY
5319     double p() const {return __p_.p();}
5321     _LIBCPP_INLINE_VISIBILITY
5322     param_type param() const {return __p_;}
5323     _LIBCPP_INLINE_VISIBILITY
5324     void param(const param_type& __p) {__p_ = __p;}
5326     _LIBCPP_INLINE_VISIBILITY
5327     result_type min() const {return 0;}
5328     _LIBCPP_INLINE_VISIBILITY
5329     result_type max() const {return numeric_limits<result_type>::max();}
5331     friend _LIBCPP_INLINE_VISIBILITY
5332         bool operator==(const geometric_distribution& __x,
5333                         const geometric_distribution& __y)
5334         {return __x.__p_ == __y.__p_;}
5335     friend _LIBCPP_INLINE_VISIBILITY
5336         bool operator!=(const geometric_distribution& __x,
5337                         const geometric_distribution& __y)
5338         {return !(__x == __y);}
5341 template <class _CharT, class _Traits, class _IntType>
5342 basic_ostream<_CharT, _Traits>&
5343 operator<<(basic_ostream<_CharT, _Traits>& __os,
5344            const geometric_distribution<_IntType>& __x)
5346     __save_flags<_CharT, _Traits> __lx(__os);
5347     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5348                ios_base::scientific);
5349     return __os << __x.p();
5352 template <class _CharT, class _Traits, class _IntType>
5353 basic_istream<_CharT, _Traits>&
5354 operator>>(basic_istream<_CharT, _Traits>& __is,
5355            geometric_distribution<_IntType>& __x)
5357     typedef geometric_distribution<_IntType> _Eng;
5358     typedef typename _Eng::param_type param_type;
5359     __save_flags<_CharT, _Traits> __lx(__is);
5360     __is.flags(ios_base::dec | ios_base::skipws);
5361     double __p;
5362     __is >> __p;
5363     if (!__is.fail())
5364         __x.param(param_type(__p));
5365     return __is;
5368 // chi_squared_distribution
5370 template<class _RealType = double>
5371 class _LIBCPP_TYPE_VIS_ONLY chi_squared_distribution
5373 public:
5374     // types
5375     typedef _RealType result_type;
5377     class _LIBCPP_TYPE_VIS_ONLY param_type
5378     {
5379         result_type __n_;
5380     public:
5381         typedef chi_squared_distribution distribution_type;
5383         _LIBCPP_INLINE_VISIBILITY
5384         explicit param_type(result_type __n = 1) : __n_(__n) {}
5386         _LIBCPP_INLINE_VISIBILITY
5387         result_type n() const {return __n_;}
5389         friend _LIBCPP_INLINE_VISIBILITY
5390             bool operator==(const param_type& __x, const param_type& __y)
5391             {return __x.__n_ == __y.__n_;}
5392         friend _LIBCPP_INLINE_VISIBILITY
5393             bool operator!=(const param_type& __x, const param_type& __y)
5394             {return !(__x == __y);}
5395     };
5397 private:
5398     param_type __p_;
5400 public:
5401     // constructor and reset functions
5402     _LIBCPP_INLINE_VISIBILITY
5403     explicit chi_squared_distribution(result_type __n = 1)
5404         : __p_(param_type(__n)) {}
5405     _LIBCPP_INLINE_VISIBILITY
5406     explicit chi_squared_distribution(const param_type& __p)
5407         : __p_(__p) {}
5408     _LIBCPP_INLINE_VISIBILITY
5409     void reset() {}
5411     // generating functions
5412     template<class _URNG>
5413         _LIBCPP_INLINE_VISIBILITY
5414         result_type operator()(_URNG& __g)
5415         {return (*this)(__g, __p_);}
5416     template<class _URNG>
5417         _LIBCPP_INLINE_VISIBILITY
5418         result_type operator()(_URNG& __g, const param_type& __p)
5419         {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);}
5421     // property functions
5422     _LIBCPP_INLINE_VISIBILITY
5423     result_type n() const {return __p_.n();}
5425     _LIBCPP_INLINE_VISIBILITY
5426     param_type param() const {return __p_;}
5427     _LIBCPP_INLINE_VISIBILITY
5428     void param(const param_type& __p) {__p_ = __p;}
5430     _LIBCPP_INLINE_VISIBILITY
5431     result_type min() const {return 0;}
5432     _LIBCPP_INLINE_VISIBILITY
5433     result_type max() const {return numeric_limits<result_type>::infinity();}
5435     friend _LIBCPP_INLINE_VISIBILITY
5436         bool operator==(const chi_squared_distribution& __x,
5437                         const chi_squared_distribution& __y)
5438         {return __x.__p_ == __y.__p_;}
5439     friend _LIBCPP_INLINE_VISIBILITY
5440         bool operator!=(const chi_squared_distribution& __x,
5441                         const chi_squared_distribution& __y)
5442         {return !(__x == __y);}
5445 template <class _CharT, class _Traits, class _RT>
5446 basic_ostream<_CharT, _Traits>&
5447 operator<<(basic_ostream<_CharT, _Traits>& __os,
5448            const chi_squared_distribution<_RT>& __x)
5450     __save_flags<_CharT, _Traits> __lx(__os);
5451     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5452                ios_base::scientific);
5453     __os << __x.n();
5454     return __os;
5457 template <class _CharT, class _Traits, class _RT>
5458 basic_istream<_CharT, _Traits>&
5459 operator>>(basic_istream<_CharT, _Traits>& __is,
5460            chi_squared_distribution<_RT>& __x)
5462     typedef chi_squared_distribution<_RT> _Eng;
5463     typedef typename _Eng::result_type result_type;
5464     typedef typename _Eng::param_type param_type;
5465     __save_flags<_CharT, _Traits> __lx(__is);
5466     __is.flags(ios_base::dec | ios_base::skipws);
5467     result_type __n;
5468     __is >> __n;
5469     if (!__is.fail())
5470         __x.param(param_type(__n));
5471     return __is;
5474 // cauchy_distribution
5476 template<class _RealType = double>
5477 class _LIBCPP_TYPE_VIS_ONLY cauchy_distribution
5479 public:
5480     // types
5481     typedef _RealType result_type;
5483     class _LIBCPP_TYPE_VIS_ONLY param_type
5484     {
5485         result_type __a_;
5486         result_type __b_;
5487     public:
5488         typedef cauchy_distribution distribution_type;
5490         _LIBCPP_INLINE_VISIBILITY
5491         explicit param_type(result_type __a = 0, result_type __b = 1)
5492             : __a_(__a), __b_(__b) {}
5494         _LIBCPP_INLINE_VISIBILITY
5495         result_type a() const {return __a_;}
5496         _LIBCPP_INLINE_VISIBILITY
5497         result_type b() const {return __b_;}
5499         friend _LIBCPP_INLINE_VISIBILITY
5500             bool operator==(const param_type& __x, const param_type& __y)
5501             {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
5502         friend _LIBCPP_INLINE_VISIBILITY
5503             bool operator!=(const param_type& __x, const param_type& __y)
5504             {return !(__x == __y);}
5505     };
5507 private:
5508     param_type __p_;
5510 public:
5511     // constructor and reset functions
5512     _LIBCPP_INLINE_VISIBILITY
5513     explicit cauchy_distribution(result_type __a = 0, result_type __b = 1)
5514         : __p_(param_type(__a, __b)) {}
5515     _LIBCPP_INLINE_VISIBILITY
5516     explicit cauchy_distribution(const param_type& __p)
5517         : __p_(__p) {}
5518     _LIBCPP_INLINE_VISIBILITY
5519     void reset() {}
5521     // generating functions
5522     template<class _URNG>
5523         _LIBCPP_INLINE_VISIBILITY
5524         result_type operator()(_URNG& __g)
5525         {return (*this)(__g, __p_);}
5526     template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p);
5528     // property functions
5529     _LIBCPP_INLINE_VISIBILITY
5530     result_type a() const {return __p_.a();}
5531     _LIBCPP_INLINE_VISIBILITY
5532     result_type b() const {return __p_.b();}
5534     _LIBCPP_INLINE_VISIBILITY
5535     param_type param() const {return __p_;}
5536     _LIBCPP_INLINE_VISIBILITY
5537     void param(const param_type& __p) {__p_ = __p;}
5539     _LIBCPP_INLINE_VISIBILITY
5540     result_type min() const {return -numeric_limits<result_type>::infinity();}
5541     _LIBCPP_INLINE_VISIBILITY
5542     result_type max() const {return numeric_limits<result_type>::infinity();}
5544     friend _LIBCPP_INLINE_VISIBILITY
5545         bool operator==(const cauchy_distribution& __x,
5546                         const cauchy_distribution& __y)
5547         {return __x.__p_ == __y.__p_;}
5548     friend _LIBCPP_INLINE_VISIBILITY
5549         bool operator!=(const cauchy_distribution& __x,
5550                         const cauchy_distribution& __y)
5551         {return !(__x == __y);}
5554 template <class _RealType>
5555 template<class _URNG>
5556 inline
5557 _RealType
5558 cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
5560     uniform_real_distribution<result_type> __gen;
5561     // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite
5562     return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g));
5565 template <class _CharT, class _Traits, class _RT>
5566 basic_ostream<_CharT, _Traits>&
5567 operator<<(basic_ostream<_CharT, _Traits>& __os,
5568            const cauchy_distribution<_RT>& __x)
5570     __save_flags<_CharT, _Traits> __lx(__os);
5571     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5572                ios_base::scientific);
5573     _CharT __sp = __os.widen(' ');
5574     __os.fill(__sp);
5575     __os << __x.a() << __sp << __x.b();
5576     return __os;
5579 template <class _CharT, class _Traits, class _RT>
5580 basic_istream<_CharT, _Traits>&
5581 operator>>(basic_istream<_CharT, _Traits>& __is,
5582            cauchy_distribution<_RT>& __x)
5584     typedef cauchy_distribution<_RT> _Eng;
5585     typedef typename _Eng::result_type result_type;
5586     typedef typename _Eng::param_type param_type;
5587     __save_flags<_CharT, _Traits> __lx(__is);
5588     __is.flags(ios_base::dec | ios_base::skipws);
5589     result_type __a;
5590     result_type __b;
5591     __is >> __a >> __b;
5592     if (!__is.fail())
5593         __x.param(param_type(__a, __b));
5594     return __is;
5597 // fisher_f_distribution
5599 template<class _RealType = double>
5600 class _LIBCPP_TYPE_VIS_ONLY fisher_f_distribution
5602 public:
5603     // types
5604     typedef _RealType result_type;
5606     class _LIBCPP_TYPE_VIS_ONLY param_type
5607     {
5608         result_type __m_;
5609         result_type __n_;
5610     public:
5611         typedef fisher_f_distribution distribution_type;
5613         _LIBCPP_INLINE_VISIBILITY
5614         explicit param_type(result_type __m = 1, result_type __n = 1)
5615             : __m_(__m), __n_(__n) {}
5617         _LIBCPP_INLINE_VISIBILITY
5618         result_type m() const {return __m_;}
5619         _LIBCPP_INLINE_VISIBILITY
5620         result_type n() const {return __n_;}
5622         friend _LIBCPP_INLINE_VISIBILITY
5623             bool operator==(const param_type& __x, const param_type& __y)
5624             {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;}
5625         friend _LIBCPP_INLINE_VISIBILITY
5626             bool operator!=(const param_type& __x, const param_type& __y)
5627             {return !(__x == __y);}
5628     };
5630 private:
5631     param_type __p_;
5633 public:
5634     // constructor and reset functions
5635     _LIBCPP_INLINE_VISIBILITY
5636     explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1)
5637         : __p_(param_type(__m, __n)) {}
5638     _LIBCPP_INLINE_VISIBILITY
5639     explicit fisher_f_distribution(const param_type& __p)
5640         : __p_(__p) {}
5641     _LIBCPP_INLINE_VISIBILITY
5642     void reset() {}
5644     // generating functions
5645     template<class _URNG>
5646         _LIBCPP_INLINE_VISIBILITY
5647         result_type operator()(_URNG& __g)
5648         {return (*this)(__g, __p_);}
5649     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
5651     // property functions
5652     _LIBCPP_INLINE_VISIBILITY
5653     result_type m() const {return __p_.m();}
5654     _LIBCPP_INLINE_VISIBILITY
5655     result_type n() const {return __p_.n();}
5657     _LIBCPP_INLINE_VISIBILITY
5658     param_type param() const {return __p_;}
5659     _LIBCPP_INLINE_VISIBILITY
5660     void param(const param_type& __p) {__p_ = __p;}
5662     _LIBCPP_INLINE_VISIBILITY
5663     result_type min() const {return 0;}
5664     _LIBCPP_INLINE_VISIBILITY
5665     result_type max() const {return numeric_limits<result_type>::infinity();}
5667     friend _LIBCPP_INLINE_VISIBILITY
5668         bool operator==(const fisher_f_distribution& __x,
5669                         const fisher_f_distribution& __y)
5670         {return __x.__p_ == __y.__p_;}
5671     friend _LIBCPP_INLINE_VISIBILITY
5672         bool operator!=(const fisher_f_distribution& __x,
5673                         const fisher_f_distribution& __y)
5674         {return !(__x == __y);}
5677 template <class _RealType>
5678 template<class _URNG>
5679 _RealType
5680 fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
5682     gamma_distribution<result_type> __gdm(__p.m() * result_type(.5));
5683     gamma_distribution<result_type> __gdn(__p.n() * result_type(.5));
5684     return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g));
5687 template <class _CharT, class _Traits, class _RT>
5688 basic_ostream<_CharT, _Traits>&
5689 operator<<(basic_ostream<_CharT, _Traits>& __os,
5690            const fisher_f_distribution<_RT>& __x)
5692     __save_flags<_CharT, _Traits> __lx(__os);
5693     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5694                ios_base::scientific);
5695     _CharT __sp = __os.widen(' ');
5696     __os.fill(__sp);
5697     __os << __x.m() << __sp << __x.n();
5698     return __os;
5701 template <class _CharT, class _Traits, class _RT>
5702 basic_istream<_CharT, _Traits>&
5703 operator>>(basic_istream<_CharT, _Traits>& __is,
5704            fisher_f_distribution<_RT>& __x)
5706     typedef fisher_f_distribution<_RT> _Eng;
5707     typedef typename _Eng::result_type result_type;
5708     typedef typename _Eng::param_type param_type;
5709     __save_flags<_CharT, _Traits> __lx(__is);
5710     __is.flags(ios_base::dec | ios_base::skipws);
5711     result_type __m;
5712     result_type __n;
5713     __is >> __m >> __n;
5714     if (!__is.fail())
5715         __x.param(param_type(__m, __n));
5716     return __is;
5719 // student_t_distribution
5721 template<class _RealType = double>
5722 class _LIBCPP_TYPE_VIS_ONLY student_t_distribution
5724 public:
5725     // types
5726     typedef _RealType result_type;
5728     class _LIBCPP_TYPE_VIS_ONLY param_type
5729     {
5730         result_type __n_;
5731     public:
5732         typedef student_t_distribution distribution_type;
5734         _LIBCPP_INLINE_VISIBILITY
5735         explicit param_type(result_type __n = 1) : __n_(__n) {}
5737         _LIBCPP_INLINE_VISIBILITY
5738         result_type n() const {return __n_;}
5740         friend _LIBCPP_INLINE_VISIBILITY
5741             bool operator==(const param_type& __x, const param_type& __y)
5742             {return __x.__n_ == __y.__n_;}
5743         friend _LIBCPP_INLINE_VISIBILITY
5744             bool operator!=(const param_type& __x, const param_type& __y)
5745             {return !(__x == __y);}
5746     };
5748 private:
5749     param_type __p_;
5750     normal_distribution<result_type> __nd_;
5752 public:
5753     // constructor and reset functions
5754     _LIBCPP_INLINE_VISIBILITY
5755     explicit student_t_distribution(result_type __n = 1)
5756         : __p_(param_type(__n)) {}
5757     _LIBCPP_INLINE_VISIBILITY
5758     explicit student_t_distribution(const param_type& __p)
5759         : __p_(__p) {}
5760     _LIBCPP_INLINE_VISIBILITY
5761     void reset() {__nd_.reset();}
5763     // generating functions
5764     template<class _URNG>
5765         _LIBCPP_INLINE_VISIBILITY
5766         result_type operator()(_URNG& __g)
5767         {return (*this)(__g, __p_);}
5768     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
5770     // property functions
5771     _LIBCPP_INLINE_VISIBILITY
5772     result_type n() const {return __p_.n();}
5774     _LIBCPP_INLINE_VISIBILITY
5775     param_type param() const {return __p_;}
5776     _LIBCPP_INLINE_VISIBILITY
5777     void param(const param_type& __p) {__p_ = __p;}
5779     _LIBCPP_INLINE_VISIBILITY
5780     result_type min() const {return -numeric_limits<result_type>::infinity();}
5781     _LIBCPP_INLINE_VISIBILITY
5782     result_type max() const {return numeric_limits<result_type>::infinity();}
5784     friend _LIBCPP_INLINE_VISIBILITY
5785         bool operator==(const student_t_distribution& __x,
5786                         const student_t_distribution& __y)
5787         {return __x.__p_ == __y.__p_;}
5788     friend _LIBCPP_INLINE_VISIBILITY
5789         bool operator!=(const student_t_distribution& __x,
5790                         const student_t_distribution& __y)
5791         {return !(__x == __y);}
5794 template <class _RealType>
5795 template<class _URNG>
5796 _RealType
5797 student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
5799     gamma_distribution<result_type> __gd(__p.n() * .5, 2);
5800     return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g));
5803 template <class _CharT, class _Traits, class _RT>
5804 basic_ostream<_CharT, _Traits>&
5805 operator<<(basic_ostream<_CharT, _Traits>& __os,
5806            const student_t_distribution<_RT>& __x)
5808     __save_flags<_CharT, _Traits> __lx(__os);
5809     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
5810                ios_base::scientific);
5811     __os << __x.n();
5812     return __os;
5815 template <class _CharT, class _Traits, class _RT>
5816 basic_istream<_CharT, _Traits>&
5817 operator>>(basic_istream<_CharT, _Traits>& __is,
5818            student_t_distribution<_RT>& __x)
5820     typedef student_t_distribution<_RT> _Eng;
5821     typedef typename _Eng::result_type result_type;
5822     typedef typename _Eng::param_type param_type;
5823     __save_flags<_CharT, _Traits> __lx(__is);
5824     __is.flags(ios_base::dec | ios_base::skipws);
5825     result_type __n;
5826     __is >> __n;
5827     if (!__is.fail())
5828         __x.param(param_type(__n));
5829     return __is;
5832 // discrete_distribution
5834 template<class _IntType = int>
5835 class _LIBCPP_TYPE_VIS_ONLY discrete_distribution
5837 public:
5838     // types
5839     typedef _IntType result_type;
5841     class _LIBCPP_TYPE_VIS_ONLY param_type
5842     {
5843         vector<double> __p_;
5844     public:
5845         typedef discrete_distribution distribution_type;
5847         _LIBCPP_INLINE_VISIBILITY
5848         param_type() {}
5849         template<class _InputIterator>
5850             _LIBCPP_INLINE_VISIBILITY
5851             param_type(_InputIterator __f, _InputIterator __l)
5852             : __p_(__f, __l) {__init();}
5853 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
5854         _LIBCPP_INLINE_VISIBILITY
5855         param_type(initializer_list<double> __wl)
5856             : __p_(__wl.begin(), __wl.end()) {__init();}
5857 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
5858         template<class _UnaryOperation>
5859             param_type(size_t __nw, double __xmin, double __xmax,
5860                        _UnaryOperation __fw);
5862         vector<double> probabilities() const;
5864         friend _LIBCPP_INLINE_VISIBILITY
5865             bool operator==(const param_type& __x, const param_type& __y)
5866             {return __x.__p_ == __y.__p_;}
5867         friend _LIBCPP_INLINE_VISIBILITY
5868             bool operator!=(const param_type& __x, const param_type& __y)
5869             {return !(__x == __y);}
5871     private:
5872         void __init();
5874         friend class discrete_distribution;
5876         template <class _CharT, class _Traits, class _IT>
5877         friend
5878         basic_ostream<_CharT, _Traits>&
5879         operator<<(basic_ostream<_CharT, _Traits>& __os,
5880                    const discrete_distribution<_IT>& __x);
5882         template <class _CharT, class _Traits, class _IT>
5883         friend
5884         basic_istream<_CharT, _Traits>&
5885         operator>>(basic_istream<_CharT, _Traits>& __is,
5886                    discrete_distribution<_IT>& __x);
5887     };
5889 private:
5890     param_type __p_;
5892 public:
5893     // constructor and reset functions
5894     _LIBCPP_INLINE_VISIBILITY
5895     discrete_distribution() {}
5896     template<class _InputIterator>
5897         _LIBCPP_INLINE_VISIBILITY
5898         discrete_distribution(_InputIterator __f, _InputIterator __l)
5899             : __p_(__f, __l) {}
5900 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
5901     _LIBCPP_INLINE_VISIBILITY
5902     discrete_distribution(initializer_list<double> __wl)
5903         : __p_(__wl) {}
5904 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
5905     template<class _UnaryOperation>
5906         _LIBCPP_INLINE_VISIBILITY
5907         discrete_distribution(size_t __nw, double __xmin, double __xmax,
5908                               _UnaryOperation __fw)
5909         : __p_(__nw, __xmin, __xmax, __fw) {}
5910     _LIBCPP_INLINE_VISIBILITY
5911     explicit discrete_distribution(const param_type& __p)
5912         : __p_(__p) {}
5913     _LIBCPP_INLINE_VISIBILITY
5914     void reset() {}
5916     // generating functions
5917     template<class _URNG>
5918         _LIBCPP_INLINE_VISIBILITY
5919         result_type operator()(_URNG& __g)
5920         {return (*this)(__g, __p_);}
5921     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
5923     // property functions
5924     _LIBCPP_INLINE_VISIBILITY
5925     vector<double> probabilities() const {return __p_.probabilities();}
5927     _LIBCPP_INLINE_VISIBILITY
5928     param_type param() const {return __p_;}
5929     _LIBCPP_INLINE_VISIBILITY
5930     void param(const param_type& __p) {__p_ = __p;}
5932     _LIBCPP_INLINE_VISIBILITY
5933     result_type min() const {return 0;}
5934     _LIBCPP_INLINE_VISIBILITY
5935     result_type max() const {return __p_.__p_.size();}
5937     friend _LIBCPP_INLINE_VISIBILITY
5938         bool operator==(const discrete_distribution& __x,
5939                         const discrete_distribution& __y)
5940         {return __x.__p_ == __y.__p_;}
5941     friend _LIBCPP_INLINE_VISIBILITY
5942         bool operator!=(const discrete_distribution& __x,
5943                         const discrete_distribution& __y)
5944         {return !(__x == __y);}
5946     template <class _CharT, class _Traits, class _IT>
5947     friend
5948     basic_ostream<_CharT, _Traits>&
5949     operator<<(basic_ostream<_CharT, _Traits>& __os,
5950                const discrete_distribution<_IT>& __x);
5952     template <class _CharT, class _Traits, class _IT>
5953     friend
5954     basic_istream<_CharT, _Traits>&
5955     operator>>(basic_istream<_CharT, _Traits>& __is,
5956                discrete_distribution<_IT>& __x);
5959 template<class _IntType>
5960 template<class _UnaryOperation>
5961 discrete_distribution<_IntType>::param_type::param_type(size_t __nw,
5962                                                         double __xmin,
5963                                                         double __xmax,
5964                                                         _UnaryOperation __fw)
5966     if (__nw > 1)
5967     {
5968         __p_.reserve(__nw - 1);
5969         double __d = (__xmax - __xmin) / __nw;
5970         double __d2 = __d / 2;
5971         for (size_t __k = 0; __k < __nw; ++__k)
5972             __p_.push_back(__fw(__xmin + __k * __d + __d2));
5973         __init();
5974     }
5977 template<class _IntType>
5978 void
5979 discrete_distribution<_IntType>::param_type::__init()
5981     if (!__p_.empty())
5982     {
5983         if (__p_.size() > 1)
5984         {
5985             double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0);
5986             for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end();
5987                                                                        __i < __e; ++__i)
5988                 *__i /= __s;
5989             vector<double> __t(__p_.size() - 1);
5990             _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin());
5991             swap(__p_, __t);
5992         }
5993         else
5994         {
5995             __p_.clear();
5996             __p_.shrink_to_fit();
5997         }
5998     }
6001 template<class _IntType>
6002 vector<double>
6003 discrete_distribution<_IntType>::param_type::probabilities() const
6005     size_t __n = __p_.size();
6006     _VSTD::vector<double> __p(__n+1);
6007     _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin());
6008     if (__n > 0)
6009         __p[__n] = 1 - __p_[__n-1];
6010     else
6011         __p[0] = 1;
6012     return __p;
6015 template<class _IntType>
6016 template<class _URNG>
6017 _IntType
6018 discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
6020     uniform_real_distribution<double> __gen;
6021     return static_cast<_IntType>(
6022            _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) -
6023                                                               __p.__p_.begin());
6026 template <class _CharT, class _Traits, class _IT>
6027 basic_ostream<_CharT, _Traits>&
6028 operator<<(basic_ostream<_CharT, _Traits>& __os,
6029            const discrete_distribution<_IT>& __x)
6031     __save_flags<_CharT, _Traits> __lx(__os);
6032     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
6033                ios_base::scientific);
6034     _CharT __sp = __os.widen(' ');
6035     __os.fill(__sp);
6036     size_t __n = __x.__p_.__p_.size();
6037     __os << __n;
6038     for (size_t __i = 0; __i < __n; ++__i)
6039         __os << __sp << __x.__p_.__p_[__i];
6040     return __os;
6043 template <class _CharT, class _Traits, class _IT>
6044 basic_istream<_CharT, _Traits>&
6045 operator>>(basic_istream<_CharT, _Traits>& __is,
6046            discrete_distribution<_IT>& __x)
6048     __save_flags<_CharT, _Traits> __lx(__is);
6049     __is.flags(ios_base::dec | ios_base::skipws);
6050     size_t __n;
6051     __is >> __n;
6052     vector<double> __p(__n);
6053     for (size_t __i = 0; __i < __n; ++__i)
6054         __is >> __p[__i];
6055     if (!__is.fail())
6056         swap(__x.__p_.__p_, __p);
6057     return __is;
6060 // piecewise_constant_distribution
6062 template<class _RealType = double>
6063 class _LIBCPP_TYPE_VIS_ONLY piecewise_constant_distribution
6065 public:
6066     // types
6067     typedef _RealType result_type;
6069     class _LIBCPP_TYPE_VIS_ONLY param_type
6070     {
6071         vector<result_type> __b_;
6072         vector<result_type> __densities_;
6073         vector<result_type> __areas_;
6074     public:
6075         typedef piecewise_constant_distribution distribution_type;
6077         param_type();
6078         template<class _InputIteratorB, class _InputIteratorW>
6079             param_type(_InputIteratorB __fB, _InputIteratorB __lB,
6080                        _InputIteratorW __fW);
6081 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6082         template<class _UnaryOperation>
6083             param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
6084 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6085         template<class _UnaryOperation>
6086             param_type(size_t __nw, result_type __xmin, result_type __xmax,
6087                        _UnaryOperation __fw);
6088         param_type & operator=(const param_type& __rhs);
6090         _LIBCPP_INLINE_VISIBILITY
6091         vector<result_type> intervals() const {return __b_;}
6092         _LIBCPP_INLINE_VISIBILITY
6093         vector<result_type> densities() const {return __densities_;}
6095         friend _LIBCPP_INLINE_VISIBILITY
6096             bool operator==(const param_type& __x, const param_type& __y)
6097             {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
6098         friend _LIBCPP_INLINE_VISIBILITY
6099             bool operator!=(const param_type& __x, const param_type& __y)
6100             {return !(__x == __y);}
6102     private:
6103         void __init();
6105         friend class piecewise_constant_distribution;
6107         template <class _CharT, class _Traits, class _RT>
6108         friend
6109         basic_ostream<_CharT, _Traits>&
6110         operator<<(basic_ostream<_CharT, _Traits>& __os,
6111                    const piecewise_constant_distribution<_RT>& __x);
6113         template <class _CharT, class _Traits, class _RT>
6114         friend
6115         basic_istream<_CharT, _Traits>&
6116         operator>>(basic_istream<_CharT, _Traits>& __is,
6117                    piecewise_constant_distribution<_RT>& __x);
6118     };
6120 private:
6121     param_type __p_;
6123 public:
6124     // constructor and reset functions
6125     _LIBCPP_INLINE_VISIBILITY
6126     piecewise_constant_distribution() {}
6127     template<class _InputIteratorB, class _InputIteratorW>
6128         _LIBCPP_INLINE_VISIBILITY
6129         piecewise_constant_distribution(_InputIteratorB __fB,
6130                                         _InputIteratorB __lB,
6131                                         _InputIteratorW __fW)
6132         : __p_(__fB, __lB, __fW) {}
6134 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6135     template<class _UnaryOperation>
6136         _LIBCPP_INLINE_VISIBILITY
6137         piecewise_constant_distribution(initializer_list<result_type> __bl,
6138                                         _UnaryOperation __fw)
6139         : __p_(__bl, __fw) {}
6140 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6142     template<class _UnaryOperation>
6143         _LIBCPP_INLINE_VISIBILITY
6144         piecewise_constant_distribution(size_t __nw, result_type __xmin,
6145                                         result_type __xmax, _UnaryOperation __fw)
6146         : __p_(__nw, __xmin, __xmax, __fw) {}
6148     _LIBCPP_INLINE_VISIBILITY
6149     explicit piecewise_constant_distribution(const param_type& __p)
6150         : __p_(__p) {}
6152     _LIBCPP_INLINE_VISIBILITY
6153     void reset() {}
6155     // generating functions
6156     template<class _URNG>
6157         _LIBCPP_INLINE_VISIBILITY
6158         result_type operator()(_URNG& __g)
6159         {return (*this)(__g, __p_);}
6160     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
6162     // property functions
6163     _LIBCPP_INLINE_VISIBILITY
6164     vector<result_type> intervals() const {return __p_.intervals();}
6165     _LIBCPP_INLINE_VISIBILITY
6166     vector<result_type> densities() const {return __p_.densities();}
6168     _LIBCPP_INLINE_VISIBILITY
6169     param_type param() const {return __p_;}
6170     _LIBCPP_INLINE_VISIBILITY
6171     void param(const param_type& __p) {__p_ = __p;}
6173     _LIBCPP_INLINE_VISIBILITY
6174     result_type min() const {return __p_.__b_.front();}
6175     _LIBCPP_INLINE_VISIBILITY
6176     result_type max() const {return __p_.__b_.back();}
6178     friend _LIBCPP_INLINE_VISIBILITY
6179         bool operator==(const piecewise_constant_distribution& __x,
6180                         const piecewise_constant_distribution& __y)
6181         {return __x.__p_ == __y.__p_;}
6182     friend _LIBCPP_INLINE_VISIBILITY
6183         bool operator!=(const piecewise_constant_distribution& __x,
6184                            const piecewise_constant_distribution& __y)
6185         {return !(__x == __y);}
6187     template <class _CharT, class _Traits, class _RT>
6188     friend
6189     basic_ostream<_CharT, _Traits>&
6190     operator<<(basic_ostream<_CharT, _Traits>& __os,
6191                const piecewise_constant_distribution<_RT>& __x);
6193     template <class _CharT, class _Traits, class _RT>
6194     friend
6195     basic_istream<_CharT, _Traits>&
6196     operator>>(basic_istream<_CharT, _Traits>& __is,
6197                piecewise_constant_distribution<_RT>& __x);
6200 template<class _RealType>
6201 typename piecewise_constant_distribution<_RealType>::param_type &
6202 piecewise_constant_distribution<_RealType>::param_type::operator=
6203                                                        (const param_type& __rhs)
6205 //  These can throw
6206     __b_.reserve        (__rhs.__b_.size ());
6207     __densities_.reserve(__rhs.__densities_.size());
6208     __areas_.reserve    (__rhs.__areas_.size());
6210 //  These can not throw
6211     __b_         = __rhs.__b_;
6212     __densities_ = __rhs.__densities_;
6213     __areas_     =  __rhs.__areas_;
6214     return *this;
6217 template<class _RealType>
6218 void
6219 piecewise_constant_distribution<_RealType>::param_type::__init()
6221     // __densities_ contains non-normalized areas
6222     result_type __total_area = _VSTD::accumulate(__densities_.begin(),
6223                                                 __densities_.end(),
6224                                                 result_type());
6225     for (size_t __i = 0; __i < __densities_.size(); ++__i)
6226         __densities_[__i] /= __total_area;
6227     // __densities_ contains normalized areas
6228     __areas_.assign(__densities_.size(), result_type());
6229     _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1,
6230                                                           __areas_.begin() + 1);
6231     // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1]
6232     __densities_.back() = 1 - __areas_.back();  // correct round off error
6233     for (size_t __i = 0; __i < __densities_.size(); ++__i)
6234         __densities_[__i] /= (__b_[__i+1] - __b_[__i]);
6235     // __densities_ now contains __densities_
6238 template<class _RealType>
6239 piecewise_constant_distribution<_RealType>::param_type::param_type()
6240     : __b_(2),
6241       __densities_(1, 1.0),
6242       __areas_(1, 0.0)
6244     __b_[1] = 1;
6247 template<class _RealType>
6248 template<class _InputIteratorB, class _InputIteratorW>
6249 piecewise_constant_distribution<_RealType>::param_type::param_type(
6250         _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
6251     : __b_(__fB, __lB)
6253     if (__b_.size() < 2)
6254     {
6255         __b_.resize(2);
6256         __b_[0] = 0;
6257         __b_[1] = 1;
6258         __densities_.assign(1, 1.0);
6259         __areas_.assign(1, 0.0);
6260     }
6261     else
6262     {
6263         __densities_.reserve(__b_.size() - 1);
6264         for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW)
6265             __densities_.push_back(*__fW);
6266         __init();
6267     }
6270 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6272 template<class _RealType>
6273 template<class _UnaryOperation>
6274 piecewise_constant_distribution<_RealType>::param_type::param_type(
6275         initializer_list<result_type> __bl, _UnaryOperation __fw)
6276     : __b_(__bl.begin(), __bl.end())
6278     if (__b_.size() < 2)
6279     {
6280         __b_.resize(2);
6281         __b_[0] = 0;
6282         __b_[1] = 1;
6283         __densities_.assign(1, 1.0);
6284         __areas_.assign(1, 0.0);
6285     }
6286     else
6287     {
6288         __densities_.reserve(__b_.size() - 1);
6289         for (size_t __i = 0; __i < __b_.size() - 1; ++__i)
6290             __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5));
6291         __init();
6292     }
6295 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6297 template<class _RealType>
6298 template<class _UnaryOperation>
6299 piecewise_constant_distribution<_RealType>::param_type::param_type(
6300         size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
6301     : __b_(__nw == 0 ? 2 : __nw + 1)
6303     size_t __n = __b_.size() - 1;
6304     result_type __d = (__xmax - __xmin) / __n;
6305     __densities_.reserve(__n);
6306     for (size_t __i = 0; __i < __n; ++__i)
6307     {
6308         __b_[__i] = __xmin + __i * __d;
6309         __densities_.push_back(__fw(__b_[__i] + __d*.5));
6310     }
6311     __b_[__n] = __xmax;
6312     __init();
6315 template<class _RealType>
6316 template<class _URNG>
6317 _RealType
6318 piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
6320     typedef uniform_real_distribution<result_type> _Gen;
6321     result_type __u = _Gen()(__g);
6322     ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
6323                                       __u) - __p.__areas_.begin() - 1;
6324     return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k];
6327 template <class _CharT, class _Traits, class _RT>
6328 basic_ostream<_CharT, _Traits>&
6329 operator<<(basic_ostream<_CharT, _Traits>& __os,
6330            const piecewise_constant_distribution<_RT>& __x)
6332     __save_flags<_CharT, _Traits> __lx(__os);
6333     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
6334                ios_base::scientific);
6335     _CharT __sp = __os.widen(' ');
6336     __os.fill(__sp);
6337     size_t __n = __x.__p_.__b_.size();
6338     __os << __n;
6339     for (size_t __i = 0; __i < __n; ++__i)
6340         __os << __sp << __x.__p_.__b_[__i];
6341     __n = __x.__p_.__densities_.size();
6342     __os << __sp << __n;
6343     for (size_t __i = 0; __i < __n; ++__i)
6344         __os << __sp << __x.__p_.__densities_[__i];
6345     __n = __x.__p_.__areas_.size();
6346     __os << __sp << __n;
6347     for (size_t __i = 0; __i < __n; ++__i)
6348         __os << __sp << __x.__p_.__areas_[__i];
6349     return __os;
6352 template <class _CharT, class _Traits, class _RT>
6353 basic_istream<_CharT, _Traits>&
6354 operator>>(basic_istream<_CharT, _Traits>& __is,
6355            piecewise_constant_distribution<_RT>& __x)
6357     typedef piecewise_constant_distribution<_RT> _Eng;
6358     typedef typename _Eng::result_type result_type;
6359     __save_flags<_CharT, _Traits> __lx(__is);
6360     __is.flags(ios_base::dec | ios_base::skipws);
6361     size_t __n;
6362     __is >> __n;
6363     vector<result_type> __b(__n);
6364     for (size_t __i = 0; __i < __n; ++__i)
6365         __is >> __b[__i];
6366     __is >> __n;
6367     vector<result_type> __densities(__n);
6368     for (size_t __i = 0; __i < __n; ++__i)
6369         __is >> __densities[__i];
6370     __is >> __n;
6371     vector<result_type> __areas(__n);
6372     for (size_t __i = 0; __i < __n; ++__i)
6373         __is >> __areas[__i];
6374     if (!__is.fail())
6375     {
6376         swap(__x.__p_.__b_, __b);
6377         swap(__x.__p_.__densities_, __densities);
6378         swap(__x.__p_.__areas_, __areas);
6379     }
6380     return __is;
6383 // piecewise_linear_distribution
6385 template<class _RealType = double>
6386 class _LIBCPP_TYPE_VIS_ONLY piecewise_linear_distribution
6388 public:
6389     // types
6390     typedef _RealType result_type;
6392     class _LIBCPP_TYPE_VIS_ONLY param_type
6393     {
6394         vector<result_type> __b_;
6395         vector<result_type> __densities_;
6396         vector<result_type> __areas_;
6397     public:
6398         typedef piecewise_linear_distribution distribution_type;
6400         param_type();
6401         template<class _InputIteratorB, class _InputIteratorW>
6402             param_type(_InputIteratorB __fB, _InputIteratorB __lB,
6403                        _InputIteratorW __fW);
6404 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6405         template<class _UnaryOperation>
6406             param_type(initializer_list<result_type> __bl, _UnaryOperation __fw);
6407 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6408         template<class _UnaryOperation>
6409             param_type(size_t __nw, result_type __xmin, result_type __xmax,
6410                        _UnaryOperation __fw);
6411         param_type & operator=(const param_type& __rhs);
6412         
6413         _LIBCPP_INLINE_VISIBILITY
6414         vector<result_type> intervals() const {return __b_;}
6415         _LIBCPP_INLINE_VISIBILITY
6416         vector<result_type> densities() const {return __densities_;}
6418         friend _LIBCPP_INLINE_VISIBILITY
6419             bool operator==(const param_type& __x, const param_type& __y)
6420             {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;}
6421         friend _LIBCPP_INLINE_VISIBILITY
6422             bool operator!=(const param_type& __x, const param_type& __y)
6423             {return !(__x == __y);}
6425     private:
6426         void __init();
6428         friend class piecewise_linear_distribution;
6430         template <class _CharT, class _Traits, class _RT>
6431         friend
6432         basic_ostream<_CharT, _Traits>&
6433         operator<<(basic_ostream<_CharT, _Traits>& __os,
6434                    const piecewise_linear_distribution<_RT>& __x);
6436         template <class _CharT, class _Traits, class _RT>
6437         friend
6438         basic_istream<_CharT, _Traits>&
6439         operator>>(basic_istream<_CharT, _Traits>& __is,
6440                    piecewise_linear_distribution<_RT>& __x);
6441     };
6443 private:
6444     param_type __p_;
6446 public:
6447     // constructor and reset functions
6448     _LIBCPP_INLINE_VISIBILITY
6449     piecewise_linear_distribution() {}
6450     template<class _InputIteratorB, class _InputIteratorW>
6451         _LIBCPP_INLINE_VISIBILITY
6452         piecewise_linear_distribution(_InputIteratorB __fB,
6453                                       _InputIteratorB __lB,
6454                                       _InputIteratorW __fW)
6455         : __p_(__fB, __lB, __fW) {}
6457 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6458     template<class _UnaryOperation>
6459         _LIBCPP_INLINE_VISIBILITY
6460         piecewise_linear_distribution(initializer_list<result_type> __bl,
6461                                       _UnaryOperation __fw)
6462         : __p_(__bl, __fw) {}
6463 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6465     template<class _UnaryOperation>
6466         _LIBCPP_INLINE_VISIBILITY
6467         piecewise_linear_distribution(size_t __nw, result_type __xmin,
6468                                       result_type __xmax, _UnaryOperation __fw)
6469         : __p_(__nw, __xmin, __xmax, __fw) {}
6471     _LIBCPP_INLINE_VISIBILITY
6472     explicit piecewise_linear_distribution(const param_type& __p)
6473         : __p_(__p) {}
6475     _LIBCPP_INLINE_VISIBILITY
6476     void reset() {}
6478     // generating functions
6479     template<class _URNG>
6480         _LIBCPP_INLINE_VISIBILITY
6481         result_type operator()(_URNG& __g)
6482         {return (*this)(__g, __p_);}
6483     template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
6485     // property functions
6486     _LIBCPP_INLINE_VISIBILITY
6487     vector<result_type> intervals() const {return __p_.intervals();}
6488     _LIBCPP_INLINE_VISIBILITY
6489     vector<result_type> densities() const {return __p_.densities();}
6491     _LIBCPP_INLINE_VISIBILITY
6492     param_type param() const {return __p_;}
6493     _LIBCPP_INLINE_VISIBILITY
6494     void param(const param_type& __p) {__p_ = __p;}
6496     _LIBCPP_INLINE_VISIBILITY
6497     result_type min() const {return __p_.__b_.front();}
6498     _LIBCPP_INLINE_VISIBILITY
6499     result_type max() const {return __p_.__b_.back();}
6501     friend _LIBCPP_INLINE_VISIBILITY
6502         bool operator==(const piecewise_linear_distribution& __x,
6503                         const piecewise_linear_distribution& __y)
6504         {return __x.__p_ == __y.__p_;}
6505     friend _LIBCPP_INLINE_VISIBILITY
6506         bool operator!=(const piecewise_linear_distribution& __x,
6507                         const piecewise_linear_distribution& __y)
6508         {return !(__x == __y);}
6510     template <class _CharT, class _Traits, class _RT>
6511     friend
6512     basic_ostream<_CharT, _Traits>&
6513     operator<<(basic_ostream<_CharT, _Traits>& __os,
6514                const piecewise_linear_distribution<_RT>& __x);
6516     template <class _CharT, class _Traits, class _RT>
6517     friend
6518     basic_istream<_CharT, _Traits>&
6519     operator>>(basic_istream<_CharT, _Traits>& __is,
6520                piecewise_linear_distribution<_RT>& __x);
6523 template<class _RealType>
6524 typename piecewise_linear_distribution<_RealType>::param_type &
6525 piecewise_linear_distribution<_RealType>::param_type::operator=
6526                                                        (const param_type& __rhs)
6528 //  These can throw
6529     __b_.reserve        (__rhs.__b_.size ());
6530     __densities_.reserve(__rhs.__densities_.size());
6531     __areas_.reserve    (__rhs.__areas_.size());
6533 //  These can not throw
6534     __b_         = __rhs.__b_;
6535     __densities_ = __rhs.__densities_;
6536     __areas_     =  __rhs.__areas_;
6537     return *this;
6541 template<class _RealType>
6542 void
6543 piecewise_linear_distribution<_RealType>::param_type::__init()
6545     __areas_.assign(__densities_.size() - 1, result_type());
6546     result_type _Sp = 0;
6547     for (size_t __i = 0; __i < __areas_.size(); ++__i)
6548     {
6549         __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) *
6550                         (__b_[__i+1] - __b_[__i]) * .5;
6551         _Sp += __areas_[__i];
6552     }
6553     for (size_t __i = __areas_.size(); __i > 1;)
6554     {
6555         --__i;
6556         __areas_[__i] = __areas_[__i-1] / _Sp;
6557     }
6558     __areas_[0] = 0;
6559     for (size_t __i = 1; __i < __areas_.size(); ++__i)
6560         __areas_[__i] += __areas_[__i-1];
6561     for (size_t __i = 0; __i < __densities_.size(); ++__i)
6562         __densities_[__i] /= _Sp;
6565 template<class _RealType>
6566 piecewise_linear_distribution<_RealType>::param_type::param_type()
6567     : __b_(2),
6568       __densities_(2, 1.0),
6569       __areas_(1, 0.0)
6571     __b_[1] = 1;
6574 template<class _RealType>
6575 template<class _InputIteratorB, class _InputIteratorW>
6576 piecewise_linear_distribution<_RealType>::param_type::param_type(
6577         _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW)
6578     : __b_(__fB, __lB)
6580     if (__b_.size() < 2)
6581     {
6582         __b_.resize(2);
6583         __b_[0] = 0;
6584         __b_[1] = 1;
6585         __densities_.assign(2, 1.0);
6586         __areas_.assign(1, 0.0);
6587     }
6588     else
6589     {
6590         __densities_.reserve(__b_.size());
6591         for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW)
6592             __densities_.push_back(*__fW);
6593         __init();
6594     }
6597 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6599 template<class _RealType>
6600 template<class _UnaryOperation>
6601 piecewise_linear_distribution<_RealType>::param_type::param_type(
6602         initializer_list<result_type> __bl, _UnaryOperation __fw)
6603     : __b_(__bl.begin(), __bl.end())
6605     if (__b_.size() < 2)
6606     {
6607         __b_.resize(2);
6608         __b_[0] = 0;
6609         __b_[1] = 1;
6610         __densities_.assign(2, 1.0);
6611         __areas_.assign(1, 0.0);
6612     }
6613     else
6614     {
6615         __densities_.reserve(__b_.size());
6616         for (size_t __i = 0; __i < __b_.size(); ++__i)
6617             __densities_.push_back(__fw(__b_[__i]));
6618         __init();
6619     }
6622 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6624 template<class _RealType>
6625 template<class _UnaryOperation>
6626 piecewise_linear_distribution<_RealType>::param_type::param_type(
6627         size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw)
6628     : __b_(__nw == 0 ? 2 : __nw + 1)
6630     size_t __n = __b_.size() - 1;
6631     result_type __d = (__xmax - __xmin) / __n;
6632     __densities_.reserve(__b_.size());
6633     for (size_t __i = 0; __i < __n; ++__i)
6634     {
6635         __b_[__i] = __xmin + __i * __d;
6636         __densities_.push_back(__fw(__b_[__i]));
6637     }
6638     __b_[__n] = __xmax;
6639     __densities_.push_back(__fw(__b_[__n]));
6640     __init();
6643 template<class _RealType>
6644 template<class _URNG>
6645 _RealType
6646 piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
6648     typedef uniform_real_distribution<result_type> _Gen;
6649     result_type __u = _Gen()(__g);
6650     ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
6651                                       __u) - __p.__areas_.begin() - 1;
6652     __u -= __p.__areas_[__k];
6653     const result_type __dk = __p.__densities_[__k];
6654     const result_type __dk1 = __p.__densities_[__k+1];
6655     const result_type __deltad = __dk1 - __dk;
6656     const result_type __bk = __p.__b_[__k];
6657     if (__deltad == 0)
6658         return __u / __dk + __bk;
6659     const result_type __bk1 = __p.__b_[__k+1];
6660     const result_type __deltab = __bk1 - __bk;
6661     return (__bk * __dk1 - __bk1 * __dk +
6662         _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) /
6663         __deltad;
6666 template <class _CharT, class _Traits, class _RT>
6667 basic_ostream<_CharT, _Traits>&
6668 operator<<(basic_ostream<_CharT, _Traits>& __os,
6669            const piecewise_linear_distribution<_RT>& __x)
6671     __save_flags<_CharT, _Traits> __lx(__os);
6672     __os.flags(ios_base::dec | ios_base::left | ios_base::fixed |
6673                ios_base::scientific);
6674     _CharT __sp = __os.widen(' ');
6675     __os.fill(__sp);
6676     size_t __n = __x.__p_.__b_.size();
6677     __os << __n;
6678     for (size_t __i = 0; __i < __n; ++__i)
6679         __os << __sp << __x.__p_.__b_[__i];
6680     __n = __x.__p_.__densities_.size();
6681     __os << __sp << __n;
6682     for (size_t __i = 0; __i < __n; ++__i)
6683         __os << __sp << __x.__p_.__densities_[__i];
6684     __n = __x.__p_.__areas_.size();
6685     __os << __sp << __n;
6686     for (size_t __i = 0; __i < __n; ++__i)
6687         __os << __sp << __x.__p_.__areas_[__i];
6688     return __os;
6691 template <class _CharT, class _Traits, class _RT>
6692 basic_istream<_CharT, _Traits>&
6693 operator>>(basic_istream<_CharT, _Traits>& __is,
6694            piecewise_linear_distribution<_RT>& __x)
6696     typedef piecewise_linear_distribution<_RT> _Eng;
6697     typedef typename _Eng::result_type result_type;
6698     __save_flags<_CharT, _Traits> __lx(__is);
6699     __is.flags(ios_base::dec | ios_base::skipws);
6700     size_t __n;
6701     __is >> __n;
6702     vector<result_type> __b(__n);
6703     for (size_t __i = 0; __i < __n; ++__i)
6704         __is >> __b[__i];
6705     __is >> __n;
6706     vector<result_type> __densities(__n);
6707     for (size_t __i = 0; __i < __n; ++__i)
6708         __is >> __densities[__i];
6709     __is >> __n;
6710     vector<result_type> __areas(__n);
6711     for (size_t __i = 0; __i < __n; ++__i)
6712         __is >> __areas[__i];
6713     if (!__is.fail())
6714     {
6715         swap(__x.__p_.__b_, __b);
6716         swap(__x.__p_.__densities_, __densities);
6717         swap(__x.__p_.__areas_, __areas);
6718     }
6719     return __is;
6722 _LIBCPP_END_NAMESPACE_STD
6724 #endif  // _LIBCPP_RANDOM