29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.8 Random number distribution class templates [rand.dist]

29.6.8.1 In general [rand.dist.general]

Each type instantiated from a class template specified in this section [rand.dist] satisfies the requirements of a random number distribution type.

Descriptions are provided in this section [rand.dist] only for distribution operations that are not described in [rand.req.dist] or for operations where there is additional semantic information. In particular, declarations for copy constructors, for copy assignment operators, for streaming operators, and for equality and inequality operators are not shown in the synopses.

The algorithms for producing each of the specified distributions are implementation-defined.

The value of each probability density function p(z) and of each discrete probability function P(zi) specified in this section is 0 everywhere outside its stated domain.

29.6.8.2 Uniform distributions [rand.dist.uni]

29.6.8.2.1 Class template uniform_­int_­distribution [rand.dist.uni.int]

A uniform_­int_­distribution random number distribution produces random integers i, aib, distributed according to the constant discrete probability function

P(i|a,b)=1/(ba+1).

template<class IntType = int>
  class uniform_int_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());
    explicit uniform_int_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& 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;
  };

explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());

Requires: ab.

Effects: Constructs a uniform_­int_­distribution object; a and b correspond to the respective parameters of the distribution.

result_type a() const;

Returns: The value of the a parameter with which the object was constructed.

result_type b() const;

Returns: The value of the b parameter with which the object was constructed.

29.6.8.2.2 Class template uniform_­real_­distribution [rand.dist.uni.real]

A uniform_­real_­distribution random number distribution produces random numbers x, ax<b, distributed according to the constant probability density function

p(x|a,b)=1/(ba).

[Note: This implies that p(x|a,b) is undefined when a == b. end note]

template<class RealType = double>
  class uniform_real_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit uniform_real_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& 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;
  };

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: ab and banumeric_limits<RealType>::max().

Effects: Constructs a uniform_­real_­distribution object; a and b correspond to the respective parameters of the distribution.

result_type a() const;

Returns: The value of the a parameter with which the object was constructed.

result_type b() const;

Returns: The value of the b parameter with which the object was constructed.

29.6.8.3 Bernoulli distributions [rand.dist.bern]

29.6.8.3.1 Class bernoulli_­distribution [rand.dist.bern.bernoulli]

A bernoulli_­distribution random number distribution produces bool values b distributed according to the discrete probability function

P(b|p)={pifb=true1pifb=false.

class bernoulli_distribution {
public:
  // types
  using result_type = bool;
  using param_type  = unspecified;

  // constructors and reset functions
  explicit bernoulli_distribution(double p = 0.5);
  explicit bernoulli_distribution(const param_type& parm);
  void reset();

  // generating functions
  template<class URBG>
    result_type operator()(URBG& g);
  template<class URBG>
    result_type operator()(URBG& 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;
};

explicit bernoulli_distribution(double p = 0.5);

Requires: 0p1.

Effects: Constructs a bernoulli_­distribution object; p corresponds to the parameter of the distribution.

double p() const;

Returns: The value of the p parameter with which the object was constructed.

29.6.8.3.2 Class template binomial_­distribution [rand.dist.bern.bin]

A binomial_­distribution random number distribution produces integer values i0 distributed according to the discrete probability function

P(i|t,p)=(ti)pi(1p)ti.

template<class IntType = int>
  class binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit binomial_distribution(IntType t = 1, double p = 0.5);
    explicit binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& 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;
  };

explicit binomial_distribution(IntType t = 1, double p = 0.5);

Requires: 0p1 and 0t.

Effects: Constructs a binomial_­distribution object; t and p correspond to the respective parameters of the distribution.

IntType t() const;

Returns: The value of the t parameter with which the object was constructed.

double p() const;

Returns: The value of the p parameter with which the object was constructed.

29.6.8.3.3 Class template geometric_­distribution [rand.dist.bern.geo]

A geometric_­distribution random number distribution produces integer values i0 distributed according to the discrete probability function

P(i|p)=p(1p)i.

template<class IntType = int>
  class geometric_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit geometric_distribution(double p = 0.5);
    explicit geometric_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& 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;
  };

explicit geometric_distribution(double p = 0.5);

Requires: 0<p<1.

Effects: Constructs a geometric_­distribution object; p corresponds to the parameter of the distribution.

double p() const;

Returns: The value of the p parameter with which the object was constructed.

29.6.8.3.4 Class template negative_­binomial_­distribution [rand.dist.bern.negbin]

A negative_­binomial_­distribution random number distribution produces random integers i0 distributed according to the discrete probability function

P(i|k,p)=(k+i1i)pk(1p)i.

[Note: This implies that P(i|k,p) is undefined when p == 1. end note]

template<class IntType = int>
  class negative_binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);
    explicit negative_binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    IntType k() const;
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);

Requires: 0<p1 and 0<k.

Effects: Constructs a negative_­binomial_­distribution object; k and p correspond to the respective parameters of the distribution.

IntType k() const;

Returns: The value of the k parameter with which the object was constructed.

double p() const;

Returns: The value of the p parameter with which the object was constructed.

29.6.8.4 Poisson distributions [rand.dist.pois]

29.6.8.4.1 Class template poisson_­distribution [rand.dist.pois.poisson]

A poisson_­distribution random number distribution produces integer values i0 distributed according to the discrete probability function

P(i|μ)=eμμii!.

The distribution parameter μ is also known as this distribution's mean.

template<class IntType = int>
  class poisson_distribution
  {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit poisson_distribution(double mean = 1.0);
    explicit poisson_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& 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;
  };

explicit poisson_distribution(double mean = 1.0);

Requires: 0<mean.

Effects: Constructs a poisson_­distribution object; mean corresponds to the parameter of the distribution.

double mean() const;

Returns: The value of the mean parameter with which the object was constructed.

29.6.8.4.2 Class template exponential_­distribution [rand.dist.pois.exp]

An exponential_­distribution random number distribution produces random numbers x>0 distributed according to the probability density function

p(x|λ)=λeλx.

template<class RealType = double>
  class exponential_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit exponential_distribution(RealType lambda = 1.0);
    explicit exponential_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType lambda() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit exponential_distribution(RealType lambda = 1.0);

Requires: 0<lambda.

Effects: Constructs an exponential_­distribution object; lambda corresponds to the parameter of the distribution.

RealType lambda() const;

Returns: The value of the lambda parameter with which the object was constructed.

29.6.8.4.3 Class template gamma_­distribution [rand.dist.pois.gamma]

A gamma_­distribution random number distribution produces random numbers x>0 distributed according to the probability density function

p(x|α,β)=ex/ββαΓ(α)xα1.

template<class RealType = double>
  class gamma_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);
    explicit gamma_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType alpha() const;
    RealType beta() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);

Requires: 0<alpha and 0<beta.

Effects: Constructs a gamma_­distribution object; alpha and beta correspond to the parameters of the distribution.

RealType alpha() const;

Returns: The value of the alpha parameter with which the object was constructed.

RealType beta() const;

Returns: The value of the beta parameter with which the object was constructed.

29.6.8.4.4 Class template weibull_­distribution [rand.dist.pois.weibull]

A weibull_­distribution random number distribution produces random numbers x0 distributed according to the probability density function

p(x|a,b)=ab(xb)a1exp((xb)a).

template<class RealType = double>
  class weibull_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);
    explicit weibull_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);

Requires: 0<a and 0<b.

Effects: Constructs a weibull_­distribution object; a and b correspond to the respective parameters of the distribution.

RealType a() const;

Returns: The value of the a parameter with which the object was constructed.

RealType b() const;

Returns: The value of the b parameter with which the object was constructed.

29.6.8.4.5 Class template extreme_­value_­distribution [rand.dist.pois.extreme]

An extreme_­value_­distribution random number distribution produces random numbers x distributed according to the probability density function274

p(x|a,b)=1bexp(axbexp(axb)).

template<class RealType = double>
  class extreme_value_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit extreme_value_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Constructs an extreme_­value_­distribution object; a and b correspond to the respective parameters of the distribution.

RealType a() const;

Returns: The value of the a parameter with which the object was constructed.

RealType b() const;

Returns: The value of the b parameter with which the object was constructed.

The distribution corresponding to this probability density function is also known (with a possible change of variable) as the Gumbel Type I, the log-Weibull, or the Fisher-Tippett Type I distribution.

29.6.8.5 Normal distributions [rand.dist.norm]

29.6.8.5.1 Class template normal_­distribution [rand.dist.norm.normal]

A normal_­distribution random number distribution produces random numbers x distributed according to the probability density function

p(x|μ,σ)=1σ2πexp((xμ)22σ2).

The distribution parameters μ and σ are also known as this distribution's mean and standard deviation.

template<class RealType = double>
  class normal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
    explicit normal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType mean() const;
    RealType stddev() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);

Requires: 0<stddev.

Effects: Constructs a normal_­distribution object; mean and stddev correspond to the respective parameters of the distribution.

RealType mean() const;

Returns: The value of the mean parameter with which the object was constructed.

RealType stddev() const;

Returns: The value of the stddev parameter with which the object was constructed.

29.6.8.5.2 Class template lognormal_­distribution [rand.dist.norm.lognormal]

A lognormal_­distribution random number distribution produces random numbers x>0 distributed according to the probability density function

p(x|m,s)=1sx2πexp((lnxm)22s2).

template<class RealType = double>
  class lognormal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);
    explicit lognormal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType s() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);

Requires: 0<s.

Effects: Constructs a lognormal_­distribution object; m and s correspond to the respective parameters of the distribution.

RealType m() const;

Returns: The value of the m parameter with which the object was constructed.

RealType s() const;

Returns: The value of the s parameter with which the object was constructed.

29.6.8.5.3 Class template chi_­squared_­distribution [rand.dist.norm.chisq]

A chi_­squared_­distribution random number distribution produces random numbers x>0 distributed according to the probability density function

p(x|n)=x(n/2)1ex/2Γ(n/2)2n/2.

template<class RealType = double>
  class chi_squared_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit chi_squared_distribution(RealType n = 1);
    explicit chi_squared_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit chi_squared_distribution(RealType n = 1);

Requires: 0<n.

Effects: Constructs a chi_­squared_­distribution object; n corresponds to the parameter of the distribution.

RealType n() const;

Returns: The value of the n parameter with which the object was constructed.

29.6.8.5.4 Class template cauchy_­distribution [rand.dist.norm.cauchy]

A cauchy_­distribution random number distribution produces random numbers x distributed according to the probability density function

p(x|a,b)=(πb(1+(xab)2))1.

template<class RealType = double>
  class cauchy_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit cauchy_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Constructs a cauchy_­distribution object; a and b correspond to the respective parameters of the distribution.

RealType a() const;

Returns: The value of the a parameter with which the object was constructed.

RealType b() const;

Returns: The value of the b parameter with which the object was constructed.

29.6.8.5.5 Class template fisher_­f_­distribution [rand.dist.norm.f]

A fisher_­f_­distribution random number distribution produces random numbers x≥0 distributed according to the probability density function

p(x|m,n)=Γ((m+n)/2)Γ(m/2)Γ(n/2)(mn)m/2x(m/2)1(1+mxn)(m+n)/2.

template<class RealType = double>
  class fisher_f_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit fisher_f_distribution(RealType m = 1, RealType n = 1);
    explicit fisher_f_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit fisher_f_distribution(RealType m = 1, RealType n = 1);

Requires: 0<m and 0<n.

Effects: Constructs a fisher_­f_­distribution object; m and n correspond to the respective parameters of the distribution.

RealType m() const;

Returns: The value of the m parameter with which the object was constructed.

RealType n() const;

Returns: The value of the n parameter with which the object was constructed.

29.6.8.5.6 Class template student_­t_­distribution [rand.dist.norm.t]

A student_­t_­distribution random number distribution produces random numbers x distributed according to the probability density function

p(x|n)=1nπΓ((n+1)/2)Γ(n/2)(1+x2n)(n+1)/2.

template<class RealType = double>
  class student_t_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit student_t_distribution(RealType n = 1);
    explicit student_t_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit student_t_distribution(RealType n = 1);

Requires: 0<n.

Effects: Constructs a student_­t_­distribution object; n corresponds to the parameter of the distribution.

RealType n() const;

Returns: The value of the n parameter with which the object was constructed.

29.6.8.6 Sampling distributions [rand.dist.samp]

29.6.8.6.1 Class template discrete_­distribution [rand.dist.samp.discrete]

A discrete_­distribution random number distribution produces random integers i, 0i<n, distributed according to the discrete probability function

