std::piecewise_linear_distribution(3)

NAME
std::piecewise_linear_distribution - std::piecewise_linear_distribution

Synopsis
   Defined in header <random>
   template< class RealType = double > (since C++11)
   class piecewise_linear_distribution;
   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 \(\small{[b_i, b_{i+1})}\)[b
   i, b
   i+1). The distribution is such that the probability density at each interval
   boundary is exactly the predefined value \(\small{p_i}\)p
   i.
   The probability density for any \(\small{ b_i \le x < b_{i+1} }\)b
   i≤x<b
   i+1 is \(\small{p_i\frac{b_{i+1}-x}{b_{i+1}-b_i} + p_{i+1}\frac{x-b_i}{b_{i+1}-b_i}
   }\)p
   i
   b
   i+1-x
   b
   i+1-b
   i
   + p
   i+1
   x-b
   i
   b
   i+1-b
   i
   , where probability densities at interval boundaries \(\small{p_k}\)p
   k are calculated as \(\small{w_k/S}\)w
   k/S where \(\small{S}\)S is the sum of all \(\small{\frac{1}{2}(w_k +
   w_{k+1})(b_{k+1} - b_k)}\)
   1
   2
   (w
   k+w
   k+1)(b
   k+1−b
   k).
   The set of interval boundaries \(\small{b_i}\)b
   i and the set of weights at boundaries \(\small{w_i}\)w
   i 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 long double.

Member types
   Member type Definition
   result_type (C++11) RealType
   param_type (C++11) the type of the parameter set, see RandomNumberDistribution.

Member functions
   constructor constructs new distribution
   (C++11) (public member function)
   reset resets the internal state of the distribution
   (C++11) (public member function)

Generation
   operator() generates the next random number in the distribution
   (C++11) (public member function)

Characteristics
   intervals returns the distribution parameters
   densities (public member function)
   (C++11)
   param gets or sets the distribution parameter object
   (C++11) (public member function)
   min returns the minimum potentially generated value
   (C++11) (public member function)
   max returns the maximum potentially generated value
   (C++11) (public member function)

Non-member functions
   operator==
   operator!= compares two distribution objects
   (C++11) (function)
   (C++11)(removed in C++20)
   operator<< performs stream input and output on pseudo-random number
   operator>> distribution
   (C++11) (function template)

Example
// Run this code
 #include <iomanip>
 #include <iostream>
 #include <map>
 #include <random>
 #include <string>
 int main()
 {
     std::random_device rd;
     std::mt19937 gen{rd()};
     // increase the probability from 0 to 5
     // remain flat from 5 to 10
     // decrease from 10 to 15 at the same rate
     std::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 (int n{}; 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 *