A discrete_distribution random number distribution produces random integers i, 0≤i<n, distributed according to the discrete probability function
P(i|p0,…,pn−1)=pi.
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, shall be non-negative, non-NaN, and non-infinity. Moreover, the following relation shall hold: 0<S=w0+⋯+wn−1.
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);
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<δ=(xmax−xmin)/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,…,n−1.
vector<double> probabilities() const;