35 namespace std _GLIBCXX_VISIBILITY(default)
37 _GLIBCXX_BEGIN_NAMESPACE_VERSION
50 template<
typename _Tp, _Tp __m, _Tp __a, _Tp __c>
52 _Mod<_Tp, __m, __a, __c, false, true>::
59 static const _Tp __q = __m / __a;
60 static const _Tp __r = __m % __a;
62 _Tp __t1 = __a * (__x % __q);
63 _Tp __t2 = __r * (__x / __q);
67 __x = __m - __t2 + __t1;
72 const _Tp __d = __m - __x;
81 template<
typename _InputIterator,
typename _OutputIterator,
84 __normalize(_InputIterator __first, _InputIterator __last,
85 _OutputIterator __result,
const _Tp& __factor)
87 for (; __first != __last; ++__first, ++__result)
88 *__result = *__first / __factor;
94 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
98 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
102 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
106 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
108 linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
114 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
119 if ((__detail::__mod<_UIntType, __m>(__c) == 0)
120 && (__detail::__mod<_UIntType, __m>(__s) == 0))
123 _M_x = __detail::__mod<_UIntType, __m>(__s);
129 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
130 template<
typename _Sseq>
134 -> _If_seed_seq<_Sseq>
138 const _UIntType __k = (__k0 + 31) / 32;
139 uint_least32_t __arr[__k + 3];
140 __q.generate(__arr + 0, __arr + __k + 3);
141 _UIntType __factor = 1u;
142 _UIntType __sum = 0u;
143 for (
size_t __j = 0; __j < __k; ++__j)
145 __sum += __arr[__j + 3] * __factor;
146 __factor *= __detail::_Shift<_UIntType, 32>::__value;
151 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
152 typename _CharT,
typename _Traits>
154 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
156 __a, __c, __m>& __lcr)
159 typedef typename __ostream_type::ios_base __ios_base;
161 const typename __ios_base::fmtflags __flags = __os.
flags();
162 const _CharT __fill = __os.fill();
164 __os.fill(__os.widen(
' '));
173 template<
typename _UIntType, _UIntType __a, _UIntType __c, _UIntType __m,
174 typename _CharT,
typename _Traits>
177 linear_congruential_engine<_UIntType, __a, __c, __m>& __lcr)
180 typedef typename __istream_type::ios_base __ios_base;
182 const typename __ios_base::fmtflags __flags = __is.
flags();
192 template<
typename _UIntType,
193 size_t __w,
size_t __n,
size_t __m,
size_t __r,
194 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
195 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
198 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
199 __s, __b, __t, __c, __l, __f>::word_size;
201 template<
typename _UIntType,
202 size_t __w,
size_t __n,
size_t __m,
size_t __r,
203 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
204 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
207 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
208 __s, __b, __t, __c, __l, __f>::state_size;
210 template<
typename _UIntType,
211 size_t __w,
size_t __n,
size_t __m,
size_t __r,
212 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
213 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
216 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
217 __s, __b, __t, __c, __l, __f>::shift_size;
219 template<
typename _UIntType,
220 size_t __w,
size_t __n,
size_t __m,
size_t __r,
221 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
222 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
225 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
226 __s, __b, __t, __c, __l, __f>::mask_bits;
228 template<
typename _UIntType,
229 size_t __w,
size_t __n,
size_t __m,
size_t __r,
230 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
231 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
234 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
235 __s, __b, __t, __c, __l, __f>::xor_mask;
237 template<
typename _UIntType,
238 size_t __w,
size_t __n,
size_t __m,
size_t __r,
239 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
240 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
243 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
244 __s, __b, __t, __c, __l, __f>::tempering_u;
246 template<
typename _UIntType,
247 size_t __w,
size_t __n,
size_t __m,
size_t __r,
248 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
249 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
252 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
253 __s, __b, __t, __c, __l, __f>::tempering_d;
255 template<
typename _UIntType,
256 size_t __w,
size_t __n,
size_t __m,
size_t __r,
257 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
258 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
261 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
262 __s, __b, __t, __c, __l, __f>::tempering_s;
264 template<
typename _UIntType,
265 size_t __w,
size_t __n,
size_t __m,
size_t __r,
266 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
267 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
270 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
271 __s, __b, __t, __c, __l, __f>::tempering_b;
273 template<
typename _UIntType,
274 size_t __w,
size_t __n,
size_t __m,
size_t __r,
275 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
276 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
279 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
280 __s, __b, __t, __c, __l, __f>::tempering_t;
282 template<
typename _UIntType,
283 size_t __w,
size_t __n,
size_t __m,
size_t __r,
284 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
285 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
288 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
289 __s, __b, __t, __c, __l, __f>::tempering_c;
291 template<
typename _UIntType,
292 size_t __w,
size_t __n,
size_t __m,
size_t __r,
293 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
294 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
297 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
298 __s, __b, __t, __c, __l, __f>::tempering_l;
300 template<
typename _UIntType,
301 size_t __w,
size_t __n,
size_t __m,
size_t __r,
302 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
303 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
306 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
307 __s, __b, __t, __c, __l, __f>::
308 initialization_multiplier;
310 template<
typename _UIntType,
311 size_t __w,
size_t __n,
size_t __m,
size_t __r,
312 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
313 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
316 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
317 __s, __b, __t, __c, __l, __f>::default_seed;
319 template<
typename _UIntType,
320 size_t __w,
size_t __n,
size_t __m,
size_t __r,
321 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
322 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
325 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
326 __s, __b, __t, __c, __l, __f>::
327 seed(result_type __sd)
329 _M_x[0] = __detail::__mod<_UIntType,
330 __detail::_Shift<_UIntType, __w>::__value>(__sd);
332 for (
size_t __i = 1; __i < state_size; ++__i)
334 _UIntType __x = _M_x[__i - 1];
335 __x ^= __x >> (__w - 2);
337 __x += __detail::__mod<_UIntType, __n>(__i);
338 _M_x[__i] = __detail::__mod<_UIntType,
339 __detail::_Shift<_UIntType, __w>::__value>(__x);
344 template<
typename _UIntType,
345 size_t __w,
size_t __n,
size_t __m,
size_t __r,
346 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
347 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
349 template<
typename _Sseq>
351 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
352 __s, __b, __t, __c, __l, __f>::
354 -> _If_seed_seq<_Sseq>
356 const _UIntType __upper_mask = (~_UIntType()) << __r;
357 const size_t __k = (__w + 31) / 32;
358 uint_least32_t __arr[__n * __k];
359 __q.generate(__arr + 0, __arr + __n * __k);
362 for (
size_t __i = 0; __i < state_size; ++__i)
364 _UIntType __factor = 1u;
365 _UIntType __sum = 0u;
366 for (
size_t __j = 0; __j < __k; ++__j)
368 __sum += __arr[__k * __i + __j] * __factor;
369 __factor *= __detail::_Shift<_UIntType, 32>::__value;
371 _M_x[__i] = __detail::__mod<_UIntType,
372 __detail::_Shift<_UIntType, __w>::__value>(__sum);
378 if ((_M_x[0] & __upper_mask) != 0u)
381 else if (_M_x[__i] != 0u)
386 _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value;
390 template<
typename _UIntType,
size_t __w,
391 size_t __n,
size_t __m,
size_t __r,
392 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
393 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
396 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
397 __s, __b, __t, __c, __l, __f>::
400 const _UIntType __upper_mask = (~_UIntType()) << __r;
401 const _UIntType __lower_mask = ~__upper_mask;
403 for (
size_t __k = 0; __k < (__n - __m); ++__k)
405 _UIntType __y = ((_M_x[__k] & __upper_mask)
406 | (_M_x[__k + 1] & __lower_mask));
407 _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
408 ^ ((__y & 0x01) ? __a : 0));
411 for (
size_t __k = (__n - __m); __k < (__n - 1); ++__k)
413 _UIntType __y = ((_M_x[__k] & __upper_mask)
414 | (_M_x[__k + 1] & __lower_mask));
415 _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1)
416 ^ ((__y & 0x01) ? __a : 0));
419 _UIntType __y = ((_M_x[__n - 1] & __upper_mask)
420 | (_M_x[0] & __lower_mask));
421 _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1)
422 ^ ((__y & 0x01) ? __a : 0));
426 template<
typename _UIntType,
size_t __w,
427 size_t __n,
size_t __m,
size_t __r,
428 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
429 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
432 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
433 __s, __b, __t, __c, __l, __f>::
434 discard(
unsigned long long __z)
436 while (__z > state_size - _M_p)
438 __z -= state_size - _M_p;
444 template<
typename _UIntType,
size_t __w,
445 size_t __n,
size_t __m,
size_t __r,
446 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
447 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
451 __s, __b, __t, __c, __l, __f>::result_type
453 __s, __b, __t, __c, __l, __f>::
457 if (_M_p >= state_size)
461 result_type __z = _M_x[_M_p++];
462 __z ^= (__z >> __u) & __d;
463 __z ^= (__z << __s) & __b;
464 __z ^= (__z << __t) & __c;
470 template<
typename _UIntType,
size_t __w,
471 size_t __n,
size_t __m,
size_t __r,
472 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
473 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
474 _UIntType __f,
typename _CharT,
typename _Traits>
476 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
477 const mersenne_twister_engine<_UIntType, __w, __n, __m,
478 __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __x)
481 typedef typename __ostream_type::ios_base __ios_base;
483 const typename __ios_base::fmtflags __flags = __os.
flags();
484 const _CharT __fill = __os.fill();
485 const _CharT __space = __os.widen(
' ');
489 for (
size_t __i = 0; __i < __n; ++__i)
490 __os << __x._M_x[__i] << __space;
498 template<
typename _UIntType,
size_t __w,
499 size_t __n,
size_t __m,
size_t __r,
500 _UIntType __a,
size_t __u, _UIntType __d,
size_t __s,
501 _UIntType __b,
size_t __t, _UIntType __c,
size_t __l,
502 _UIntType __f,
typename _CharT,
typename _Traits>
505 mersenne_twister_engine<_UIntType, __w, __n, __m,
506 __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>& __x)
509 typedef typename __istream_type::ios_base __ios_base;
511 const typename __ios_base::fmtflags __flags = __is.
flags();
514 for (
size_t __i = 0; __i < __n; ++__i)
515 __is >> __x._M_x[__i];
523 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
525 subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
527 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
529 subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag;
531 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
533 subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag;
535 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
537 subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed;
539 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
545 __lcg(__value == 0u ? default_seed : __value);
547 const size_t __n = (__w + 31) / 32;
549 for (
size_t __i = 0; __i < long_lag; ++__i)
551 _UIntType __sum = 0u;
552 _UIntType __factor = 1u;
553 for (
size_t __j = 0; __j < __n; ++__j)
555 __sum += __detail::__mod<uint_least32_t,
556 __detail::_Shift<uint_least32_t, 32>::__value>
557 (__lcg()) * __factor;
558 __factor *= __detail::_Shift<_UIntType, 32>::__value;
560 _M_x[__i] = __detail::__mod<_UIntType,
561 __detail::_Shift<_UIntType, __w>::__value>(__sum);
563 _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
567 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
568 template<
typename _Sseq>
572 -> _If_seed_seq<_Sseq>
574 const size_t __k = (__w + 31) / 32;
575 uint_least32_t __arr[__r * __k];
576 __q.generate(__arr + 0, __arr + __r * __k);
578 for (
size_t __i = 0; __i < long_lag; ++__i)
580 _UIntType __sum = 0u;
581 _UIntType __factor = 1u;
582 for (
size_t __j = 0; __j < __k; ++__j)
584 __sum += __arr[__k * __i + __j] * __factor;
585 __factor *= __detail::_Shift<_UIntType, 32>::__value;
587 _M_x[__i] = __detail::__mod<_UIntType,
588 __detail::_Shift<_UIntType, __w>::__value>(__sum);
590 _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
594 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r>
595 typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::
601 long __ps = _M_p - short_lag;
609 if (_M_x[__ps] >= _M_x[_M_p] + _M_carry)
611 __xi = _M_x[__ps] - _M_x[_M_p] - _M_carry;
616 __xi = (__detail::_Shift<_UIntType, __w>::__value
617 - _M_x[_M_p] - _M_carry + _M_x[__ps]);
623 if (++_M_p >= long_lag)
629 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r,
630 typename _CharT,
typename _Traits>
632 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
637 typedef typename __ostream_type::ios_base __ios_base;
639 const typename __ios_base::fmtflags __flags = __os.
flags();
640 const _CharT __fill = __os.fill();
641 const _CharT __space = __os.widen(
' ');
645 for (
size_t __i = 0; __i < __r; ++__i)
646 __os << __x._M_x[__i] << __space;
647 __os << __x._M_carry << __space << __x._M_p;
654 template<
typename _UIntType,
size_t __w,
size_t __s,
size_t __r,
655 typename _CharT,
typename _Traits>
658 subtract_with_carry_engine<_UIntType, __w, __s, __r>& __x)
661 typedef typename __istream_type::ios_base __ios_base;
663 const typename __ios_base::fmtflags __flags = __is.
flags();
666 for (
size_t __i = 0; __i < __r; ++__i)
667 __is >> __x._M_x[__i];
668 __is >> __x._M_carry;
676 template<
typename _RandomNumberEngine,
size_t __p,
size_t __r>
678 discard_block_engine<_RandomNumberEngine, __p, __r>::block_size;
680 template<
typename _RandomNumberEngine,
size_t __p,
size_t __r>
682 discard_block_engine<_RandomNumberEngine, __p, __r>::used_block;
684 template<
typename _RandomNumberEngine,
size_t __p,
size_t __r>
685 typename discard_block_engine<_RandomNumberEngine,
686 __p, __r>::result_type
690 if (_M_n >= used_block)
692 _M_b.discard(block_size - _M_n);
699 template<
typename _RandomNumberEngine,
size_t __p,
size_t __r,
700 typename _CharT,
typename _Traits>
702 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
707 typedef typename __ostream_type::ios_base __ios_base;
709 const typename __ios_base::fmtflags __flags = __os.
flags();
710 const _CharT __fill = __os.fill();
711 const _CharT __space = __os.widen(
' ');
715 __os << __x.base() << __space << __x._M_n;
722 template<
typename _RandomNumberEngine,
size_t __p,
size_t __r,
723 typename _CharT,
typename _Traits>
726 discard_block_engine<_RandomNumberEngine, __p, __r>& __x)
729 typedef typename __istream_type::ios_base __ios_base;
731 const typename __ios_base::fmtflags __flags = __is.
flags();
734 __is >> __x._M_b >> __x._M_n;
741 template<
typename _RandomNumberEngine,
size_t __w,
typename _UIntType>
742 typename independent_bits_engine<_RandomNumberEngine, __w, _UIntType>::
747 typedef typename _RandomNumberEngine::result_type _Eresult_type;
748 const _Eresult_type __r
750 ? _M_b.max() - _M_b.min() + 1 : 0);
752 const unsigned __m = __r ?
std::__lg(__r) : __edig;
759 __ctype __s0, __s1, __y0, __y1;
761 for (
size_t __i = 0; __i < 2; ++__i)
763 __n = (__w + __m - 1) / __m + __i;
764 __n0 = __n - __w % __n;
765 const unsigned __w0 = __w / __n;
771 __s0 = __ctype(1) << __w0;
779 __y0 = __s0 * (__r / __s0);
781 __y1 = __s1 * (__r / __s1);
783 if (__r - __y0 <= __y0 / __n)
791 for (
size_t __k = 0; __k < __n0; ++__k)
795 __u = _M_b() - _M_b.
min();
796 while (__y0 && __u >= __y0);
797 __sum = __s0 * __sum + (__s0 ? __u % __s0 : __u);
799 for (
size_t __k = __n0; __k < __n; ++__k)
803 __u = _M_b() - _M_b.min();
804 while (__y1 && __u >= __y1);
805 __sum = __s1 * __sum + (__s1 ? __u % __s1 : __u);
811 template<
typename _RandomNumberEngine,
size_t __k>
815 template<
typename _RandomNumberEngine,
size_t __k>
820 size_t __j = __k * ((_M_y - _M_b.min())
821 / (_M_b.max() - _M_b.min() + 1.0L));
828 template<
typename _RandomNumberEngine,
size_t __k,
829 typename _CharT,
typename _Traits>
831 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
835 typedef typename __ostream_type::ios_base __ios_base;
837 const typename __ios_base::fmtflags __flags = __os.
flags();
838 const _CharT __fill = __os.fill();
839 const _CharT __space = __os.widen(
' ');
844 for (
size_t __i = 0; __i < __k; ++__i)
845 __os << __space << __x._M_v[__i];
846 __os << __space << __x._M_y;
853 template<
typename _RandomNumberEngine,
size_t __k,
854 typename _CharT,
typename _Traits>
857 shuffle_order_engine<_RandomNumberEngine, __k>& __x)
860 typedef typename __istream_type::ios_base __ios_base;
862 const typename __ios_base::fmtflags __flags = __is.
flags();
866 for (
size_t __i = 0; __i < __k; ++__i)
867 __is >> __x._M_v[__i];
875 template<
typename _IntType,
typename _CharT,
typename _Traits>
877 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
881 typedef typename __ostream_type::ios_base __ios_base;
883 const typename __ios_base::fmtflags __flags = __os.
flags();
884 const _CharT __fill = __os.fill();
885 const _CharT __space = __os.widen(
' ');
889 __os << __x.a() << __space << __x.b();
896 template<
typename _IntType,
typename _CharT,
typename _Traits>
902 typedef typename __istream_type::ios_base __ios_base;
904 const typename __ios_base::fmtflags __flags = __is.
flags();
910 param_type(__a, __b));
917 template<
typename _RealType>
918 template<
typename _ForwardIterator,
919 typename _UniformRandomNumberGenerator>
921 uniform_real_distribution<_RealType>::
922 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
923 _UniformRandomNumberGenerator& __urng,
924 const param_type& __p)
926 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
927 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
929 auto __range = __p.b() - __p.a();
931 *__f++ = __aurng() * __range + __p.a();
934 template<
typename _RealType,
typename _CharT,
typename _Traits>
936 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
940 typedef typename __ostream_type::ios_base __ios_base;
942 const typename __ios_base::fmtflags __flags = __os.
flags();
943 const _CharT __fill = __os.fill();
945 const _CharT __space = __os.widen(
' ');
950 __os << __x.a() << __space << __x.b();
954 __os.precision(__precision);
958 template<
typename _RealType,
typename _CharT,
typename _Traits>
964 typedef typename __istream_type::ios_base __ios_base;
966 const typename __ios_base::fmtflags __flags = __is.
flags();
972 param_type(__a, __b));
979 template<
typename _ForwardIterator,
980 typename _UniformRandomNumberGenerator>
982 std::bernoulli_distribution::
983 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
984 _UniformRandomNumberGenerator& __urng,
985 const param_type& __p)
987 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
988 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
990 auto __limit = __p.p() * (__aurng.max() - __aurng.min());
993 *__f++ = (__aurng() - __aurng.min()) < __limit;
996 template<
typename _CharT,
typename _Traits>
998 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1002 typedef typename __ostream_type::ios_base __ios_base;
1004 const typename __ios_base::fmtflags __flags = __os.
flags();
1005 const _CharT __fill = __os.fill();
1008 __os.fill(__os.widen(
' '));
1013 __os.flags(__flags);
1015 __os.precision(__precision);
1020 template<
typename _IntType>
1021 template<
typename _UniformRandomNumberGenerator>
1024 operator()(_UniformRandomNumberGenerator& __urng,
1025 const param_type& __param)
1029 const double __naf =
1032 const double __thr =
1034 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1039 __cand = std::floor(
std::log(1.0 - __aurng()) / __param._M_log_1_p);
1040 while (__cand >= __thr);
1042 return result_type(__cand + __naf);
1045 template<
typename _IntType>
1046 template<
typename _ForwardIterator,
1047 typename _UniformRandomNumberGenerator>
1049 geometric_distribution<_IntType>::
1050 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
1051 _UniformRandomNumberGenerator& __urng,
1052 const param_type& __param)
1054 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1057 const double __naf =
1060 const double __thr =
1062 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1069 __cand = std::floor(
std::log(1.0 - __aurng())
1070 / __param._M_log_1_p);
1071 while (__cand >= __thr);
1073 *__f++ = __cand + __naf;
1077 template<
typename _IntType,
1078 typename _CharT,
typename _Traits>
1080 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1084 typedef typename __ostream_type::ios_base __ios_base;
1086 const typename __ios_base::fmtflags __flags = __os.
flags();
1087 const _CharT __fill = __os.fill();
1090 __os.fill(__os.widen(
' '));
1095 __os.flags(__flags);
1097 __os.precision(__precision);
1101 template<
typename _IntType,
1102 typename _CharT,
typename _Traits>
1108 typedef typename __istream_type::ios_base __ios_base;
1110 const typename __ios_base::fmtflags __flags = __is.
flags();
1117 __is.
flags(__flags);
1122 template<
typename _IntType>
1123 template<
typename _UniformRandomNumberGenerator>
1128 const double __y = _M_gd(__urng);
1132 return __poisson(__urng);
1135 template<
typename _IntType>
1136 template<
typename _UniformRandomNumberGenerator>
1139 operator()(_UniformRandomNumberGenerator& __urng,
1140 const param_type& __p)
1146 _M_gd(__urng, param_type(__p.k(), (1.0 - __p.p()) / __p.p()));
1149 return __poisson(__urng);
1152 template<
typename _IntType>
1153 template<
typename _ForwardIterator,
1154 typename _UniformRandomNumberGenerator>
1156 negative_binomial_distribution<_IntType>::
1157 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
1158 _UniformRandomNumberGenerator& __urng)
1160 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1163 const double __y = _M_gd(__urng);
1167 *__f++ = __poisson(__urng);
1171 template<
typename _IntType>
1172 template<
typename _ForwardIterator,
1173 typename _UniformRandomNumberGenerator>
1175 negative_binomial_distribution<_IntType>::
1176 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
1177 _UniformRandomNumberGenerator& __urng,
1178 const param_type& __p)
1180 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1182 __p2(__p.k(), (1.0 - __p.p()) / __p.p());
1186 const double __y = _M_gd(__urng, __p2);
1189 *__f++ = __poisson(__urng);
1193 template<
typename _IntType,
typename _CharT,
typename _Traits>
1195 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1196 const negative_binomial_distribution<_IntType>& __x)
1199 typedef typename __ostream_type::ios_base __ios_base;
1201 const typename __ios_base::fmtflags __flags = __os.
flags();
1202 const _CharT __fill = __os.
fill();
1204 const _CharT __space = __os.
widen(
' ');
1209 __os << __x.k() << __space << __x.p()
1210 << __space << __x._M_gd;
1212 __os.
flags(__flags);
1218 template<
typename _IntType,
typename _CharT,
typename _Traits>
1221 negative_binomial_distribution<_IntType>& __x)
1224 typedef typename __istream_type::ios_base __ios_base;
1226 const typename __ios_base::fmtflags __flags = __is.
flags();
1231 __is >> __k >> __p >> __x._M_gd;
1232 __x.param(
typename negative_binomial_distribution<_IntType>::
1233 param_type(__k, __p));
1235 __is.
flags(__flags);
1240 template<
typename _IntType>
1242 poisson_distribution<_IntType>::param_type::
1245 #if _GLIBCXX_USE_C99_MATH_TR1 1248 const double __m = std::floor(_M_mean);
1250 _M_lfm = std::lgamma(__m + 1);
1253 const double __pi_4 = 0.7853981633974483096156608458198757L;
1256 _M_d = std::round(std::max<double>(6.0,
std::min(__m, __dx)));
1257 const double __cx = 2 * __m + _M_d;
1262 _M_cb = 2 * __cx *
std::exp(-_M_d * _M_1cx * (1 + _M_d / 2))
1280 template<
typename _IntType>
1281 template<
typename _UniformRandomNumberGenerator>
1287 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1289 #if _GLIBCXX_USE_C99_MATH_TR1 1290 if (__param.mean() >= 12)
1295 const double __naf =
1297 const double __thr =
1300 const double __m = std::floor(__param.mean());
1302 const double __spi_2 = 1.2533141373155002512078826424055226L;
1303 const double __c1 = __param._M_sm * __spi_2;
1304 const double __c2 = __param._M_c2b + __c1;
1305 const double __c3 = __c2 + 1;
1306 const double __c4 = __c3 + 1;
1308 const double __178 = 0.0128205128205128205128205128205128L;
1310 const double __e178 = 1.0129030479320018583185514777512983L;
1311 const double __c5 = __c4 + __e178;
1312 const double __c = __param._M_cb + __c5;
1313 const double __2cx = 2 * (2 * __m + __param._M_d);
1315 bool __reject =
true;
1318 const double __u = __c * __aurng();
1319 const double __e = -
std::log(1.0 - __aurng());
1325 const double __n = _M_nd(__urng);
1326 const double __y = -
std::abs(__n) * __param._M_sm - 1;
1327 __x = std::floor(__y);
1328 __w = -__n * __n / 2;
1332 else if (__u <= __c2)
1334 const double __n = _M_nd(__urng);
1335 const double __y = 1 +
std::abs(__n) * __param._M_scx;
1336 __x = std::ceil(__y);
1337 __w = __y * (2 - __y) * __param._M_1cx;
1338 if (__x > __param._M_d)
1341 else if (__u <= __c3)
1345 else if (__u <= __c4)
1347 else if (__u <= __c5)
1355 const double __v = -
std::log(1.0 - __aurng());
1356 const double __y = __param._M_d
1357 + __v * __2cx / __param._M_d;
1358 __x = std::ceil(__y);
1359 __w = -__param._M_d * __param._M_1cx * (1 + __y / 2);
1362 __reject = (__w - __e - __x * __param._M_lm_thr
1363 > __param._M_lfm - std::lgamma(__x + __m + 1));
1365 __reject |= __x + __m >= __thr;
1375 double __prod = 1.0;
1379 __prod *= __aurng();
1382 while (__prod > __param._M_lm_thr);
1388 template<
typename _IntType>
1389 template<
typename _ForwardIterator,
1390 typename _UniformRandomNumberGenerator>
1394 _UniformRandomNumberGenerator& __urng,
1395 const param_type& __param)
1397 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1403 template<
typename _IntType,
1404 typename _CharT,
typename _Traits>
1406 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1407 const poisson_distribution<_IntType>& __x)
1410 typedef typename __ostream_type::ios_base __ios_base;
1412 const typename __ios_base::fmtflags __flags = __os.
flags();
1413 const _CharT __fill = __os.fill();
1415 const _CharT __space = __os.widen(
' ');
1420 __os << __x.mean() << __space << __x._M_nd;
1422 __os.flags(__flags);
1424 __os.precision(__precision);
1428 template<
typename _IntType,
1429 typename _CharT,
typename _Traits>
1432 poisson_distribution<_IntType>& __x)
1435 typedef typename __istream_type::ios_base __ios_base;
1437 const typename __ios_base::fmtflags __flags = __is.
flags();
1441 __is >> __mean >> __x._M_nd;
1442 __x.param(
typename poisson_distribution<_IntType>::param_type(__mean));
1444 __is.
flags(__flags);
1449 template<
typename _IntType>
1451 binomial_distribution<_IntType>::param_type::
1454 const double __p12 = _M_p <= 0.5 ? _M_p : 1.0 - _M_p;
1458 #if _GLIBCXX_USE_C99_MATH_TR1 1459 if (_M_t * __p12 >= 8)
1462 const double __np = std::floor(_M_t * __p12);
1463 const double __pa = __np / _M_t;
1464 const double __1p = 1 - __pa;
1466 const double __pi_4 = 0.7853981633974483096156608458198757L;
1467 const double __d1x =
1469 / (81 * __pi_4 * __1p)));
1470 _M_d1 = std::round(std::max<double>(1.0, __d1x));
1471 const double __d2x =
1473 / (__pi_4 * __pa)));
1474 _M_d2 = std::round(std::max<double>(1.0, __d2x));
1477 const double __spi_2 = 1.2533141373155002512078826424055226L;
1478 _M_s1 =
std::sqrt(__np * __1p) * (1 + _M_d1 / (4 * __np));
1479 _M_s2 =
std::sqrt(__np * __1p) * (1 + _M_d2 / (4 * _M_t * __1p));
1480 _M_c = 2 * _M_d1 / __np;
1481 _M_a1 =
std::exp(_M_c) * _M_s1 * __spi_2;
1482 const double __a12 = _M_a1 + _M_s2 * __spi_2;
1483 const double __s1s = _M_s1 * _M_s1;
1484 _M_a123 = __a12 + (
std::exp(_M_d1 / (_M_t * __1p))
1486 *
std::exp(-_M_d1 * _M_d1 / (2 * __s1s)));
1487 const double __s2s = _M_s2 * _M_s2;
1488 _M_s = (_M_a123 + 2 * __s2s / _M_d2
1489 *
std::exp(-_M_d2 * _M_d2 / (2 * __s2s)));
1490 _M_lf = (std::lgamma(__np + 1)
1491 + std::lgamma(_M_t - __np + 1));
1494 _M_q = -
std::log(1 - (__p12 - __pa) / __1p);
1501 template<
typename _IntType>
1502 template<
typename _UniformRandomNumberGenerator>
1504 binomial_distribution<_IntType>::
1505 _M_waiting(_UniformRandomNumberGenerator& __urng,
1506 _IntType __t,
double __q)
1510 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1517 const double __e = -
std::log(1.0 - __aurng());
1518 __sum += __e / (__t - __x);
1521 while (__sum <= __q);
1536 template<
typename _IntType>
1537 template<
typename _UniformRandomNumberGenerator>
1544 const _IntType __t = __param.t();
1545 const double __p = __param.p();
1546 const double __p12 = __p <= 0.5 ? __p : 1.0 - __p;
1547 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
1550 #if _GLIBCXX_USE_C99_MATH_TR1 1551 if (!__param._M_easy)
1556 const double __naf =
1558 const double __thr =
1561 const double __np = std::floor(__t * __p12);
1564 const double __spi_2 = 1.2533141373155002512078826424055226L;
1565 const double __a1 = __param._M_a1;
1566 const double __a12 = __a1 + __param._M_s2 * __spi_2;
1567 const double __a123 = __param._M_a123;
1568 const double __s1s = __param._M_s1 * __param._M_s1;
1569 const double __s2s = __param._M_s2 * __param._M_s2;
1574 const double __u = __param._M_s * __aurng();
1580 const double __n = _M_nd(__urng);
1581 const double __y = __param._M_s1 *
std::abs(__n);
1582 __reject = __y >= __param._M_d1;
1585 const double __e = -
std::log(1.0 - __aurng());
1586 __x = std::floor(__y);
1587 __v = -__e - __n * __n / 2 + __param._M_c;
1590 else if (__u <= __a12)
1592 const double __n = _M_nd(__urng);
1593 const double __y = __param._M_s2 *
std::abs(__n);
1594 __reject = __y >= __param._M_d2;
1597 const double __e = -
std::log(1.0 - __aurng());
1598 __x = std::floor(-__y);
1599 __v = -__e - __n * __n / 2;
1602 else if (__u <= __a123)
1604 const double __e1 = -
std::log(1.0 - __aurng());
1605 const double __e2 = -
std::log(1.0 - __aurng());
1607 const double __y = __param._M_d1
1608 + 2 * __s1s * __e1 / __param._M_d1;
1609 __x = std::floor(__y);
1610 __v = (-__e2 + __param._M_d1 * (1 / (__t - __np)
1611 -__y / (2 * __s1s)));
1616 const double __e1 = -
std::log(1.0 - __aurng());
1617 const double __e2 = -
std::log(1.0 - __aurng());
1619 const double __y = __param._M_d2
1620 + 2 * __s2s * __e1 / __param._M_d2;
1621 __x = std::floor(-__y);
1622 __v = -__e2 - __param._M_d2 * __y / (2 * __s2s);
1626 __reject = __reject || __x < -__np || __x > __t - __np;
1629 const double __lfx =
1630 std::lgamma(__np + __x + 1)
1631 + std::lgamma(__t - (__np + __x) + 1);
1632 __reject = __v > __param._M_lf - __lfx
1633 + __x * __param._M_lp1p;
1636 __reject |= __x + __np >= __thr;
1640 __x += __np + __naf;
1642 const _IntType __z = _M_waiting(__urng, __t - _IntType(__x),
1644 __ret = _IntType(__x) + __z;
1648 __ret = _M_waiting(__urng, __t, __param._M_q);
1651 __ret = __t - __ret;
1655 template<
typename _IntType>
1656 template<
typename _ForwardIterator,
1657 typename _UniformRandomNumberGenerator>
1661 _UniformRandomNumberGenerator& __urng,
1662 const param_type& __param)
1664 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1670 template<
typename _IntType,
1671 typename _CharT,
typename _Traits>
1673 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1674 const binomial_distribution<_IntType>& __x)
1677 typedef typename __ostream_type::ios_base __ios_base;
1679 const typename __ios_base::fmtflags __flags = __os.
flags();
1680 const _CharT __fill = __os.fill();
1682 const _CharT __space = __os.widen(
' ');
1687 __os << __x.t() << __space << __x.p()
1688 << __space << __x._M_nd;
1690 __os.flags(__flags);
1692 __os.precision(__precision);
1696 template<
typename _IntType,
1697 typename _CharT,
typename _Traits>
1700 binomial_distribution<_IntType>& __x)
1703 typedef typename __istream_type::ios_base __ios_base;
1705 const typename __ios_base::fmtflags __flags = __is.
flags();
1710 __is >> __t >> __p >> __x._M_nd;
1711 __x.param(
typename binomial_distribution<_IntType>::
1712 param_type(__t, __p));
1714 __is.
flags(__flags);
1719 template<
typename _RealType>
1720 template<
typename _ForwardIterator,
1721 typename _UniformRandomNumberGenerator>
1725 _UniformRandomNumberGenerator& __urng,
1726 const param_type& __p)
1728 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1729 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1735 template<
typename _RealType,
typename _CharT,
typename _Traits>
1737 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1741 typedef typename __ostream_type::ios_base __ios_base;
1743 const typename __ios_base::fmtflags __flags = __os.
flags();
1744 const _CharT __fill = __os.fill();
1747 __os.fill(__os.widen(
' '));
1750 __os << __x.lambda();
1752 __os.flags(__flags);
1754 __os.precision(__precision);
1758 template<
typename _RealType,
typename _CharT,
typename _Traits>
1764 typedef typename __istream_type::ios_base __ios_base;
1766 const typename __ios_base::fmtflags __flags = __is.
flags();
1772 param_type(__lambda));
1774 __is.
flags(__flags);
1785 template<
typename _RealType>
1786 template<
typename _UniformRandomNumberGenerator>
1790 const param_type& __param)
1793 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1796 if (_M_saved_available)
1798 _M_saved_available =
false;
1808 __r2 = __x * __x + __y * __y;
1810 while (__r2 > 1.0 || __r2 == 0.0);
1813 _M_saved = __x * __mult;
1814 _M_saved_available =
true;
1815 __ret = __y * __mult;
1818 __ret = __ret * __param.stddev() + __param.mean();
1822 template<
typename _RealType>
1823 template<
typename _ForwardIterator,
1824 typename _UniformRandomNumberGenerator>
1828 _UniformRandomNumberGenerator& __urng,
1829 const param_type& __param)
1831 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1836 if (_M_saved_available)
1838 _M_saved_available =
false;
1839 *__f++ = _M_saved * __param.stddev() + __param.mean();
1845 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
1848 while (__f + 1 < __t)
1855 __r2 = __x * __x + __y * __y;
1857 while (__r2 > 1.0 || __r2 == 0.0);
1860 *__f++ = __y * __mult * __param.stddev() + __param.mean();
1861 *__f++ = __x * __mult * __param.stddev() + __param.mean();
1871 __r2 = __x * __x + __y * __y;
1873 while (__r2 > 1.0 || __r2 == 0.0);
1876 _M_saved = __x * __mult;
1877 _M_saved_available =
true;
1878 *__f = __y * __mult * __param.stddev() + __param.mean();
1882 template<
typename _RealType>
1887 if (__d1._M_param == __d2._M_param
1888 && __d1._M_saved_available == __d2._M_saved_available)
1890 if (__d1._M_saved_available
1891 && __d1._M_saved == __d2._M_saved)
1893 else if(!__d1._M_saved_available)
1902 template<
typename _RealType,
typename _CharT,
typename _Traits>
1904 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1905 const normal_distribution<_RealType>& __x)
1908 typedef typename __ostream_type::ios_base __ios_base;
1910 const typename __ios_base::fmtflags __flags = __os.
flags();
1911 const _CharT __fill = __os.
fill();
1913 const _CharT __space = __os.
widen(
' ');
1918 __os << __x.mean() << __space << __x.stddev()
1919 << __space << __x._M_saved_available;
1920 if (__x._M_saved_available)
1921 __os << __space << __x._M_saved;
1923 __os.
flags(__flags);
1929 template<
typename _RealType,
typename _CharT,
typename _Traits>
1932 normal_distribution<_RealType>& __x)
1935 typedef typename __istream_type::ios_base __ios_base;
1937 const typename __ios_base::fmtflags __flags = __is.
flags();
1940 double __mean, __stddev;
1941 __is >> __mean >> __stddev
1942 >> __x._M_saved_available;
1943 if (__x._M_saved_available)
1944 __is >> __x._M_saved;
1945 __x.param(
typename normal_distribution<_RealType>::
1946 param_type(__mean, __stddev));
1948 __is.
flags(__flags);
1953 template<
typename _RealType>
1954 template<
typename _ForwardIterator,
1955 typename _UniformRandomNumberGenerator>
1957 lognormal_distribution<_RealType>::
1958 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
1959 _UniformRandomNumberGenerator& __urng,
1960 const param_type& __p)
1962 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1964 *__f++ =
std::exp(__p.s() * _M_nd(__urng) + __p.m());
1967 template<
typename _RealType,
typename _CharT,
typename _Traits>
1969 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
1970 const lognormal_distribution<_RealType>& __x)
1973 typedef typename __ostream_type::ios_base __ios_base;
1975 const typename __ios_base::fmtflags __flags = __os.
flags();
1976 const _CharT __fill = __os.
fill();
1978 const _CharT __space = __os.
widen(
' ');
1983 __os << __x.m() << __space << __x.s()
1984 << __space << __x._M_nd;
1986 __os.
flags(__flags);
1992 template<
typename _RealType,
typename _CharT,
typename _Traits>
1995 lognormal_distribution<_RealType>& __x)
1998 typedef typename __istream_type::ios_base __ios_base;
2000 const typename __ios_base::fmtflags __flags = __is.
flags();
2004 __is >> __m >> __s >> __x._M_nd;
2005 __x.param(
typename lognormal_distribution<_RealType>::
2006 param_type(__m, __s));
2008 __is.
flags(__flags);
2012 template<
typename _RealType>
2013 template<
typename _ForwardIterator,
2014 typename _UniformRandomNumberGenerator>
2018 _UniformRandomNumberGenerator& __urng)
2020 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2022 *__f++ = 2 * _M_gd(__urng);
2025 template<
typename _RealType>
2026 template<
typename _ForwardIterator,
2027 typename _UniformRandomNumberGenerator>
2031 _UniformRandomNumberGenerator& __urng,
2035 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2037 *__f++ = 2 * _M_gd(__urng, __p);
2040 template<
typename _RealType,
typename _CharT,
typename _Traits>
2042 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2043 const chi_squared_distribution<_RealType>& __x)
2046 typedef typename __ostream_type::ios_base __ios_base;
2048 const typename __ios_base::fmtflags __flags = __os.
flags();
2049 const _CharT __fill = __os.
fill();
2051 const _CharT __space = __os.
widen(
' ');
2056 __os << __x.n() << __space << __x._M_gd;
2058 __os.
flags(__flags);
2064 template<
typename _RealType,
typename _CharT,
typename _Traits>
2067 chi_squared_distribution<_RealType>& __x)
2070 typedef typename __istream_type::ios_base __ios_base;
2072 const typename __ios_base::fmtflags __flags = __is.
flags();
2076 __is >> __n >> __x._M_gd;
2077 __x.param(
typename chi_squared_distribution<_RealType>::
2080 __is.
flags(__flags);
2085 template<
typename _RealType>
2086 template<
typename _UniformRandomNumberGenerator>
2089 operator()(_UniformRandomNumberGenerator& __urng,
2090 const param_type& __p)
2092 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2099 const _RealType __pi = 3.1415926535897932384626433832795029L;
2100 return __p.a() + __p.b() *
std::tan(__pi * __u);
2103 template<
typename _RealType>
2104 template<
typename _ForwardIterator,
2105 typename _UniformRandomNumberGenerator>
2107 cauchy_distribution<_RealType>::
2108 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2109 _UniformRandomNumberGenerator& __urng,
2110 const param_type& __p)
2112 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2113 const _RealType __pi = 3.1415926535897932384626433832795029L;
2114 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2123 *__f++ = __p.a() + __p.b() *
std::tan(__pi * __u);
2127 template<
typename _RealType,
typename _CharT,
typename _Traits>
2129 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2133 typedef typename __ostream_type::ios_base __ios_base;
2135 const typename __ios_base::fmtflags __flags = __os.
flags();
2136 const _CharT __fill = __os.fill();
2138 const _CharT __space = __os.widen(
' ');
2143 __os << __x.a() << __space << __x.b();
2145 __os.flags(__flags);
2147 __os.precision(__precision);
2151 template<
typename _RealType,
typename _CharT,
typename _Traits>
2157 typedef typename __istream_type::ios_base __ios_base;
2159 const typename __ios_base::fmtflags __flags = __is.
flags();
2165 param_type(__a, __b));
2167 __is.
flags(__flags);
2172 template<
typename _RealType>
2173 template<
typename _ForwardIterator,
2174 typename _UniformRandomNumberGenerator>
2178 _UniformRandomNumberGenerator& __urng)
2180 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2182 *__f++ = ((_M_gd_x(__urng) * n()) / (_M_gd_y(__urng) * m()));
2185 template<
typename _RealType>
2186 template<
typename _ForwardIterator,
2187 typename _UniformRandomNumberGenerator>
2191 _UniformRandomNumberGenerator& __urng,
2192 const param_type& __p)
2194 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2197 param_type __p1(__p.m() / 2);
2198 param_type __p2(__p.n() / 2);
2200 *__f++ = ((_M_gd_x(__urng, __p1) * n())
2201 / (_M_gd_y(__urng, __p2) * m()));
2204 template<
typename _RealType,
typename _CharT,
typename _Traits>
2206 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2207 const fisher_f_distribution<_RealType>& __x)
2210 typedef typename __ostream_type::ios_base __ios_base;
2212 const typename __ios_base::fmtflags __flags = __os.
flags();
2213 const _CharT __fill = __os.
fill();
2215 const _CharT __space = __os.
widen(
' ');
2220 __os << __x.m() << __space << __x.n()
2221 << __space << __x._M_gd_x << __space << __x._M_gd_y;
2223 __os.
flags(__flags);
2229 template<
typename _RealType,
typename _CharT,
typename _Traits>
2232 fisher_f_distribution<_RealType>& __x)
2235 typedef typename __istream_type::ios_base __ios_base;
2237 const typename __ios_base::fmtflags __flags = __is.
flags();
2241 __is >> __m >> __n >> __x._M_gd_x >> __x._M_gd_y;
2242 __x.param(
typename fisher_f_distribution<_RealType>::
2243 param_type(__m, __n));
2245 __is.
flags(__flags);
2250 template<
typename _RealType>
2251 template<
typename _ForwardIterator,
2252 typename _UniformRandomNumberGenerator>
2256 _UniformRandomNumberGenerator& __urng)
2258 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2260 *__f++ = _M_nd(__urng) *
std::sqrt(n() / _M_gd(__urng));
2263 template<
typename _RealType>
2264 template<
typename _ForwardIterator,
2265 typename _UniformRandomNumberGenerator>
2269 _UniformRandomNumberGenerator& __urng,
2270 const param_type& __p)
2272 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2274 __p2(__p.n() / 2, 2);
2276 *__f++ = _M_nd(__urng) *
std::sqrt(__p.n() / _M_gd(__urng, __p2));
2279 template<
typename _RealType,
typename _CharT,
typename _Traits>
2281 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2282 const student_t_distribution<_RealType>& __x)
2285 typedef typename __ostream_type::ios_base __ios_base;
2287 const typename __ios_base::fmtflags __flags = __os.
flags();
2288 const _CharT __fill = __os.
fill();
2290 const _CharT __space = __os.
widen(
' ');
2295 __os << __x.n() << __space << __x._M_nd << __space << __x._M_gd;
2297 __os.
flags(__flags);
2303 template<
typename _RealType,
typename _CharT,
typename _Traits>
2306 student_t_distribution<_RealType>& __x)
2309 typedef typename __istream_type::ios_base __ios_base;
2311 const typename __ios_base::fmtflags __flags = __is.
flags();
2315 __is >> __n >> __x._M_nd >> __x._M_gd;
2316 __x.param(
typename student_t_distribution<_RealType>::param_type(__n));
2318 __is.
flags(__flags);
2323 template<
typename _RealType>
2325 gamma_distribution<_RealType>::param_type::
2328 _M_malpha = _M_alpha < 1.0 ? _M_alpha + _RealType(1.0) : _M_alpha;
2330 const _RealType __a1 = _M_malpha - _RealType(1.0) / _RealType(3.0);
2331 _M_a2 = _RealType(1.0) /
std::sqrt(_RealType(9.0) * __a1);
2339 template<
typename _RealType>
2340 template<
typename _UniformRandomNumberGenerator>
2344 const param_type& __param)
2346 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2351 - _RealType(1.0) / _RealType(3.0));
2357 __n = _M_nd(__urng);
2362 __v = __v * __v * __v;
2365 while (__u >
result_type(1.0) - 0.0331 * __n * __n * __n * __n
2366 && (
std::log(__u) > (0.5 * __n * __n + __a1
2369 if (__param.alpha() == __param._M_malpha)
2370 return __a1 * __v * __param.beta();
2378 * __a1 * __v * __param.beta());
2382 template<
typename _RealType>
2383 template<
typename _ForwardIterator,
2384 typename _UniformRandomNumberGenerator>
2388 _UniformRandomNumberGenerator& __urng,
2389 const param_type& __param)
2391 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2392 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2397 - _RealType(1.0) / _RealType(3.0));
2399 if (__param.alpha() == __param._M_malpha)
2406 __n = _M_nd(__urng);
2411 __v = __v * __v * __v;
2414 while (__u >
result_type(1.0) - 0.0331 * __n * __n * __n * __n
2415 && (
std::log(__u) > (0.5 * __n * __n + __a1
2418 *__f++ = __a1 * __v * __param.beta();
2427 __n = _M_nd(__urng);
2432 __v = __v * __v * __v;
2435 while (__u >
result_type(1.0) - 0.0331 * __n * __n * __n * __n
2436 && (
std::log(__u) > (0.5 * __n * __n + __a1
2444 * __a1 * __v * __param.beta());
2448 template<
typename _RealType,
typename _CharT,
typename _Traits>
2450 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2451 const gamma_distribution<_RealType>& __x)
2454 typedef typename __ostream_type::ios_base __ios_base;
2456 const typename __ios_base::fmtflags __flags = __os.
flags();
2457 const _CharT __fill = __os.
fill();
2459 const _CharT __space = __os.
widen(
' ');
2464 __os << __x.alpha() << __space << __x.beta()
2465 << __space << __x._M_nd;
2467 __os.
flags(__flags);
2473 template<
typename _RealType,
typename _CharT,
typename _Traits>
2476 gamma_distribution<_RealType>& __x)
2479 typedef typename __istream_type::ios_base __ios_base;
2481 const typename __ios_base::fmtflags __flags = __is.
flags();
2484 _RealType __alpha_val, __beta_val;
2485 __is >> __alpha_val >> __beta_val >> __x._M_nd;
2486 __x.param(
typename gamma_distribution<_RealType>::
2487 param_type(__alpha_val, __beta_val));
2489 __is.
flags(__flags);
2494 template<
typename _RealType>
2495 template<
typename _UniformRandomNumberGenerator>
2498 operator()(_UniformRandomNumberGenerator& __urng,
2499 const param_type& __p)
2501 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2507 template<
typename _RealType>
2508 template<
typename _ForwardIterator,
2509 typename _UniformRandomNumberGenerator>
2511 weibull_distribution<_RealType>::
2512 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2513 _UniformRandomNumberGenerator& __urng,
2514 const param_type& __p)
2516 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2517 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2526 template<
typename _RealType,
typename _CharT,
typename _Traits>
2528 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2532 typedef typename __ostream_type::ios_base __ios_base;
2534 const typename __ios_base::fmtflags __flags = __os.
flags();
2535 const _CharT __fill = __os.fill();
2537 const _CharT __space = __os.widen(
' ');
2542 __os << __x.a() << __space << __x.b();
2544 __os.flags(__flags);
2546 __os.precision(__precision);
2550 template<
typename _RealType,
typename _CharT,
typename _Traits>
2556 typedef typename __istream_type::ios_base __ios_base;
2558 const typename __ios_base::fmtflags __flags = __is.
flags();
2564 param_type(__a, __b));
2566 __is.
flags(__flags);
2571 template<
typename _RealType>
2572 template<
typename _UniformRandomNumberGenerator>
2575 operator()(_UniformRandomNumberGenerator& __urng,
2576 const param_type& __p)
2578 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2584 template<
typename _RealType>
2585 template<
typename _ForwardIterator,
2586 typename _UniformRandomNumberGenerator>
2588 extreme_value_distribution<_RealType>::
2589 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2590 _UniformRandomNumberGenerator& __urng,
2591 const param_type& __p)
2593 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2594 __detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
2602 template<
typename _RealType,
typename _CharT,
typename _Traits>
2604 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2608 typedef typename __ostream_type::ios_base __ios_base;
2610 const typename __ios_base::fmtflags __flags = __os.
flags();
2611 const _CharT __fill = __os.fill();
2613 const _CharT __space = __os.widen(
' ');
2618 __os << __x.a() << __space << __x.b();
2620 __os.flags(__flags);
2622 __os.precision(__precision);
2626 template<
typename _RealType,
typename _CharT,
typename _Traits>
2632 typedef typename __istream_type::ios_base __ios_base;
2634 const typename __ios_base::fmtflags __flags = __is.
flags();
2640 param_type(__a, __b));
2642 __is.
flags(__flags);
2647 template<
typename _IntType>
2649 discrete_distribution<_IntType>::param_type::
2652 if (_M_prob.size() < 2)
2659 _M_prob.end(), 0.0);
2661 __detail::__normalize(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
2664 _M_cp.reserve(_M_prob.size());
2668 _M_cp[_M_cp.size() - 1] = 1.0;
2671 template<
typename _IntType>
2672 template<
typename _Func>
2673 discrete_distribution<_IntType>::param_type::
2674 param_type(
size_t __nw,
double __xmin,
double __xmax, _Func __fw)
2675 : _M_prob(), _M_cp()
2677 const size_t __n = __nw == 0 ? 1 : __nw;
2678 const double __delta = (__xmax - __xmin) / __n;
2680 _M_prob.reserve(__n);
2681 for (
size_t __k = 0; __k < __nw; ++__k)
2682 _M_prob.push_back(__fw(__xmin + __k * __delta + 0.5 * __delta));
2687 template<
typename _IntType>
2688 template<
typename _UniformRandomNumberGenerator>
2689 typename discrete_distribution<_IntType>::result_type
2690 discrete_distribution<_IntType>::
2691 operator()(_UniformRandomNumberGenerator& __urng,
2692 const param_type& __param)
2694 if (__param._M_cp.empty())
2695 return result_type(0);
2697 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2700 const double __p = __aurng();
2702 __param._M_cp.end(), __p);
2704 return __pos - __param._M_cp.begin();
2707 template<
typename _IntType>
2708 template<
typename _ForwardIterator,
2709 typename _UniformRandomNumberGenerator>
2711 discrete_distribution<_IntType>::
2712 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2713 _UniformRandomNumberGenerator& __urng,
2714 const param_type& __param)
2716 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2718 if (__param._M_cp.empty())
2721 *__f++ = result_type(0);
2725 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2730 const double __p = __aurng();
2732 __param._M_cp.end(), __p);
2734 *__f++ = __pos - __param._M_cp.begin();
2738 template<
typename _IntType,
typename _CharT,
typename _Traits>
2740 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2741 const discrete_distribution<_IntType>& __x)
2744 typedef typename __ostream_type::ios_base __ios_base;
2746 const typename __ios_base::fmtflags __flags = __os.
flags();
2747 const _CharT __fill = __os.
fill();
2749 const _CharT __space = __os.
widen(
' ');
2755 __os << __prob.
size();
2756 for (
auto __dit = __prob.
begin(); __dit != __prob.
end(); ++__dit)
2757 __os << __space << *__dit;
2759 __os.
flags(__flags);
2765 template<
typename _IntType,
typename _CharT,
typename _Traits>
2768 discrete_distribution<_IntType>& __x)
2771 typedef typename __istream_type::ios_base __ios_base;
2773 const typename __ios_base::fmtflags __flags = __is.
flags();
2781 for (; __n != 0; --__n)
2788 __x.param(
typename discrete_distribution<_IntType>::
2789 param_type(__prob_vec.
begin(), __prob_vec.
end()));
2791 __is.
flags(__flags);
2796 template<
typename _RealType>
2798 piecewise_constant_distribution<_RealType>::param_type::
2801 if (_M_int.size() < 2
2802 || (_M_int.size() == 2
2803 && _M_int[0] == _RealType(0)
2804 && _M_int[1] == _RealType(1)))
2814 __detail::__normalize(_M_den.begin(), _M_den.end(), _M_den.begin(),
2817 _M_cp.reserve(_M_den.size());
2822 _M_cp[_M_cp.size() - 1] = 1.0;
2824 for (
size_t __k = 0; __k < _M_den.size(); ++__k)
2825 _M_den[__k] /= _M_int[__k + 1] - _M_int[__k];
2828 template<
typename _RealType>
2829 template<
typename _InputIteratorB,
typename _InputIteratorW>
2830 piecewise_constant_distribution<_RealType>::param_type::
2831 param_type(_InputIteratorB __bbegin,
2832 _InputIteratorB __bend,
2833 _InputIteratorW __wbegin)
2834 : _M_int(), _M_den(), _M_cp()
2836 if (__bbegin != __bend)
2840 _M_int.push_back(*__bbegin);
2842 if (__bbegin == __bend)
2845 _M_den.push_back(*__wbegin);
2853 template<
typename _RealType>
2854 template<
typename _Func>
2855 piecewise_constant_distribution<_RealType>::param_type::
2856 param_type(initializer_list<_RealType> __bl, _Func __fw)
2857 : _M_int(), _M_den(), _M_cp()
2859 _M_int.reserve(__bl.size());
2860 for (
auto __biter = __bl.begin(); __biter != __bl.end(); ++__biter)
2861 _M_int.push_back(*__biter);
2863 _M_den.reserve(_M_int.size() - 1);
2864 for (
size_t __k = 0; __k < _M_int.size() - 1; ++__k)
2865 _M_den.push_back(__fw(0.5 * (_M_int[__k + 1] + _M_int[__k])));
2870 template<
typename _RealType>
2871 template<
typename _Func>
2872 piecewise_constant_distribution<_RealType>::param_type::
2873 param_type(
size_t __nw, _RealType __xmin, _RealType __xmax, _Func __fw)
2874 : _M_int(), _M_den(), _M_cp()
2876 const size_t __n = __nw == 0 ? 1 : __nw;
2877 const _RealType __delta = (__xmax - __xmin) / __n;
2879 _M_int.reserve(__n + 1);
2880 for (
size_t __k = 0; __k <= __nw; ++__k)
2881 _M_int.push_back(__xmin + __k * __delta);
2883 _M_den.reserve(__n);
2884 for (
size_t __k = 0; __k < __nw; ++__k)
2885 _M_den.push_back(__fw(_M_int[__k] + 0.5 * __delta));
2890 template<
typename _RealType>
2891 template<
typename _UniformRandomNumberGenerator>
2892 typename piecewise_constant_distribution<_RealType>::result_type
2893 piecewise_constant_distribution<_RealType>::
2894 operator()(_UniformRandomNumberGenerator& __urng,
2895 const param_type& __param)
2897 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2900 const double __p = __aurng();
2901 if (__param._M_cp.empty())
2905 __param._M_cp.end(), __p);
2906 const size_t __i = __pos - __param._M_cp.begin();
2908 const double __pref = __i > 0 ? __param._M_cp[__i - 1] : 0.0;
2910 return __param._M_int[__i] + (__p - __pref) / __param._M_den[__i];
2913 template<
typename _RealType>
2914 template<
typename _ForwardIterator,
2915 typename _UniformRandomNumberGenerator>
2917 piecewise_constant_distribution<_RealType>::
2918 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
2919 _UniformRandomNumberGenerator& __urng,
2920 const param_type& __param)
2922 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2923 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
2926 if (__param._M_cp.empty())
2935 const double __p = __aurng();
2938 __param._M_cp.end(), __p);
2939 const size_t __i = __pos - __param._M_cp.begin();
2941 const double __pref = __i > 0 ? __param._M_cp[__i - 1] : 0.0;
2943 *__f++ = (__param._M_int[__i]
2944 + (__p - __pref) / __param._M_den[__i]);
2948 template<
typename _RealType,
typename _CharT,
typename _Traits>
2950 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
2951 const piecewise_constant_distribution<_RealType>& __x)
2954 typedef typename __ostream_type::ios_base __ios_base;
2956 const typename __ios_base::fmtflags __flags = __os.
flags();
2957 const _CharT __fill = __os.
fill();
2959 const _CharT __space = __os.
widen(
' ');
2965 __os << __int.
size() - 1;
2967 for (
auto __xit = __int.
begin(); __xit != __int.
end(); ++__xit)
2968 __os << __space << *__xit;
2971 for (
auto __dit = __den.
begin(); __dit != __den.
end(); ++__dit)
2972 __os << __space << *__dit;
2974 __os.
flags(__flags);
2980 template<
typename _RealType,
typename _CharT,
typename _Traits>
2983 piecewise_constant_distribution<_RealType>& __x)
2986 typedef typename __istream_type::ios_base __ios_base;
2988 const typename __ios_base::fmtflags __flags = __is.
flags();
2996 for (
size_t __i = 0; __i <= __n; ++__i)
3005 for (
size_t __i = 0; __i < __n; ++__i)
3012 __x.param(
typename piecewise_constant_distribution<_RealType>::
3013 param_type(__int_vec.
begin(), __int_vec.
end(), __den_vec.
begin()));
3015 __is.
flags(__flags);
3020 template<
typename _RealType>
3022 piecewise_linear_distribution<_RealType>::param_type::
3025 if (_M_int.size() < 2
3026 || (_M_int.size() == 2
3027 && _M_int[0] == _RealType(0)
3028 && _M_int[1] == _RealType(1)
3029 && _M_den[0] == _M_den[1]))
3037 _M_cp.reserve(_M_int.size() - 1);
3038 _M_m.reserve(_M_int.size() - 1);
3039 for (
size_t __k = 0; __k < _M_int.size() - 1; ++__k)
3041 const _RealType __delta = _M_int[__k + 1] - _M_int[__k];
3042 __sum += 0.5 * (_M_den[__k + 1] + _M_den[__k]) * __delta;
3043 _M_cp.push_back(__sum);
3044 _M_m.push_back((_M_den[__k + 1] - _M_den[__k]) / __delta);
3048 __detail::__normalize(_M_den.begin(), _M_den.end(), _M_den.begin(),
3051 __detail::__normalize(_M_cp.begin(), _M_cp.end(), _M_cp.begin(), __sum);
3053 __detail::__normalize(_M_m.begin(), _M_m.end(), _M_m.begin(), __sum);
3056 _M_cp[_M_cp.size() - 1] = 1.0;
3059 template<
typename _RealType>
3060 template<
typename _InputIteratorB,
typename _InputIteratorW>
3061 piecewise_linear_distribution<_RealType>::param_type::
3062 param_type(_InputIteratorB __bbegin,
3063 _InputIteratorB __bend,
3064 _InputIteratorW __wbegin)
3065 : _M_int(), _M_den(), _M_cp(), _M_m()
3067 for (; __bbegin != __bend; ++__bbegin, ++__wbegin)
3069 _M_int.push_back(*__bbegin);
3070 _M_den.push_back(*__wbegin);
3076 template<
typename _RealType>
3077 template<
typename _Func>
3078 piecewise_linear_distribution<_RealType>::param_type::
3079 param_type(initializer_list<_RealType> __bl, _Func __fw)
3080 : _M_int(), _M_den(), _M_cp(), _M_m()
3082 _M_int.reserve(__bl.size());
3083 _M_den.reserve(__bl.size());
3084 for (
auto __biter = __bl.begin(); __biter != __bl.end(); ++__biter)
3086 _M_int.push_back(*__biter);
3087 _M_den.push_back(__fw(*__biter));
3093 template<
typename _RealType>
3094 template<
typename _Func>
3095 piecewise_linear_distribution<_RealType>::param_type::
3096 param_type(
size_t __nw, _RealType __xmin, _RealType __xmax, _Func __fw)
3097 : _M_int(), _M_den(), _M_cp(), _M_m()
3099 const size_t __n = __nw == 0 ? 1 : __nw;
3100 const _RealType __delta = (__xmax - __xmin) / __n;
3102 _M_int.reserve(__n + 1);
3103 _M_den.reserve(__n + 1);
3104 for (
size_t __k = 0; __k <= __nw; ++__k)
3106 _M_int.push_back(__xmin + __k * __delta);
3107 _M_den.push_back(__fw(_M_int[__k] + __delta));
3113 template<
typename _RealType>
3114 template<
typename _UniformRandomNumberGenerator>
3115 typename piecewise_linear_distribution<_RealType>::result_type
3116 piecewise_linear_distribution<_RealType>::
3117 operator()(_UniformRandomNumberGenerator& __urng,
3118 const param_type& __param)
3120 __detail::_Adaptor<_UniformRandomNumberGenerator, double>
3123 const double __p = __aurng();
3124 if (__param._M_cp.empty())
3128 __param._M_cp.end(), __p);
3129 const size_t __i = __pos - __param._M_cp.begin();
3131 const double __pref = __i > 0 ? __param._M_cp[__i - 1] : 0.0;
3133 const double __a = 0.5 * __param._M_m[__i];
3134 const double __b = __param._M_den[__i];
3135 const double __cm = __p - __pref;
3137 _RealType __x = __param._M_int[__i];
3142 const double __d = __b * __b + 4.0 * __a * __cm;
3143 __x += 0.5 * (
std::sqrt(__d) - __b) / __a;
3149 template<
typename _RealType>
3150 template<
typename _ForwardIterator,
3151 typename _UniformRandomNumberGenerator>
3153 piecewise_linear_distribution<_RealType>::
3154 __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
3155 _UniformRandomNumberGenerator& __urng,
3156 const param_type& __param)
3158 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3161 *__f++ = this->operator()(__urng, __param);
3164 template<
typename _RealType,
typename _CharT,
typename _Traits>
3166 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
3167 const piecewise_linear_distribution<_RealType>& __x)
3170 typedef typename __ostream_type::ios_base __ios_base;
3172 const typename __ios_base::fmtflags __flags = __os.
flags();
3173 const _CharT __fill = __os.
fill();
3175 const _CharT __space = __os.
widen(
' ');
3181 __os << __int.
size() - 1;
3183 for (
auto __xit = __int.
begin(); __xit != __int.
end(); ++__xit)
3184 __os << __space << *__xit;
3187 for (
auto __dit = __den.
begin(); __dit != __den.
end(); ++__dit)
3188 __os << __space << *__dit;
3190 __os.
flags(__flags);
3196 template<
typename _RealType,
typename _CharT,
typename _Traits>
3199 piecewise_linear_distribution<_RealType>& __x)
3202 typedef typename __istream_type::ios_base __ios_base;
3204 const typename __ios_base::fmtflags __flags = __is.
flags();
3212 for (
size_t __i = 0; __i <= __n; ++__i)
3221 for (
size_t __i = 0; __i <= __n; ++__i)
3228 __x.param(
typename piecewise_linear_distribution<_RealType>::
3229 param_type(__int_vec.
begin(), __int_vec.
end(), __den_vec.
begin()));
3231 __is.
flags(__flags);
3236 template<
typename _IntType>
3239 for (
auto __iter = __il.begin(); __iter != __il.end(); ++__iter)
3240 _M_v.push_back(__detail::__mod<result_type,
3241 __detail::_Shift<result_type, 32>::__value>(*__iter));
3244 template<
typename _InputIterator>
3245 seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end)
3247 for (_InputIterator __iter = __begin; __iter != __end; ++__iter)
3248 _M_v.push_back(__detail::__mod<result_type,
3249 __detail::_Shift<result_type, 32>::__value>(*__iter));
3252 template<
typename _RandomAccessIterator>
3254 seed_seq::generate(_RandomAccessIterator __begin,
3255 _RandomAccessIterator __end)
3257 typedef typename iterator_traits<_RandomAccessIterator>::value_type
3260 if (__begin == __end)
3263 std::fill(__begin, __end, _Type(0x8b8b8b8bu));
3265 const size_t __n = __end - __begin;
3266 const size_t __s = _M_v.size();
3267 const size_t __t = (__n >= 623) ? 11
3272 const size_t __p = (__n - __t) / 2;
3273 const size_t __q = __p + __t;
3274 const size_t __m =
std::max(
size_t(__s + 1), __n);
3276 for (
size_t __k = 0; __k < __m; ++__k)
3278 _Type __arg = (__begin[__k % __n]
3279 ^ __begin[(__k + __p) % __n]
3280 ^ __begin[(__k - 1) % __n]);
3281 _Type __r1 = __arg ^ (__arg >> 27);
3282 __r1 = __detail::__mod<_Type,
3283 __detail::_Shift<_Type, 32>::__value>(1664525u * __r1);
3287 else if (__k <= __s)
3288 __r2 += __k % __n + _M_v[__k - 1];
3291 __r2 = __detail::__mod<_Type,
3292 __detail::_Shift<_Type, 32>::__value>(__r2);
3293 __begin[(__k + __p) % __n] += __r1;
3294 __begin[(__k + __q) % __n] += __r2;
3295 __begin[__k % __n] = __r2;
3298 for (
size_t __k = __m; __k < __m + __n; ++__k)
3300 _Type __arg = (__begin[__k % __n]
3301 + __begin[(__k + __p) % __n]
3302 + __begin[(__k - 1) % __n]);
3303 _Type __r3 = __arg ^ (__arg >> 27);
3304 __r3 = __detail::__mod<_Type,
3305 __detail::_Shift<_Type, 32>::__value>(1566083941u * __r3);
3306 _Type __r4 = __r3 - __k % __n;
3307 __r4 = __detail::__mod<_Type,
3308 __detail::_Shift<_Type, 32>::__value>(__r4);
3309 __begin[(__k + __p) % __n] ^= __r3;
3310 __begin[(__k + __q) % __n] ^= __r4;
3311 __begin[__k % __n] = __r4;
3315 template<
typename _RealType,
size_t __bits,
3316 typename _UniformRandomNumberGenerator>
3321 "template argument must be a floating point type");
3326 const long double __r =
static_cast<long double>(__urng.max())
3327 - static_cast<long double>(__urng.min()) + 1.0L;
3329 const size_t __m = std::max<size_t>(1UL,
3330 (__b + __log2r - 1UL) / __log2r);
3332 _RealType __sum = _RealType(0);
3333 _RealType __tmp = _RealType(1);
3334 for (
size_t __k = __m; __k != 0; --__k)
3336 __sum += _RealType(__urng() - __urng.min()) * __tmp;
3339 __ret = __sum / __tmp;
3340 if (__builtin_expect(__ret >= _RealType(1), 0))
3342 #if _GLIBCXX_USE_C99_MATH_TR1 3343 __ret = std::nextafter(_RealType(1), _RealType(0));
3345 __ret = _RealType(1)
3352 _GLIBCXX_END_NAMESPACE_VERSION
An exponential continuous distribution for random numbers.
ios_base & left(ios_base &__base)
Calls base.setf(ios_base::left, ios_base::adjustfield).
static constexpr result_type multiplier
_Tp abs(const complex< _Tp > &)
Return magnitude of z.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
static constexpr result_type increment
Template class basic_istream.
static constexpr _Tp min() noexcept
A discrete geometric random number distribution.
constexpr int __lg(int __n)
This is a helper function for the sort routines and for random.tcc.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
A model of a linear congruential random number generator.
complex< _Tp > log(const complex< _Tp > &)
Return complex natural logarithm of z.
static constexpr _Tp epsilon() noexcept
A gamma continuous distribution for random numbers.
streamsize precision() const
Flags access.
A weibull_distribution random number distribution.
char_type widen(char __c) const
Widens characters.
_ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__val)
Finds the first position in which val could be inserted without changing the ordering.
iterator begin() noexcept
complex< _Tp > tan(const complex< _Tp > &)
Return complex tangent of z.
param_type param() const
Returns the parameter set of the distribution.
Uniform continuous distribution for random numbers.
param_type param() const
Returns the parameter set of the distribution.
Produces random numbers by combining random numbers from some base engine to produce random numbers w...
Uniform discrete distribution for random numbers. A discrete random distribution on the range with e...
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
Accumulate values in a range.
complex< _Tp > pow(const complex< _Tp > &, int)
Return x to the y'th power.
A chi_squared_distribution random number distribution.
void clear(iostate __state=goodbit)
[Re]sets the error state.
A extreme_value_distribution random number distribution.
ISO C++ entities toplevel namespace is std.
A normal continuous distribution for random numbers.
Properties of fundamental types.
A cauchy_distribution random number distribution.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
result_type operator()()
Gets the next value in the generated random number sequence.
back_insert_iterator< _Container > back_inserter(_Container &__x)
result_type operator()()
Gets the next random number in the sequence.
param_type param() const
Returns the parameter set of the distribution.
result_type operator()()
Gets the next value in the generated random number sequence.
friend std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, std::poisson_distribution< _IntType1 > &__x)
Extracts a poisson_distribution random number distribution __x from the input stream __is...
_GLIBCXX14_CONSTEXPR const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
void push_back(const value_type &__x)
Add data to the end of the vector.
fmtflags flags() const
Access to format flags.
Template class basic_ostream.
param_type param() const
Returns the parameter set of the distribution.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
static constexpr _Tp max() noexcept
_OutputIterator partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
Return list of partial sums.
friend bool operator==(const poisson_distribution &__d1, const poisson_distribution &__d2)
Return true if two Poisson distributions have the same parameters and the sequences that would be gen...
param_type param() const
Returns the parameter set of the distribution.
A student_t_distribution random number distribution.
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, bitset< _Nb > &__x)
Global I/O operators for bitsets.
param_type param() const
Returns the parameter set of the distribution.
void seed(result_type __sd=default_seed)
Seeds the initial state of the random number generator.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
char_type fill() const
Retrieves the empty character.
_RealType generate_canonical(_UniformRandomNumberGenerator &__g)
A function template for converting the output of a (integral) uniform random number generator to a fl...
ios_base & scientific(ios_base &__base)
Calls base.setf(ios_base::scientific, ios_base::floatfield).
size_type size() const noexcept
ios_base & dec(ios_base &__base)
Calls base.setf(ios_base::dec, ios_base::basefield).
The Marsaglia-Zaman generator.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes.
_RandomNumberEngine::result_type result_type
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
A discrete Poisson random number distribution.
static constexpr result_type modulus
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
void seed(result_type __s=default_seed)
Reseeds the linear_congruential_engine random number generator engine sequence to the seed __s...
A Bernoulli random number distribution.
void reserve(size_type __n)
Attempt to preallocate enough memory for specified number of elements.
param_type param() const
Returns the parameter set of the distribution.
ios_base & fixed(ios_base &__base)
Calls base.setf(ios_base::fixed, ios_base::floatfield).
A discrete binomial random number distribution.
_GLIBCXX14_CONSTEXPR const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
ios_base & skipws(ios_base &__base)
Calls base.setf(ios_base::skipws).
complex< _Tp > sqrt(const complex< _Tp > &)
Return complex square root of z.
result_type operator()(_UniformRandomNumberGenerator &__urng)
Generating functions.
complex< _Tp > exp(const complex< _Tp > &)
Return complex base e exponential of z.
A fisher_f_distribution random number distribution.