29 Numerics library [numerics]

29.6 Random number generation [rand]

29.6.8 Random number distribution class templates [rand.dist]

29.6.8.6 Sampling distributions [rand.dist.samp]

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

piecewise_­linear_­distribution Случайное распределение числа производит случайные числа x, b0x<bn, распределяется по каждому подинтервалу в[bi,bi+1) соответствии с функцией плотности вероятности

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

Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения вычисляются как , в котором значения , обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, должно выполняться следующее соотношение: interval boundaries bi<bi+1 i=0,,n1 n+1 ρk=wk/S for k=0,,n wk weights at boundaries

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: Создает piecewise_­linear_­distribution объект с n=1, ρ0=ρ1=1, b0=0и b1=1.

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

Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_­traits<InputIteratorB>​::​value_­type и iterator_­traits<InputIteratorW>​::​value_­typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n+1, и любое значение wk for kn+1 должно игнорироваться распределением.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, указанными выше.

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

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.

Effects: Создает piecewise_­linear_­distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,,bnи позвольте wk=fw(bk) для k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

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

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+kδ for k=0,,nи wk=fw(bk) for k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

vector<result_type> intervals() const;

Returns: Объект vector<result_­type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,,n.

vector<result_type> densities() const;

Returns: Объект vector<result_­type> , size член которого возвращается n и operator[] член которого возвращается ρk при вызове с аргументом k for k=0,,n.