From 3ad39e9878310e5317ee73c9b353c1e2c1c5c4ee Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sat, 11 Jul 2026 22:48:30 +0800 Subject: lib: establish Zircon libc++ and KTL foundation --- third_party/libcxx/include/c++/v1/random | 1746 ++++++++++++++++++++++++++++++ 1 file changed, 1746 insertions(+) create mode 100644 third_party/libcxx/include/c++/v1/random (limited to 'third_party/libcxx/include/c++/v1/random') diff --git a/third_party/libcxx/include/c++/v1/random b/third_party/libcxx/include/c++/v1/random new file mode 100644 index 0000000..a2fc2bd --- /dev/null +++ b/third_party/libcxx/include/c++/v1/random @@ -0,0 +1,1746 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_RANDOM +#define _LIBCPP_RANDOM + +/* + random synopsis + +#include + +namespace std +{ +// [rand.req.urng], uniform random bit generator requirements +template +concept uniform_random_bit_generator = see below; // C++20 + +// Engines + +template +class linear_congruential_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr result_type multiplier = a; + static constexpr result_type increment = c; + static constexpr result_type modulus = m; + static constexpr result_type min() { return c == 0u ? 1u: 0u;} + static constexpr result_type max() { return m - 1u;} + static constexpr result_type default_seed = 1u; + + // constructors and seeding functions + explicit linear_congruential_engine(result_type s = default_seed); // before C++20 + linear_congruential_engine() : linear_congruential_engine(default_seed) {} // C++20 + explicit linear_congruential_engine(result_type s); // C++20 + template explicit linear_congruential_engine(Sseq& q); + void seed(result_type s = default_seed); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template +bool +operator==(const linear_congruential_engine& x, + const linear_congruential_engine& y); + +template +bool +operator!=(const linear_congruential_engine& x, + const linear_congruential_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const linear_congruential_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + linear_congruential_engine& x); + +template +class mersenne_twister_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr size_t word_size = w; + static constexpr size_t state_size = n; + static constexpr size_t shift_size = m; + static constexpr size_t mask_bits = r; + static constexpr result_type xor_mask = a; + static constexpr size_t tempering_u = u; + static constexpr result_type tempering_d = d; + static constexpr size_t tempering_s = s; + static constexpr result_type tempering_b = b; + static constexpr size_t tempering_t = t; + static constexpr result_type tempering_c = c; + static constexpr size_t tempering_l = l; + static constexpr result_type initialization_multiplier = f; + static constexpr result_type min () { return 0; } + static constexpr result_type max() { return 2^w - 1; } + static constexpr result_type default_seed = 5489u; + + // constructors and seeding functions + explicit mersenne_twister_engine(result_type s = default_seed); // before C++20 + mersenne_twister_engine() : mersenne_twister_engine(default_seed) {} // C++20 + explicit mersenne_twister_engine(result_type s); // C++20 + template explicit mersenne_twister_engine(Sseq& q); + void seed(result_type value = default_seed); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template +bool +operator==( + const mersenne_twister_engine& x, + const mersenne_twister_engine& y); + +template +bool +operator!=( + const mersenne_twister_engine& x, + const mersenne_twister_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const mersenne_twister_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + mersenne_twister_engine& x); + +template +class subtract_with_carry_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr size_t word_size = w; + static constexpr size_t short_lag = s; + static constexpr size_t long_lag = r; + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return m-1; } + static constexpr result_type default_seed = 19780503u; + + // constructors and seeding functions + explicit subtract_with_carry_engine(result_type value = default_seed); // before C++20 + subtract_with_carry_engine() : subtract_with_carry_engine(default_seed) {} // C++20 + explicit subtract_with_carry_engine(result_type value); // C++20 + template explicit subtract_with_carry_engine(Sseq& q); + void seed(result_type value = default_seed); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template +bool +operator==( + const subtract_with_carry_engine& x, + const subtract_with_carry_engine& y); + +template +bool +operator!=( + const subtract_with_carry_engine& x, + const subtract_with_carry_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const subtract_with_carry_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + subtract_with_carry_engine& x); + +template +class discard_block_engine +{ +public: + // types + typedef typename Engine::result_type result_type; + + // engine characteristics + static constexpr size_t block_size = p; + static constexpr size_t used_block = r; + static constexpr result_type min() { return Engine::min(); } + static constexpr result_type max() { return Engine::max(); } + + // constructors and seeding functions + discard_block_engine(); + explicit discard_block_engine(const Engine& e); + explicit discard_block_engine(Engine&& e); + explicit discard_block_engine(result_type s); + template explicit discard_block_engine(Sseq& q); + void seed(); + void seed(result_type s); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); + + // property functions + const Engine& base() const noexcept; +}; + +template +bool +operator==( + const discard_block_engine& x, + const discard_block_engine& y); + +template +bool +operator!=( + const discard_block_engine& x, + const discard_block_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const discard_block_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + discard_block_engine& x); + +template +class independent_bits_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return 2^w - 1; } + + // constructors and seeding functions + independent_bits_engine(); + explicit independent_bits_engine(const Engine& e); + explicit independent_bits_engine(Engine&& e); + explicit independent_bits_engine(result_type s); + template explicit independent_bits_engine(Sseq& q); + void seed(); + void seed(result_type s); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); void discard(unsigned long long z); + + // property functions + const Engine& base() const noexcept; +}; + +template +bool +operator==( + const independent_bits_engine& x, + const independent_bits_engine& y); + +template +bool +operator!=( + const independent_bits_engine& x, + const independent_bits_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const independent_bits_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + independent_bits_engine& x); + +template +class shuffle_order_engine +{ +public: + // types + typedef typename Engine::result_type result_type; + + // engine characteristics + static constexpr size_t table_size = k; + static constexpr result_type min() { return Engine::min; } + static constexpr result_type max() { return Engine::max; } + + // constructors and seeding functions + shuffle_order_engine(); + explicit shuffle_order_engine(const Engine& e); + explicit shuffle_order_engine(Engine&& e); + explicit shuffle_order_engine(result_type s); + template explicit shuffle_order_engine(Sseq& q); + void seed(); + void seed(result_type s); + template void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); + + // property functions + const Engine& base() const noexcept; +}; + +template +bool +operator==( + const shuffle_order_engine& x, + const shuffle_order_engine& y); + +template +bool +operator!=( + const shuffle_order_engine& x, + const shuffle_order_engine& y); + +template +basic_ostream& +operator<<(basic_ostream& os, + const shuffle_order_engine& x); + +template +basic_istream& +operator>>(basic_istream& is, + shuffle_order_engine& x); + +typedef linear_congruential_engine + minstd_rand0; +typedef linear_congruential_engine + minstd_rand; +typedef mersenne_twister_engine mt19937; +typedef mersenne_twister_engine mt19937_64; +typedef subtract_with_carry_engine ranlux24_base; +typedef subtract_with_carry_engine ranlux48_base; +typedef discard_block_engine ranlux24; +typedef discard_block_engine ranlux48; +typedef shuffle_order_engine knuth_b; +typedef minstd_rand default_random_engine; + +// Generators + +class random_device +{ +public: + // types + typedef unsigned int result_type; + + // generator characteristics + static constexpr result_type min() { return numeric_limits::min(); } + static constexpr result_type max() { return numeric_limits::max(); } + + // constructors + explicit random_device(const string& token = implementation-defined); // before C++20 + random_device() : random_device(implementation-defined) {} // C++20 + explicit random_device(const string& token); // C++20 + + // generating functions + result_type operator()(); + + // property functions + double entropy() const noexcept; + + // no copy functions + random_device(const random_device& ) = delete; + void operator=(const random_device& ) = delete; +}; + +// Utilities + +class seed_seq +{ +public: + // types + typedef uint_least32_t result_type; + + // constructors + seed_seq(); + template + seed_seq(initializer_list il); + template + seed_seq(InputIterator begin, InputIterator end); + + // generating functions + template + void generate(RandomAccessIterator begin, RandomAccessIterator end); + + // property functions + size_t size() const; + template + void param(OutputIterator dest) const; + + // no copy functions + seed_seq(const seed_seq&) = delete; + void operator=(const seed_seq& ) = delete; +}; + +template + RealType generate_canonical(URNG& g); + +// Distributions + +template +class uniform_int_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef uniform_int_distribution distribution_type; + + explicit param_type(IntType a = 0, + IntType b = numeric_limits::max()); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit uniform_int_distribution(IntType a = 0, + IntType b = numeric_limits::max()); // before C++20 + uniform_int_distribution() : uniform_int_distribution(0) {} // C++20 + explicit uniform_int_distribution(IntType a, + IntType b = numeric_limits::max()); // C++20 + explicit uniform_int_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const uniform_int_distribution& x, + const uniform_int_distribution& y); + friend bool operator!=(const uniform_int_distribution& x, + const uniform_int_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const uniform_int_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + uniform_int_distribution& x); +}; + +template +class uniform_real_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef uniform_real_distribution distribution_type; + + explicit param_type(RealType a = 0, + RealType b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20 + uniform_real_distribution() : uniform_real_distribution(0.0) {} // C++20 + explicit uniform_real_distribution(RealType a, RealType b = 1.0); // C++20 + explicit uniform_real_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const uniform_real_distribution& x, + const uniform_real_distribution& y); + friend bool operator!=(const uniform_real_distribution& x, + const uniform_real_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const uniform_real_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + uniform_real_distribution& x); +}; + +class bernoulli_distribution +{ +public: + // types + typedef bool result_type; + + class param_type + { + public: + typedef bernoulli_distribution distribution_type; + + explicit param_type(double p = 0.5); + + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit bernoulli_distribution(double p = 0.5); // before C++20 + bernoulli_distribution() : bernoulli_distribution(0.5) {} // C++20 + explicit bernoulli_distribution(double p); // C++20 + explicit bernoulli_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const bernoulli_distribution& x, + const bernoulli_distribution& y); + friend bool operator!=(const bernoulli_distribution& x, + const bernoulli_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const bernoulli_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + bernoulli_distribution& x); +}; + +template +class binomial_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef binomial_distribution distribution_type; + + explicit param_type(IntType t = 1, double p = 0.5); + + IntType t() const; + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit binomial_distribution(IntType t = 1, double p = 0.5); // before C++20 + binomial_distribution() : binomial_distribution(1) {} // C++20 + explicit binomial_distribution(IntType t, double p = 0.5); // C++20 + explicit binomial_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + IntType t() const; + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const binomial_distribution& x, + const binomial_distribution& y); + friend bool operator!=(const binomial_distribution& x, + const binomial_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const binomial_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + binomial_distribution& x); +}; + +template +class geometric_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef geometric_distribution distribution_type; + + explicit param_type(double p = 0.5); + + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit geometric_distribution(double p = 0.5); // before C++20 + geometric_distribution() : geometric_distribution(0.5) {} // C++20 + explicit geometric_distribution(double p); // C++20 + explicit geometric_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const geometric_distribution& x, + const geometric_distribution& y); + friend bool operator!=(const geometric_distribution& x, + const geometric_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const geometric_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + geometric_distribution& x); +}; + +template +class negative_binomial_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef negative_binomial_distribution distribution_type; + + explicit param_type(result_type k = 1, double p = 0.5); + + result_type k() const; + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit negative_binomial_distribution(IntType k = 1, double p = 0.5); // before C++20 + negative_binomial_distribution() : negative_binomial_distribution(1) {} // C++20 + explicit negative_binomial_distribution(IntType k, double p = 0.5); // C++20 + explicit negative_binomial_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type k() const; + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const negative_binomial_distribution& x, + const negative_binomial_distribution& y); + friend bool operator!=(const negative_binomial_distribution& x, + const negative_binomial_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const negative_binomial_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + negative_binomial_distribution& x); +}; + +template +class poisson_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef poisson_distribution distribution_type; + + explicit param_type(double mean = 1.0); + + double mean() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit poisson_distribution(double mean = 1.0); // before C++20 + poisson_distribution() : poisson_distribution(1.0) {} // C++20 + explicit poisson_distribution(double mean); // C++20 + explicit poisson_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + double mean() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const poisson_distribution& x, + const poisson_distribution& y); + friend bool operator!=(const poisson_distribution& x, + const poisson_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const poisson_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + poisson_distribution& x); +}; + +template +class exponential_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef exponential_distribution distribution_type; + + explicit param_type(result_type lambda = 1.0); + + result_type lambda() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit exponential_distribution(RealType lambda = 1.0); // before C++20 + exponential_distribution() : exponential_distribution(1.0) {} // C++20 + explicit exponential_distribution(RealType lambda); // C++20 + explicit exponential_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type lambda() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const exponential_distribution& x, + const exponential_distribution& y); + friend bool operator!=(const exponential_distribution& x, + const exponential_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const exponential_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + exponential_distribution& x); +}; + +template +class gamma_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef gamma_distribution distribution_type; + + explicit param_type(result_type alpha = 1, result_type beta = 1); + + result_type alpha() const; + result_type beta() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit gamma_distribution(RealType alpha = 0.0, RealType beta = 1.0); // before C++20 + gamma_distribution() : gamma_distribution(0.0) {} // C++20 + explicit gamma_distribution(RealType alpha, RealType beta = 1.0); // C++20 + explicit gamma_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type alpha() const; + result_type beta() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const gamma_distribution& x, + const gamma_distribution& y); + friend bool operator!=(const gamma_distribution& x, + const gamma_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const gamma_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + gamma_distribution& x); +}; + +template +class weibull_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef weibull_distribution distribution_type; + + explicit param_type(result_type alpha = 1, result_type beta = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0); // before C++20 + weibull_distribution() : weibull_distribution(1.0) {} // C++20 + explicit weibull_distribution(RealType a, RealType b = 1.0); // C++20 + explicit weibull_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const weibull_distribution& x, + const weibull_distribution& y); + friend bool operator!=(const weibull_distribution& x, + const weibull_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const weibull_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + weibull_distribution& x); +}; + +template +class extreme_value_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef extreme_value_distribution distribution_type; + + explicit param_type(result_type a = 0, result_type b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20 + extreme_value_distribution() : extreme_value_distribution(0.0) {} // C++20 + explicit extreme_value_distribution(RealType a, RealType b = 1.0); // C++20 + explicit extreme_value_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const extreme_value_distribution& x, + const extreme_value_distribution& y); + friend bool operator!=(const extreme_value_distribution& x, + const extreme_value_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const extreme_value_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + extreme_value_distribution& x); +}; + +template +class normal_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef normal_distribution distribution_type; + + explicit param_type(result_type mean = 0, result_type stddev = 1); + + result_type mean() const; + result_type stddev() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0); // before C++20 + normal_distribution() : normal_distribution(0.0) {} // C++20 + explicit normal_distribution(RealType mean, RealType stddev = 1.0); // C++20 + explicit normal_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type mean() const; + result_type stddev() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const normal_distribution& x, + const normal_distribution& y); + friend bool operator!=(const normal_distribution& x, + const normal_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const normal_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + normal_distribution& x); +}; + +template +class lognormal_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef lognormal_distribution distribution_type; + + explicit param_type(result_type m = 0, result_type s = 1); + + result_type m() const; + result_type s() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit lognormal_distribution(RealType mean = 0.0, RealType stddev = 1.0); // before C++20 + lognormal_distribution() : lognormal_distribution(0.0) {} // C++20 + explicit lognormal_distribution(RealType mean, RealType stddev = 1.0); // C++20 + explicit lognormal_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type m() const; + result_type s() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const lognormal_distribution& x, + const lognormal_distribution& y); + friend bool operator!=(const lognormal_distribution& x, + const lognormal_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const lognormal_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + lognormal_distribution& x); +}; + +template +class chi_squared_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef chi_squared_distribution distribution_type; + + explicit param_type(result_type n = 1); + + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit chi_squared_distribution(RealType n = 1.0); // before C++20 + chi_squared_distribution() : chi_squared_distribution(1.0) {} // C++20 + explicit chi_squared_distribution(RealType n); // C++20 + explicit chi_squared_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const chi_squared_distribution& x, + const chi_squared_distribution& y); + friend bool operator!=(const chi_squared_distribution& x, + const chi_squared_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const chi_squared_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + chi_squared_distribution& x); +}; + +template +class cauchy_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef cauchy_distribution distribution_type; + + explicit param_type(result_type a = 0, result_type b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0); // before C++20 + cauchy_distribution() : cauchy_distribution(0.0) {} // C++20 + explicit cauchy_distribution(RealType a, RealType b = 1.0); // C++20 + explicit cauchy_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const cauchy_distribution& x, + const cauchy_distribution& y); + friend bool operator!=(const cauchy_distribution& x, + const cauchy_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const cauchy_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + cauchy_distribution& x); +}; + +template +class fisher_f_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef fisher_f_distribution distribution_type; + + explicit param_type(result_type m = 1, result_type n = 1); + + result_type m() const; + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit fisher_f_distribution(RealType m = 1.0, RealType n = 1.0); // before C++20 + fisher_f_distribution() : fisher_f_distribution(1.0) {} // C++20 + explicit fisher_f_distribution(RealType m, RealType n = 1.0); // C++20 + explicit fisher_f_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type m() const; + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const fisher_f_distribution& x, + const fisher_f_distribution& y); + friend bool operator!=(const fisher_f_distribution& x, + const fisher_f_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const fisher_f_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + fisher_f_distribution& x); +}; + +template +class student_t_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef student_t_distribution distribution_type; + + explicit param_type(result_type n = 1); + + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit student_t_distribution(RealType n = 1.0); // before C++20 + student_t_distribution() : student_t_distribution(1.0) {} // C++20 + explicit student_t_distribution(RealType n); // C++20 + explicit student_t_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const student_t_distribution& x, + const student_t_distribution& y); + friend bool operator!=(const student_t_distribution& x, + const student_t_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const student_t_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + student_t_distribution& x); +}; + +template +class discrete_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef discrete_distribution distribution_type; + + param_type(); + template + param_type(InputIterator firstW, InputIterator lastW); + param_type(initializer_list wl); + template + param_type(size_t nw, double xmin, double xmax, UnaryOperation fw); + + vector probabilities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + discrete_distribution(); + template + discrete_distribution(InputIterator firstW, InputIterator lastW); + discrete_distribution(initializer_list wl); + template + discrete_distribution(size_t nw, double xmin, double xmax, + UnaryOperation fw); + explicit discrete_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector probabilities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const discrete_distribution& x, + const discrete_distribution& y); + friend bool operator!=(const discrete_distribution& x, + const discrete_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const discrete_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + discrete_distribution& x); +}; + +template +class piecewise_constant_distribution +{ + // types + typedef RealType result_type; + + class param_type + { + public: + typedef piecewise_constant_distribution distribution_type; + + param_type(); + template + param_type(InputIteratorB firstB, InputIteratorB lastB, + InputIteratorW firstW); + template + param_type(initializer_list bl, UnaryOperation fw); + template + param_type(size_t nw, result_type xmin, result_type xmax, + UnaryOperation fw); + + vector intervals() const; + vector densities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + piecewise_constant_distribution(); + template + piecewise_constant_distribution(InputIteratorB firstB, + InputIteratorB lastB, + InputIteratorW firstW); + template + piecewise_constant_distribution(initializer_list bl, + UnaryOperation fw); + template + piecewise_constant_distribution(size_t nw, result_type xmin, + result_type xmax, UnaryOperation fw); + explicit piecewise_constant_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector intervals() const; + vector densities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const piecewise_constant_distribution& x, + const piecewise_constant_distribution& y); + friend bool operator!=(const piecewise_constant_distribution& x, + const piecewise_constant_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const piecewise_constant_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + piecewise_constant_distribution& x); +}; + +template +class piecewise_linear_distribution +{ + // types + typedef RealType result_type; + + class param_type + { + public: + typedef piecewise_linear_distribution distribution_type; + + param_type(); + template + param_type(InputIteratorB firstB, InputIteratorB lastB, + InputIteratorW firstW); + template + param_type(initializer_list bl, UnaryOperation fw); + template + param_type(size_t nw, result_type xmin, result_type xmax, + UnaryOperation fw); + + vector intervals() const; + vector densities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + piecewise_linear_distribution(); + template + piecewise_linear_distribution(InputIteratorB firstB, + InputIteratorB lastB, + InputIteratorW firstW); + + template + piecewise_linear_distribution(initializer_list bl, + UnaryOperation fw); + + template + piecewise_linear_distribution(size_t nw, result_type xmin, + result_type xmax, UnaryOperation fw); + + explicit piecewise_linear_distribution(const param_type& parm); + void reset(); + + // generating functions + template result_type operator()(URNG& g); + template result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector intervals() const; + vector densities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const piecewise_linear_distribution& x, + const piecewise_linear_distribution& y); + friend bool operator!=(const piecewise_linear_distribution& x, + const piecewise_linear_distribution& y); + + template + friend + basic_ostream& + operator<<(basic_ostream& os, + const piecewise_linear_distribution& x); + + template + friend + basic_istream& + operator>>(basic_istream& is, + piecewise_linear_distribution& x); +}; + +} // std +*/ + +#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) +# include <__cxx03/random> +#else +# include <__config> +# include <__random/bernoulli_distribution.h> +# include <__random/binomial_distribution.h> +# include <__random/cauchy_distribution.h> +# include <__random/chi_squared_distribution.h> +# include <__random/default_random_engine.h> +# include <__random/discard_block_engine.h> +# include <__random/discrete_distribution.h> +# include <__random/exponential_distribution.h> +# include <__random/extreme_value_distribution.h> +# include <__random/fisher_f_distribution.h> +# include <__random/gamma_distribution.h> +# include <__random/generate_canonical.h> +# include <__random/geometric_distribution.h> +# include <__random/independent_bits_engine.h> +# include <__random/is_seed_sequence.h> +# include <__random/knuth_b.h> +# include <__random/linear_congruential_engine.h> +# include <__random/lognormal_distribution.h> +# include <__random/mersenne_twister_engine.h> +# include <__random/negative_binomial_distribution.h> +# include <__random/normal_distribution.h> +# include <__random/piecewise_constant_distribution.h> +# include <__random/piecewise_linear_distribution.h> +# include <__random/poisson_distribution.h> +# include <__random/random_device.h> +# include <__random/ranlux.h> +# include <__random/seed_seq.h> +# include <__random/shuffle_order_engine.h> +# include <__random/student_t_distribution.h> +# include <__random/subtract_with_carry_engine.h> +# include <__random/uniform_int_distribution.h> +# include <__random/uniform_random_bit_generator.h> +# include <__random/uniform_real_distribution.h> +# include <__random/weibull_distribution.h> +# include + +// standard-mandated includes + +// [rand.synopsis] +# include + +# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +# endif + +# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# endif +#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) + +#endif // _LIBCPP_RANDOM -- cgit v1.2.3