Files
2025-10-25 03:02:53 +03:00

520 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[rand.dist.samp]
# 29 Numerics library [[numerics]](./#numerics)
## 29.5 Random number generation [[rand]](rand#dist.samp)
### 29.5.9 Random number distribution class templates [[rand.dist]](rand.dist#samp)
#### 29.5.9.6 Sampling distributions [rand.dist.samp]
#### [29.5.9.6.1](#discrete) Class template discrete_distribution [[rand.dist.samp.discrete]](rand.dist.samp.discrete)
[1](#discrete-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6273)
A discrete_distribution random number distribution
produces random integers i, 0≤i<n,
distributed according to
the discrete probability function in Formula [29.19](#eq:rand.dist.samp.discrete)[.](#discrete-1.sentence-1)
P(i|p0,…,pn−1)=pi(29.19)
[2](#discrete-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6282)
Unless specified otherwise,
the distribution parameters are calculated as:pk=wk/S for k=0,…,n−1,
in which the values wk,
commonly known as the [*weights*](#def:weights), shall be non-negative, non-NaN, and non-infinity[.](#discrete-2.sentence-1)
Moreover, the following relation shall hold:0<S=w0+⋯+wn−1[.](#discrete-2.sentence-2)
[🔗](#lib:discrete_distribution_)
namespace std {template<class IntType = int>class discrete_distribution {public:// typesusing 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(); // equality operatorsfriend bool operator==(const discrete_distribution& x, const discrete_distribution& y); // generating functionstemplate<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; // inserters and extractorstemplate<class charT, class traits>friend basic_ostream<charT, traits>&operator<<(basic_ostream<charT, traits>& os, const discrete_distribution& x); template<class charT, class traits>friend basic_istream<charT, traits>&operator>>(basic_istream<charT, traits>& is, discrete_distribution& x); };}
[🔗](#lib:discrete_distribution,constructor)
`discrete_distribution();
`
[3](#discrete-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6346)
*Effects*: Constructs a discrete_distribution object
with n=1 and p0=1[.](#discrete-3.sentence-1)
[*Note [1](#discrete-note-1)*:
Such an object will always deliver the value 0[.](#discrete-3.sentence-2)
— *end note*]
[🔗](#lib:discrete_distribution,constructor_)
`template<class InputIterator>
discrete_distribution(InputIterator firstW, InputIterator lastW);
`
[4](#discrete-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6363)
*Mandates*: is_convertible_v<iterator_traits<InputIterator>::value_type,double> is true[.](#discrete-4.sentence-1)
[5](#discrete-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6368)
*Preconditions*: InputIterator meets the [*Cpp17InputIterator*](input.iterators#:Cpp17InputIterator "24.3.5.3Input iterators[input.iterators]") requirements ([[input.iterators]](input.iterators "24.3.5.3Input iterators"))[.](#discrete-5.sentence-1)
If firstW == lastW,
let n=1 and w0=1[.](#discrete-5.sentence-2)
Otherwise, [firstW, lastW) forms a sequence w of length n>0[.](#discrete-5.sentence-3)
[6](#discrete-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6378)
*Effects*: Constructs a discrete_distribution object
with probabilities given by the Formula [29.19](#eq:rand.dist.samp.discrete)[.](#discrete-6.sentence-1)
[🔗](#lib:discrete_distribution,constructor__)
`discrete_distribution(initializer_list<double> wl);
`
[7](#discrete-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6391)
*Effects*: Same as discrete_distribution(wl.begin(), wl.end())[.](#discrete-7.sentence-1)
[🔗](#lib:discrete_distribution,constructor___)
`template<class UnaryOperation>
discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);
`
[8](#discrete-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6403)
*Mandates*: is_invocable_r_v<double, UnaryOperation&, double> is true[.](#discrete-8.sentence-1)
[9](#discrete-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6407)
*Preconditions*: If nw=0, let n=1, otherwise let n=nw[.](#discrete-9.sentence-1)
The relation 0<δ=(xmax−xmin)/n holds[.](#discrete-9.sentence-2)
[10](#discrete-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6414)
*Effects*: Constructs a discrete_distribution object
with probabilities given by the formula above,
using the following values:
If nw=0,
let w0=1[.](#discrete-10.sentence-1)
Otherwise,
let wk=fw(xmin+kâ‹Î´+δ/2) for k=0,…,n−1[.](#discrete-10.sentence-2)
[11](#discrete-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6425)
*Complexity*: The number of invocations of fw does not exceed n[.](#discrete-11.sentence-1)
[🔗](#lib:probabilities,discrete_distribution)
`vector<double> probabilities() const;
`
[12](#discrete-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6436)
*Returns*: A vector<double> whose size member returns n and whose operator[] member returns pk when invoked with argument k for k=0,…,n−1[.](#discrete-12.sentence-1)
#### [29.5.9.6.2](#pconst) Class template piecewise_constant_distribution [[rand.dist.samp.pconst]](rand.dist.samp.pconst)
[1](#pconst-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6452)
A piecewise_constant_distribution random number distribution
produces random numbers x,b0≤x<bn,
uniformly distributed over each subinterval[bi,bi+1) according to the probability density function in Formula [29.20](#eq:rand.dist.samp.pconst)[.](#pconst-1.sentence-1)
p(x|b0,…,bn,ρ0,…,ρˆ’1)=ρ , for bi≤x<bi+1(29.20)
[2](#pconst-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6464)
The n+1 distribution parameters bi,
also known as this distribution's [*interval boundaries*](#def:interval_boundaries), shall satisfy the relationbi<bi+1 for i=0,…,n−1[.](#pconst-2.sentence-1)
Unless specified otherwise,
the remaining n distribution parameters are calculated as:
ρk=wkSâ‹(bk+1−bk) for k=0,…,n− , in which the values wk,
commonly known as the [*weights*](#def:weights), shall be non-negative, non-NaN, and non-infinity[.](#pconst-2.sentence-2)
Moreover, the following relation shall hold: 0<S=w0+⋯+wn−1[.](#pconst-2.sentence-3)
[🔗](#lib:piecewise_constant_distribution_)
namespace std {template<class RealType = double>class piecewise_constant_distribution {public:// typesusing 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(); // equality operatorsfriend bool operator==(const piecewise_constant_distribution& x, const piecewise_constant_distribution& y); // generating functionstemplate<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; // inserters and extractorstemplate<class charT, class traits>friend basic_ostream<charT, traits>&operator<<(basic_ostream<charT, traits>& os, const piecewise_constant_distribution& x); template<class charT, class traits>friend basic_istream<charT, traits>&operator>>(basic_istream<charT, traits>& is, piecewise_constant_distribution& x); };}
[🔗](#lib:piecewise_constant_distribution,constructor)
`piecewise_constant_distribution();
`
[3](#pconst-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6538)
*Effects*: Constructs a piecewise_constant_distribution object
with n=1, ρ0=1, b0=0,
and b1=1[.](#pconst-3.sentence-1)
[🔗](#lib:piecewise_constant_distribution,constructor_)
`template<class InputIteratorB, class InputIteratorW>
piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
InputIteratorW firstW);
`
[4](#pconst-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6556)
*Mandates*: Both of
- [(4.1)](#pconst-4.1)
is_convertible_v<iterator_traits<InputIteratorB>::value_type, double>
- [(4.2)](#pconst-4.2)
is_convertible_v<iterator_traits<InputIteratorW>::value_type, double>
are true[.](#pconst-4.sentence-1)
[5](#pconst-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6565)
*Preconditions*: InputIteratorB and InputIteratorW each meet the [*Cpp17InputIterator*](input.iterators#:Cpp17InputIterator "24.3.5.3Input iterators[input.iterators]") requirements ([[input.iterators]](input.iterators "24.3.5.3Input iterators"))[.](#pconst-5.sentence-1)
If firstB == lastB or ++firstB == lastB,
let n=1, w0=1, b0=0,
and b1=1[.](#pconst-5.sentence-2)
Otherwise, [firstB, lastB) forms a sequence b of length n+1,
the length of the sequence w starting from firstW is at least n,
and any wk for k ≥ n are ignored by the distribution[.](#pconst-5.sentence-3)
[6](#pconst-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6583)
*Effects*: Constructs a piecewise_constant_distribution object
with parameters as specified above[.](#pconst-6.sentence-1)
[🔗](#lib:piecewise_constant_distribution,constructor__)
`template<class UnaryOperation>
piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
`
[7](#pconst-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6597)
*Mandates*: is_invocable_r_v<double, UnaryOperation&, double> is true[.](#pconst-7.sentence-1)
[8](#pconst-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6601)
*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[.](#pconst-8.sentence-1)
Otherwise,
let [bl.begin(), bl.end()) form a sequence b0,…,bn,
and
let wk=fw((bk+1+bk)/2) for k=0,…,n−1[.](#pconst-8.sentence-2)
[9](#pconst-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6618)
*Complexity*: The number of invocations of fw does not exceed n[.](#pconst-9.sentence-1)
[🔗](#lib:piecewise_constant_distribution,constructor___)
`template<class UnaryOperation>
piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
`
[10](#pconst-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6631)
*Mandates*: is_invocable_r_v<double, UnaryOperation&, double> is true[.](#pconst-10.sentence-1)
[11](#pconst-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6635)
*Preconditions*: If nw=0, let n=1, otherwise let n=nw[.](#pconst-11.sentence-1)
The relation 0<δ=(xmax−xmin)/n holds[.](#pconst-11.sentence-2)
[12](#pconst-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6641)
*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,…,n−1[.](#pconst-12.sentence-1)
[13](#pconst-13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6649)
*Complexity*: The number of invocations of fw does not exceed n[.](#pconst-13.sentence-1)
[🔗](#lib:intervals,piecewise_constant_distribution)
`vector<result_type> intervals() const;
`
[14](#pconst-14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6660)
*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[.](#pconst-14.sentence-1)
[🔗](#lib:densities,piecewise_constant_distribution)
`vector<result_type> densities() const;
`
[15](#pconst-15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6674)
*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−1[.](#pconst-15.sentence-1)
#### [29.5.9.6.3](#plinear) Class template piecewise_linear_distribution [[rand.dist.samp.plinear]](rand.dist.samp.plinear)
[1](#plinear-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6690)
A piecewise_linear_distribution random number distribution
produces random numbers x,b0≤x<bn,
distributed over each subinterval[bi,bi+1) according to the probability density function in Formula [29.21](#eq:rand.dist.samp.plinear)[.](#plinear-1.sentence-1)
p(x|b0,…,bn,ρ0,…,ρn)=ρ‹bi+ˆ’xbi+ˆ’bi+ρi+‹ˆ’bibi+ˆ’bi , for bi≤x<bi+1.(29.21)
[2](#plinear-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6704)
The n+1 distribution parameters bi,
also known as this distribution's [*interval boundaries*](#def:interval_boundaries), shall satisfy the relation bi<bi+1 for i=0,…,n−1[.](#plinear-2.sentence-1)
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*](#def:weights_at_boundaries), shall be non-negative, non-NaN, and non-infinity[.](#plinear-2.sentence-2)
Moreover, the following relation shall hold:
0<S=12⋈’ˆ‘k=0(wk+wk+1)â‹(bk+1−bk) [.](#plinear-2.sentence-3)
[🔗](#lib:piecewise_linear_distribution_)
namespace std {template<class RealType = double>class piecewise_linear_distribution {public:// typesusing 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(); // equality operatorsfriend bool operator==(const piecewise_linear_distribution& x, const piecewise_linear_distribution& y); // generating functionstemplate<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; // inserters and extractorstemplate<class charT, class traits>friend basic_ostream<charT, traits>&operator<<(basic_ostream<charT, traits>& os, const piecewise_linear_distribution& x); template<class charT, class traits>friend basic_istream<charT, traits>&operator>>(basic_istream<charT, traits>& is, piecewise_linear_distribution& x); };}
[🔗](#lib:piecewise_linear_distribution,constructor)
`piecewise_linear_distribution();
`
[3](#plinear-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6774)
*Effects*: Constructs a piecewise_linear_distribution object
with n=1, ρ0=ρ1=1, b0=0,
and b1=1[.](#plinear-3.sentence-1)
[🔗](#lib:piecewise_linear_distribution,constructor_)
`template<class InputIteratorB, class InputIteratorW>
piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB,
InputIteratorW firstW);
`
[4](#plinear-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6791)
*Mandates*: Both of
- [(4.1)](#plinear-4.1)
is_convertible_v<iterator_traits<InputIteratorB>::value_type, double>
- [(4.2)](#plinear-4.2)
is_convertible_v<iterator_traits<InputIteratorW>::value_type, double>
are true[.](#plinear-4.sentence-1)
[5](#plinear-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6800)
*Preconditions*: InputIteratorB and InputIteratorW each meet the [*Cpp17InputIterator*](input.iterators#:Cpp17InputIterator "24.3.5.3Input iterators[input.iterators]") requirements ([[input.iterators]](input.iterators "24.3.5.3Input iterators"))[.](#plinear-5.sentence-1)
If firstB == lastB or ++firstB == lastB,
let n=1, ρ0=ρ1=1, b0=0,
and b1=1[.](#plinear-5.sentence-2)
Otherwise, [firstB, lastB) forms a sequence b of length n+1,
the length of the sequence w starting from firstW is at least n+1,
and any wk for k≥n+1 are ignored by the distribution[.](#plinear-5.sentence-3)
[6](#plinear-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6818)
*Effects*: Constructs a piecewise_linear_distribution object
with parameters as specified above[.](#plinear-6.sentence-1)
[🔗](#lib:piecewise_linear_distribution,constructor__)
`template<class UnaryOperation>
piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);
`
[7](#plinear-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6832)
*Mandates*: is_invocable_r_v<double, UnaryOperation&, double> is true[.](#plinear-7.sentence-1)
[8](#plinear-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6836)
*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[.](#plinear-8.sentence-1)
Otherwise,
let [bl.begin(), bl.end()) form a sequence b0,…,bn,
and
let wk=fw(bk) for k=0,…,n[.](#plinear-8.sentence-2)
[9](#plinear-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6853)
*Complexity*: The number of invocations of fw does not exceed n+1[.](#plinear-9.sentence-1)
[🔗](#lib:piecewise_linear_distribution,constructor___)
`template<class UnaryOperation>
piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
`
[10](#plinear-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6866)
*Mandates*: is_invocable_r_v<double, UnaryOperation&, double> is true[.](#plinear-10.sentence-1)
[11](#plinear-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6870)
*Preconditions*: If nw=0, let n=1, otherwise let n=nw[.](#plinear-11.sentence-1)
The relation 0<δ=(xmax−xmin)/n holds[.](#plinear-11.sentence-2)
[12](#plinear-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6876)
*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[.](#plinear-12.sentence-1)
[13](#plinear-13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6884)
*Complexity*: The number of invocations of fw does not exceed n+1[.](#plinear-13.sentence-1)
[🔗](#lib:intervals,piecewise_linear_distribution)
`vector<result_type> intervals() const;
`
[14](#plinear-14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6895)
*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[.](#plinear-14.sentence-1)
[🔗](#lib:densities,piecewise_linear_distribution)
`vector<result_type> densities() const;
`
[15](#plinear-15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L6909)
*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[.](#plinear-15.sentence-1)