clase std::uniform_int_distribution en C++

En probabilidad, la función de distribución uniforme discreta se refiere a la distribución con probabilidad constante para valores discretos en un rango y probabilidad cero fuera del rango. La función de densidad de probabilidad P(x) para una distribución discreta uniforme en el intervalo [a, b] es constante para valores discretos en el rango [a, b] y cero en caso contrario. Matemáticamente la función se define como: 

\[ f(x) = \begin{cases} \frac{1}{b-a}, & a\leq x \leq b\\ 0, & \text{otherwise}\\ \end{cases} \]

C++ ha introducido la clase uniform_int_distribution en la biblioteca aleatoria cuya función miembro proporciona números enteros aleatorios o valores discretos de un rango de entrada dado con probabilidad uniforme.
Funciones miembro públicas en la clase uniform_int_distribution:
 

  1. operator(): esta función devuelve un número aleatorio del rango de distribución dado. La probabilidad de obtener cualquier número de esta función es la misma. La función Operator() toma un tiempo constante para la generación. 
    Ejemplo: 
     

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;
}
Producción: 

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

 

Podríamos observar a partir de la salida que la probabilidad de cada número obtenido del número aleatorio está mucho más cerca de la probabilidad calculada. 
 

  1. a(): Devuelve el parámetro inferior del rango. Esto especifica el límite inferior del rango de valores potencialmente devueltos por su operador miembro(). 
     
  2. b(): Devuelve el parámetro más alto del rango. Esto especifica el límite superior del rango de valores potencialmente devueltos por su operador miembro(). 
     
  3. max(): esta función devuelve el límite superior más pequeño posible de salida posible de la función operator(). 
     
  4. min(): esta función devuelve el límite inferior más alto posible de salida posible de la función operator(). 
     
  5. reset(): esta función restablece la distribución de modo que las distribuciones posteriores no dependan de los números generados previamente. 
     

Ejemplo:
 

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;
}
Producción: 

Lower Bound 10
Upper Bound 100
Minimum possible output 10
Maximum possible output 100

 

Referencia: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
 

Publicación traducida automáticamente

Artículo escrito por AyushShukla8 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *