std::extreme_value_distribution
From cppreference.com
Defined in header <random>
|
||
template< class RealType = double > class extreme_value_distribution; |
(since C++11) | |
Produces random numbers according to the extreme value distribution (it is also known as Gumbel Type I, log-Weibull, Fisher-Tippett Type I):
- p(x;a,b) =
exp⎛1 b
⎜
⎝
- exp⎛a-x b
⎜
⎝
⎞a-x b
⎟
⎠⎞
⎟
⎠
std::extreme_value_distribution
satisfies all requirements of RandomNumberDistribution
Contents |
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
|
RealType |
param_type (C++11)
|
the type of the parameter set, see RandomNumberDistribution. |
Member functions
(C++11) |
constructs new distribution (public member function) |
(C++11) |
resets the internal state of the distribution (public member function) |
Generation | |
(C++11) |
generates the next random number in the distribution (public member function) |
Characteristics | |
(C++11) |
returns the distribution parameters (public member function) |
(C++11) |
gets or sets the distribution parameter object (public member function) |
(C++11) |
returns the minimum potentially generated value (public member function) |
(C++11) |
returns the maximum potentially generated value (public member function) |
Non-member functions
(C++11)(C++11)(removed in C++20) |
compares two distribution objects (function) |
(C++11) |
performs stream input and output on pseudo-random number distribution (function template) |
Example
Run this code
#include <algorithm> #include <cmath> #include <iomanip> #include <iostream> #include <map> #include <random> #include <vector> template<int height=5, int bar_width=1, int padding=1, int offset=0, class S> void draw_vbars(S const& s) { const auto [min, max] = std::minmax_element(std::cbegin(s), std::cend(s)); std::vector<div_t> qr; for (float e:s) qr.push_back(std::div(std::lerp(0.f,height*8,(e-*min)/(*max-*min)),8)); for (auto h{height}; h-->0 ;) { for (auto o{offset}; o-->0 ;) std::cout << ' '; for (auto [q, r] : qr) { char d[] = "█"; int w{bar_width}; if (q < h) { while (w-->0) std::cout << ' '; } else { if (q == h) { d[2] -= (7 - r); } while (w-->0) std::cout << d; } for (auto p{padding}; p-->0 ;) std::cout << ' '; } std::cout << '\n'; } } int main() { std::random_device rd{}; std::mt19937 gen{rd()}; std::extreme_value_distribution<> d{-1.21f, 1.21f}; std::map<int, int> hist{}; for(int n=0; n<10000; ++n) { ++hist[std::round(d(gen))]; } std::vector<float> bars; for(const auto [n,p] : hist) { bars.push_back(p/200); } draw_vbars<5,4>(bars); for(const auto [n,p] : hist) { std::cout << ' ' << std::setw(2) << n << " "; } std::cout << '\n'; }
Possible output:
████ ████ ████ ▅▅▅▅ ████ ████ ████ ████ ████ ████ ▇▇▇▇ ▁▁▁▁ ▆▆▆▆ ████ ████ ████ ████ ▆▆▆▆ ▃▃▃▃ ▁▁▁▁ ▁▁▁▁ ▁▁▁▁ ▁▁▁▁ ▁▁▁▁ ▁▁▁▁ -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
External links
Weisstein, Eric W. "Extreme Value Distribution." From MathWorld--A Wolfram Web Resource.