# 25 Numerics library [numerics]

## 25.6 Random number generation [rand]

### 25.6.8 Random number distribution class templates [rand.dist]

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

A piecewise_­constant_­distribution random number distribution produces random numbers x, , uniformly distributed over each subinterval according to the probability density function
The distribution parameters , also known as this distribution's interval boundaries, shall satisfy the relation for .
Unless specified otherwise, the remaining n distribution parameters are calculated as:
in which the values , commonly known as the weights, shall be non-negative, non-NaN, and non-infinity.
Moreover, the following relation shall hold: .
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 , , , and .
template<class InputIteratorB, class InputIteratorW> piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW); 
Requires: InputIteratorB and InputIteratorW shall each satisfy the Cpp17InputIterator requirements ([input.iterators]).
Moreover, the id-expressions 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 , , , and .
Otherwise, shall form a sequence b of length , the length of the sequence w starting from firstW shall be at least n, and any for 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 , let , , , and .
Otherwise, let form a sequence , and let for .
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 , let , otherwise let .
The relation shall hold.
Effects: Constructs a piecewise_­constant_­distribution object with parameters taken or calculated from the following values: Let for , and for .
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 and whose operator[] member returns when invoked with argument k for .
vector<result_type> densities() const; 
Returns: A vector<result_­type> whose size member returns n and whose operator[] member returns when invoked with argument k for .