std::uniform_int_distribution class in C++
In Probability, Discrete Uniform Distribution Function refers to the distribution with constant probability for discrete values over a range and zero probability outside the range. The probability density function P(x) for uniform discrete distribution in interval [a, b] is constant for discrete values in the range [a, b] and zero otherwise. Mathematically the function is defined as:
[Tex]\[ f(x) = \begin{cases} \frac{1}{b-a}, & a\leq x \leq b\\ 0, & \text{otherwise}\\ \end{cases} \] [/Tex]
C++ have introduced uniform_int_distribution class in the random library whose member function give random integer numbers or discrete values from a given input range with uniform probability.
Public member functions in uniform_int_distribution class:
- operator(): This function returns a random number from the given range of distribution. The probability for any number to be obtained from this function is same. Operator() function takes constant time for generation.
Example:
CPP
// C++ code to demonstrate the working of // operator() function #include <iostream> // for uniform_int_distribution function #include <random> using namespace std; int main() { // Here default_random_engine object // is used as source of randomness // We can give seed also to default_random_engine // if psuedorandom numbers are required default_random_engine generator; int a = 0, b = 9; // Initializing of uniform_int_distribution class uniform_int_distribution< int > distribution(a, b); // number of experiments const int num_of_exp = 10000; int n = b - a + 1; int p[n] = {}; for ( int i = 0; i < num_of_exp; ++i) { // using operator() function // to give random values int number = distribution(generator); ++p[number-a]; } cout << "Expected probability: " << float (1) / float (n) << endl; cout << "uniform_int_distribution (" << a << ", " << b << ")" << endl; // Displaying the probability of each number // after generating values 10000 times. for ( int i = 0; i < n; ++i) cout << a + i << ": " << ( float )p[i] / ( float )(num_of_exp) << endl; return 0; } |
Output:
Expected probability: 0.1 uniform_int_distribution (0, 9) 0: 0.0993 1: 0.1007 2: 0.0998 3: 0.0958 4: 0.1001 5: 0.1049 6: 0.0989 7: 0.0963 8: 0.1026 9: 0.1016
We could observe from the output that the probability of each number obtained from the random number is much closer to calculated probability.
- a(): Returns the lower parameter of range. This specifies the lower bound of the range of values potentially returned by its member operator().
- b(): Returns the higher parameter of range. This specifies the upper bound of the range of values potentially returned by its member operator().
- max(): This function return the possible smallest upper bound of output possible from the operator() function.
- min(): This function return the possible highest lower bound of output possible from the operator() function.
- reset(): This function resets the distribution such that subsequent distributions are not dependent on the previously generated numbers.
Example:
CPP
// C++ code to demonstrate the working of // a(), b(), min(), max(), reset() function #include <iostream> // for uniform_int_distribution function #include <random> using namespace std; int main() { int a = 10, b = 100; // Initializing of uniform_int_distribution class uniform_int_distribution< int > distribution(a, b); // Using a() and b() cout << "Lower Bound" << " " << distribution.a() << endl; cout << "Upper Bound" << " " << distribution.b() << endl; // Using min() and max() cout << "Minimum possible output" << " " << distribution.min() << endl; cout << "Maximum possible output" << " " << distribution.max() << endl; // Using reset() distribution.reset(); return 0; } |
Output:
Lower Bound 10 Upper Bound 100 Minimum possible output 10 Maximum possible output 100
Reference: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
Contact Us