Compartir a través de


piecewise_linear_distribution Class

 

The latest version of this topic can be found at piecewise_linear_distribution Class.

Generates a piecewise linear distribution that has varying-width intervals with linearly varying probability in each interval.

Syntax

class piecewise_linear_distribution  
   {  
   public:  // types  
   typedef RealType result_type;  
   struct param_type;  // constructor and reset functions  
   piecewise_linear_distribution();
   template <class InputIteratorI, class InputIteratorW>  
   piecewise_linear_distribution(InputIteratorI firstI, InputIteratorI lastI, InputIteratorW firstW);
   template <class UnaryOperation>  
   piecewise_linear_distribution(initializer_list<RealType>  
   intervals, UnaryOperation weightfunc);
   template <class UnaryOperation>  
   piecewise_linear_distribution(size_t count, RealType xmin, RealType xmax, UnaryOperation weightfunc);
   explicit piecewise_linear_distribution(const param_type& parm);
   void reset();
   // generating functions  
   template <class URNG>  
   result_type operator()(URNG& gen);
   template <class URNG>  
   result_type operator()(URNG& gen, 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;
   };  

Parameters

RealType
The floating point result type, defaults to double. For possible types, see <random>.

Remarks

This sampling distribution has varying-width intervals with linearly varying probability in each interval. For information about other sampling distributions, see piecewise_constant_distribution and discrete_distribution.

The following table links to articles about individual members:

piecewise_linear_distribution::piecewise_linear_distribution piecewise_linear_distribution::intervals piecewise_linear_distribution::param
piecewise_linear_distribution::operator() piecewise_linear_distribution::densities piecewise_linear_distribution::param_type

The property function intervals() returns a vector<RealType> with the set of stored intervals of the distribution.

The property function densities() returns a vector<RealType> with the stored densities for each interval set, which are calculated according to the weights provided in the constructor parameters.

For more information about distribution classes and their members, see <random>.

Example

// compile with: /EHsc /W4  
#include <random>   
#include <iostream>  
#include <iomanip>  
#include <string>  
#include <map>  
  
using namespace std;  
  
void test(const int s) {  
  
    // uncomment to use a non-deterministic generator  
    // random_device rd;  
    // mt19937 gen(rd());  
    mt19937 gen(1701);  
  
    // Three intervals, non-uniform: 0 to 1, 1 to 6, and 6 to 15  
    vector<double> intervals{ 0, 1, 6, 15 };  
    // weights determine the densities used by the distribution  
    vector<double> weights{ 1, 5, 5, 10 };  
  
    piecewise_linear_distribution<double> distr(intervals.begin(), intervals.end(), weights.begin());  
  
    cout << endl;  
    cout << "min() == " << distr.min() << endl;  
    cout << "max() == " << distr.max() << endl;  
    cout << "intervals (index: interval):" << endl;  
    vector<double> i = distr.intervals();  
    int counter = 0;  
    for (const auto& n : i) {  
        cout << fixed << setw(11) << counter << ": " << setw(14) << setprecision(10) << n << endl;  
        ++counter;  
    }  
    cout << endl;  
    cout << "densities (index: density):" << endl;  
    vector<double> d = distr.densities();  
    counter = 0;  
    for (const auto& n : d) {  
        cout << fixed << setw(11) << counter << ": " << setw(14) << setprecision(10) << n << endl;  
        ++counter;  
    }  
    cout << endl;  
  
    // generate the distribution as a histogram  
    map<int, int> histogram;  
    for (int i = 0; i < s; ++i) {  
        ++histogram[distr(gen)];  
    }  
  
    // print results  
    cout << "Distribution for " << s << " samples:" << endl;  
    for (const auto& elem : histogram) {  
        cout << setw(5) << elem.first << '-' << elem.first + 1 << ' ' << string(elem.second, ':') << endl;  
    }  
    cout << endl;  
}  
  
int main()  
{  
    int samples = 100;  
  
    cout << "Use CTRL-Z to bypass data entry and run using default values." << endl;  
    cout << "Enter an integer value for the sample count: ";  
    cin >> samples;  
  
    test(samples);  
}  
  

Output

Use CTRL-Z to bypass data entry and run using default values.Enter an integer value for the sample count: 100min() == 0max() == 15intervals (index: interval):          0:   0.0000000000          1:   1.0000000000          2:   6.0000000000          3:  15.0000000000densities (index: density):          0:   0.0645161290          1:   0.3225806452          2:   0.3225806452          3:   0.6451612903Distribution for 100 samples:    0-1 :::::::::::::::::::::    1-2 ::::::    2-3 :::    3-4 :::::::    4-5 ::::::    5-6 ::::::    6-7 :::::    7-8 ::::::::::    8-9 ::::::::::    9-10 ::::::   10-11 ::::   11-12 :::   12-13 :::   13-14 :::::   14-15 :::::  

Requirements

Header: <random>

Namespace: std

piecewise_linear_distribution::piecewise_linear_distribution

Constructs the distribution.

 
// default constructor  
piecewise_linear_distribution();

 
// constructs using a range of intervals, [firstI, lastI), with  
// matching weights starting at firstW  
template <class InputIteratorI, class InputIteratorW>  
piecewise_linear_distribution(InputIteratorI firstI, InputIteratorI lastI, InputIteratorW firstW);

 
// constructs using an initializer list for range of intervals,  
// with weights generated by function weightfunc  
template <class UnaryOperation>  
piecewise_linear_distribution(initializer_list<RealType>  
intervals, UnaryOperation weightfunc);

 
// constructs using an initializer list for range of count intervals,  
// distributed uniformly over [xmin,xmax] with weights generated by function weightfunc  
template <class UnaryOperation>  
piecewise_linear_distribution(size_t count, RealType xmin, RealType xmax, UnaryOperation weightfunc);

 
// constructs from an existing param_type structure  
explicit piecewise_linear_distribution(const param_type& parm);

Parameters

firstI
An input iterator of the first element in the distribution range.

lastI
An input iterator of the last element in the distribution range.

firstW
An input iterator of the first element in the weights range.

intervals
An initializer_list with the intervals of the distribution.

count
The number of elements in the distribution range.

xmin
The lowest value in the distribution range.

xmax
The highest value in the distribution range. Must be greater than xmin.

weightfunc
The object representing the probability function for the distribution. Both the parameter and the return value must be convertible to double.

parm
The parameter structure used to construct the distribution.

Remarks

The default constructor sets the stored parameters such that there is one interval, 0 to 1, with a probability density of 1.

The iterator range constructor

template <class InputIteratorI, class InputIteratorW>  
piecewise_linear_distribution(InputIteratorI firstI, InputIteratorI lastI,  
    InputIteratorW firstW);

constructs a distribution object with itnervals from iterators over the sequence [ firstI, lastI) and a matching weight sequence starting at firstW.

The initializer list constructor

template <class UnaryOperation>  
piecewise_linear_distribution(initializer_list<RealType>  
intervals,   
    UnaryOperation weightfunc);

constructs a distribution object with intervals from the intializer list intervals and weights generated from the function weightfunc.

The constructor defined as

template <class UnaryOperation>  
piecewise_linear_distribution(size_t count, RealType xmin, RealType xmax,  
    UnaryOperation weightfunc);

constructs a distribution object with count intervals distributed uniformly over [ xmin,xmax], assigning each interval weights according to the function weightfunc, and weightfunc must accept one parameter and have a return value, both of which are convertible to double. Precondition:xmin < xmax.

The constructor defined as

explicit piecewise_linear_distribution(const param_type& parm);

constructs a distribution object using parm as the stored parameter structure.

piecewise_linear_distribution::param_type

Stores all the parameters of the distribution.

struct param_type {  
   typedef piecewise_linear_distribution<RealType> distribution_type;  
   param_type();
   template <class IterI, class IterW>  
   param_type(IterI firstI, IterI lastI, IterW firstW);
   template <class UnaryOperation>  
   param_type(size_t count, RealType xmin, RealType xmax,   
   UnaryOperation weightfunc);
   std::vector<RealType>  
   densities() const;
   std::vector<RealType> intervals() const;
   .....  
   bool operator==(const param_type& right) const;
   bool operator!=(const param_type& right) const;
   };  

Parameters

See parent topic piecewise_linear_distribution Class.

Remarks

Precondition: xmin < xmax

This structure can be passed to the distribution's class constructor at instantiation, to the param() member function to set the stored parameters of an existing distribution, and to operator() to be used in place of the stored parameters.

See Also

<random>