Difference between revisions of "cpp/numeric/random/exponential distribution"
From cppreference.com
m (Text replace - "{{tdcl" to "{{dcl") |
Andreas Krug (Talk | contribs) m (fmt) |
||
(18 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|exponential_distribution}} | {{cpp/title|exponential_distribution}} | ||
− | {{cpp/numeric/random/exponential_distribution/ | + | {{cpp/numeric/random/exponential_distribution/navbar}} |
− | {{ddcl | header=random | | + | {{ddcl|header=random|since=c++11|1= |
template< class RealType = double > | template< class RealType = double > | ||
class exponential_distribution; | class exponential_distribution; | ||
}} | }} | ||
− | Produces random non-negative floating-point values {{ | + | Produces random non-negative floating-point values {{mathjax-or|\(\small x\)|x}}, distributed according to probability density function: |
− | :{{ | + | :{{mathjax-or|1=\(\small P(x{{!}}\lambda) = \lambda e^{-\lambda x}\)|2=P(x{{!}}λ) = λe{{su|p=-λx}}}} |
− | The value obtained is the time/distance until the next random event if random events occur at constant rate {{ | + | The value obtained is the time/distance until the next random event if random events occur at constant rate {{mathjax-or|\(\small\lambda\)|λ}} per unit of time/distance. For example, this distribution describes the time between the clicks of a Geiger counter or the distance between point mutations in a DNA strand. |
− | This is the continuous counterpart of {{ | + | This is the continuous counterpart of {{lc|std::geometric_distribution}}. |
+ | |||
+ | {{tt|std::exponential_distribution}} satisfies {{named req|RandomNumberDistribution}}. | ||
+ | |||
+ | ===Template parameters=== | ||
+ | {{par begin}} | ||
+ | {{cpp/numeric/random/param_list|RealType}} | ||
+ | {{par end}} | ||
===Member types=== | ===Member types=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc hitem|Member type|Definition}} |
− | {{ | + | {{dsc|{{tt|result_type}} {{mark c++11}}|{{co|RealType}}}} |
− | {{ | + | {{cpp/numeric/random/param_type}} |
− | {{ | + | {{dsc end}} |
===Member functions=== | ===Member functions=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc constructor|exponential_distribution}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc reset|exponential_distribution}} |
− | {{ | + | {{dsc h2|Generation}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc operator()|exponential_distribution}} |
− | {{ | + | {{dsc h2|Characteristics}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/exponential_distribution/dsc lambda}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc param|exponential_distribution}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc min|exponential_distribution}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc max|exponential_distribution}} |
− | {{ | + | {{dsc end}} |
===Non-member functions=== | ===Non-member functions=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc operator_cmp|exponential_distribution}} |
− | {{ | + | {{dsc inc|cpp/numeric/random/distribution/dsc operator_ltltgtgt|exponential_distribution}} |
− | {{ | + | {{dsc end}} |
+ | |||
+ | ===Notes=== | ||
+ | Some implementations may occasionally return infinity if {{tt|RealType}} is {{c|float}}. This is {{lwg|2524}}. | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
− | + | ||
#include <iomanip> | #include <iomanip> | ||
− | #include < | + | #include <iostream> |
#include <map> | #include <map> | ||
#include <random> | #include <random> | ||
+ | #include <string> | ||
+ | |||
int main() | int main() | ||
{ | { | ||
Line 60: | Line 71: | ||
std::map<int, int> hist; | std::map<int, int> hist; | ||
− | for(int n=0; n | + | for (int n = 0; n != 10000; ++n) |
− | ++hist[2*d(gen)]; | + | ++hist[2 * d(gen)]; |
− | + | ||
− | for(auto | + | for (auto const& [x, y] : hist) |
− | std::cout << std::fixed << std::setprecision(1) | + | std::cout << std::fixed << std::setprecision(1) |
− | << | + | << x / 2.0 << '-' << (x + 1) / 2.0 << ' ' |
− | + | << std::string(y / 200, '*') << '\n'; | |
− | + | } | |
− | + | |p=true | |
+ | |output= | ||
0.0-0.5 ******************* | 0.0-0.5 ******************* | ||
0.5-1.0 *********** | 0.5-1.0 *********** | ||
Line 75: | Line 87: | ||
2.0-2.5 ** | 2.0-2.5 ** | ||
2.5-3.0 * | 2.5-3.0 * | ||
− | 3.0-3.5 | + | 3.0-3.5 |
− | 3.5-4.0 | + | 3.5-4.0 |
}} | }} | ||
===External links=== | ===External links=== | ||
− | [ | + | {{eli|[https://mathworld.wolfram.com/ExponentialDistribution.html Weisstein, Eric W. "Exponential Distribution."] From MathWorld — A Wolfram Web Resource.}} |
+ | |||
+ | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
Latest revision as of 10:29, 17 October 2023
Defined in header <random>
|
||
template< class RealType = double > class exponential_distribution; |
(since C++11) | |
Produces random non-negative floating-point values x, distributed according to probability density function:
- P(x|λ) = λe-λx
The value obtained is the time/distance until the next random event if random events occur at constant rate λ per unit of time/distance. For example, this distribution describes the time between the clicks of a Geiger counter or the distance between point mutations in a DNA strand.
This is the continuous counterpart of std::geometric_distribution.
std::exponential_distribution
satisfies RandomNumberDistribution.
Contents |
[edit] 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. |
[edit] Member types
Member type | Definition |
result_type (C++11)
|
RealType |
param_type (C++11)
|
the type of the parameter set, see RandomNumberDistribution. |
[edit] 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 lambda distribution parameter (rate of events) (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) |
[edit] 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) |
[edit] Notes
Some implementations may occasionally return infinity if RealType
is float. This is LWG issue 2524.
[edit] Example
Run this code
#include <iomanip> #include <iostream> #include <map> #include <random> #include <string> int main() { std::random_device rd; std::mt19937 gen(rd()); // if particles decay once per second on average, // how much time, in seconds, until the next one? std::exponential_distribution<> d(1); std::map<int, int> hist; for (int n = 0; n != 10000; ++n) ++hist[2 * d(gen)]; for (auto const& [x, y] : hist) std::cout << std::fixed << std::setprecision(1) << x / 2.0 << '-' << (x + 1) / 2.0 << ' ' << std::string(y / 200, '*') << '\n'; }
Possible output:
0.0-0.5 ******************* 0.5-1.0 *********** 1.0-1.5 ******* 1.5-2.0 **** 2.0-2.5 ** 2.5-3.0 * 3.0-3.5 3.5-4.0
[edit] External links
Weisstein, Eric W. "Exponential Distribution." From MathWorld — A Wolfram Web Resource. |