P(i|p0,,pn1)=pi.

Unless specified otherwise, the distribution parameters are calculated as: pk=wk/S for k=0,,n1 , in which the values wk, commonly known as the weights, shall be non-negative, non-NaN, and non-infinity. Moreover, the following relation shall hold: 0<S=w0++wn1.

template<class IntType = int>
  class discrete_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    discrete_distribution();
    template<class InputIterator>
      discrete_distribution(InputIterator firstW, InputIterator lastW);
    discrete_distribution(initializer_list<double> wl);
    template<class UnaryOperation>
      discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);
    explicit discrete_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<double> probabilities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

discrete_distribution();

Effects: Constructs a discrete_­distribution object with n=1 and p0=1. [Note: Such an object will always deliver the value 0. end note]

template<class InputIterator> discrete_distribution(InputIterator firstW, InputIterator lastW);

Requires: InputIterator shall satisfy the requirements of an input iterator. Moreover, iterator_­traits<InputIterator>​::​value_­type shall denote a type that is convertible to double. If firstW == lastW, let n=1 and w0=1. Otherwise, [firstW,lastW) shall form a sequence w of length n>0.

Effects: Constructs a discrete_­distribution object with probabilities given by the formula above.

discrete_distribution(initializer_list<double> wl);

Effects: Same as discrete_­distribution(wl.begin(), wl.end()).

template<class UnaryOperation> discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);

Requires: Each instance of type UnaryOperation shall be a function object whose return type shall be convertible to double. Moreover, double shall be convertible to the type of UnaryOperation's sole parameter. If nw=0, let n=1, otherwise let n=nw. The relation 0<δ=(xmaxxmin)/n shall hold.

Effects: Constructs a discrete_­distribution object with probabilities given by the formula above, using the following values: If nw=0, let w0=1. Otherwise, let wk=fw(xmin+kδ+δ/2) for k=0,,n1.

Complexity: The number of invocations of fw shall not exceed n.

vector<double> probabilities() const;

Returns: A vector<double> whose size member returns n and whose operator[] member returns pk when invoked with argument k for k=0,,n1.

29.6.8.6.2 Class template piecewise_­constant_­distribution [rand.dist.samp.pconst]

A piecewise_­constant_­distribution random number distribution produces random numbers x, b0x<bn, uniformly distributed over each subinterval [bi,bi+1) according to the probability density function

p(x|b0,,bn,ρ0,,ρn1)=ρi, for bix<bi+1.

The n+1 distribution parameters bi, also known as this distribution's interval boundaries, shall satisfy the relation bi<bi+1 for i=0,,n1. Unless specified otherwise, the remaining n distribution parameters are calculated as:

ρk=wkS(bk+1bk) for k=0,,n1,

in which the values wk, commonly known as the weights, shall be non-negative, non-NaN, and non-infinity. Moreover, the following relation shall hold: 0<S=w0++wn1.

template<class RealType = double>
  class piecewise_constant_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_constant_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                      InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax,
                                      UnaryOperation fw);
    explicit piecewise_constant_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_constant_distribution();

Effects: Constructs a piecewise_­constant_­distribution object with n=1, ρ0=1, b0=0, and b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB and InputIteratorW shall each satisfy the requirements of an input iterator type. Moreover, iterator_­traits<InputIteratorB>​::​value_­type and iterator_­traits<InputIteratorW>​::​value_­type shall each denote a type that is convertible to double. If firstB == lastB or ++firstB == lastB, let n=1, w0=1, b0=0, and b1=1. Otherwise, [firstB,lastB) shall form a sequence b of length n+1, the length of the sequence w starting from firstW shall be at least n, and any wk for kn shall be ignored by the distribution.

Effects: Constructs a piecewise_­constant_­distribution object with parameters as specified above.

template<class UnaryOperation> piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Each instance of type UnaryOperation shall be a function object whose return type shall be convertible to double. Moreover, double shall be convertible to the type of UnaryOperation's sole parameter.

Effects: Constructs a piecewise_­constant_­distribution object with parameters taken or calculated from the following values: If bl.size()<2, let n=1, w0=1, b0=0, and b1=1. Otherwise, let [bl.begin(),bl.end()) form a sequence b0,,bn, and let wk=fw((bk+1+bk)/2) for k=0,,n1.

