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.1 Class template discrete_­distribution [rand.dist.samp.discrete]

discrete_­distribution Случайное распределение числа производит случайные целые числаi,0i<n, распределенных в соответствии с дискретной вероятностной функции

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

Если не указано иное, параметры распределения рассчитываются как:, pk=wk/S for k=0,,n1 в котором значенияwk, обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: .weights0<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: Создаетdiscrete_­distribution объект с помощьюn=1 иp0=1. [ Note: Такой объект всегда будет иметь ценность0. ] end note

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

Requires: InputIterator должны удовлетворять требованиямinput iterator. Кроме того, iterator_­traits<InputIterator>​::​value_­type будет обозначать тип, в который можно преобразоватьdouble. ЕслиfirstW == lastW, пустьn=1 иw0=1. В противном случае [firstW,lastW) формируется последовательностьw длиныn>0.

Effects: Создаетdiscrete_­distribution объект с вероятностями, заданными формулой выше.

discrete_distribution(initializer_list<double> wl);

Effects: То же, что иdiscrete_­distribution(wl.begin(), wl.end()).

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

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

Effects: Создаетdiscrete_­distribution объект с вероятностями, заданными формулой выше, используя следующие значения: Еслиnw=0, пустьw0=1. В противном случае пустьwk=fw(xmin+kδ+δ/2) дляk=0,,n1.

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

vector<double> probabilities() const;

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