std::piecewise_linear_distribution - cppreference.com

From cppreference.com

template<classRealType=double>classpiecewise_linear_distribution;(since C++11)std::piecewise_linear_distribution produces random floating-point numbers, which are distributed according to a linear probability density function within each of the several subintervals [bi, bi+1). The distribution is such that the probability density at each interval boundary is exactly the predefined value pi.

The probability density for any bi≤x<bi+1 is

pibi+1-xbi+1-bi + pi+1x-bibi+1-bi

, where probability densities at interval boundaries pk are calculated as wk/S where S is the sum of all

12(wk+wk+1)(bk+1−bk)

.

The set of interval boundaries bi and the set of weights at boundaries wi are the parameters of this distribution.

std::piecewise_linear_distribution

satisfies all requirements of

RandomNumberDistribution

.

Template parameters

RealType - The result type generated by the generator. The effect is undefined if this is not one of float, double, or longdouble. Member types

Member type Definition result_type(C++11)RealTypeparam_typethe type of the parameter set, see

RandomNumberDistribution

. Member functions

(constructor)

constructs new distribution
(public member function)

[edit]

reset

resets the internal state of the distribution
(public member function)

[edit]

Generation

operator()

generates the next random number in the distribution
(public member function)

[edit]

Characteristics

intervalsdensities

(C++11)

returns the distribution parameters
(public member function)

[edit]

param

gets or sets the distribution parameter object
(public member function)

[edit]

min

returns the minimum potentially generated value
(public member function)

[edit]

max

returns the maximum potentially generated value
(public member function)

[edit]

Non-member functions

Example

Run this code

#include<iomanip>#include<iostream>#include<map>#include<random>#include<string>intmain(){std::random_devicerd;std::mt19937gen{rd()};// increase the probability from 0 to 5// remain flat from 5 to 10// decrease from 10 to 15 at the same ratestd::vector<double>i{0,5,10,15};std::vector<double>w{0,1,1,0};std::piecewise_linear_distribution<>d{i.begin(),i.end(),w.begin()};std::map<int,int>hist;for(intn{};n<1e4;++n)++hist[d(gen)];for(auto[x,y]:hist)std::cout<<std::setw(2)<<std::setfill('0')<<x<<' '<<std::string(y/100,'*')<<'\n';}Possible output:

00 * 01 *** 02 **** 03 ****** 04 ********* 05 ********* 06 ********* 07 ********** 08 ********* 09 ********** 10 ********* 11 ******* 12 **** 13 *** 14 *