Complexity: The number of invocations of fw shall not exceed n.

template<class UnaryOperation> piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Each instance of type UnaryOperation shall be a function object whose return type shall be convertible to double. Moreover, double shall be convertible to the type of UnaryOperation's sole parameter. If nw=0, let n=1, otherwise let n=nw. The relation 0<δ=(xmaxxmin)/n shall hold.

Effects: Constructs a piecewise_­constant_­distribution object with parameters taken or calculated from the following values: Let bk=xmin+kδ for k=0,,n, and wk=fw(bk+δ/2) for k=0,,n1.

Complexity: The number of invocations of fw shall not exceed n.

vector<result_type> intervals() const;

Returns: A vector<result_­type> whose size member returns n+1 and whose operator[] member returns bk when invoked with argument k for k=0,,n.

vector<result_type> densities() const;

Returns: A vector<result_­type> whose size member returns n and whose operator[] member returns ρk when invoked with argument k for k=0,,n1.

29.6.8.6.3 Class template piecewise_­linear_­distribution [rand.dist.samp.plinear]

A piecewise_­linear_­distribution random number distribution produces random numbers x, b0x<bn, distributed over each subinterval [bi,bi+1) according to the probability density function

p(x|b0,,bn,ρ0,,ρn)=ρibi+1xbi+1bi+ρi+1xbibi+1bi, for bix<bi+1.

The n+1 distribution parameters bi, also known as this distribution's interval boundaries, shall satisfy the relation bi<bi+1 for i=0,,n1. Unless specified otherwise, the remaining n+1 distribution parameters are calculated as ρk=wk/S for k=0,,n, in which the values wk, commonly known as the weights at boundaries, shall be non-negative, non-NaN, and non-infinity. Moreover, the following relation shall hold:

0<S=12n1k=0(wk+wk+1)(bk+1bk).

template<class RealType = double>
  class piecewise_linear_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_linear_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                    InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
    explicit piecewise_linear_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_linear_distribution();

Effects: Constructs a piecewise_­linear_­distribution object with n=1, ρ0=ρ1=1, b0=0, and b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB and InputIteratorW shall each satisfy the requirements of an input iterator type. Moreover, iterator_­traits<InputIteratorB>​::​value_­type and iterator_­traits<InputIteratorW>​::​value_­type shall each denote a type that is convertible to double. If firstB == lastB or ++firstB == lastB, let n=1, ρ0=ρ1=1, b0=0, and b1=1. Otherwise, [firstB,lastB) shall form a sequence b of length n+1, the length of the sequence w starting from firstW shall be at least n+1, and any wk for kn+1 shall be ignored by the distribution.

Effects: Constructs a piecewise_­linear_­distribution object with parameters as specified above.

template<class UnaryOperation> piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Each instance of type UnaryOperation shall be a function object whose return type shall be convertible to double. Moreover, double shall be convertible to the type of UnaryOperation's sole parameter.

Effects: Constructs a piecewise_­linear_­distribution object with parameters taken or calculated from the following values: If bl.size()<2, let n=1, ρ0=ρ1=1, b0=0, and b1=1. Otherwise, let [bl.begin(),bl.end()) form a sequence b0,,bn, and let wk=fw(bk) for k=0,,n.

Complexity: The number of invocations of fw shall not exceed n+1.

template<class UnaryOperation> piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Each instance of type UnaryOperation shall be a function object whose return type shall be convertible to double. Moreover, double shall be convertible to the type of UnaryOperation's sole parameter. If nw=0, let n=1, otherwise let n=nw. The relation 0<δ=(xmaxxmin)/n shall hold.

Effects: Constructs a piecewise_­linear_­distribution object with parameters taken or calculated from the following values: Let bk=xmin+kδ for k=0,,n, and wk=fw(bk) for k=0,,n.

Complexity: The number of invocations of fw shall not exceed n+1.

vector<result_type> intervals() const;

Returns: A vector<result_­type> whose size member returns n+1 and whose operator[] member returns bk when invoked with argument k for k=0,,n.

vector<result_type> densities() const;

Returns: A vector<result_­type> whose size member returns n and whose operator[] member returns ρk when invoked with argument k for k=0,,n.