encabezado aleatorio en C++ | Conjunto 1 (generadores)

Este encabezado presenta las instalaciones de generación de números aleatorios. Esta librería permite producir números aleatorios usando combinaciones de generadores y distribuciones.

  • Generadores : Objetos que generan números uniformemente distribuidos.
  • Distribuciones : Objetos que transforman secuencias de números generados por un generador en secuencias de números que siguen una distribución variable aleatoria específica, como uniforme, Normal o Binomial.

Generadores

I. Motores de números pseudoaleatorios: utilizan un algoritmo para generar números aleatorios a partir de una semilla inicial. Estos son:

random number engines

1. linear_congruential_engine : es el motor más simple de la biblioteca STL que genera números enteros aleatorios sin signo. Sigue: 

 x = (a.x +c) mod m 
Where x= current state value  
            a = multiplier parameter ; if m is not zero, 
            this parameter should be lower than m.
            c = increment parameter ; if m is not zero, 
            this parameter should be lower than m.
            m = modulus parameter 
  • operator(): Genera números aleatorios.
  • min: Da el valor mínimo devuelto por el operador miembro().
  • max: Da el valor máximo devuelto por el operador miembro().

C++

// C++ program to illustrate
// the use of operator(), max and min
// in linear_congruential_engine
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
 
// driver program
int main ()
{
 
    // finds the time between the system clock
    //(present time) and clock's epoch
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
     
    // minstd_rand0 is a standard
    // linear_congruential_engine
    minstd_rand0 generator (seed);
     
    // generates the random number
    cout << generator() << " is a random number between ";
     
    //use of min and max functions
    cout << generator.min() << " and " << generator.max();
     
    return 0;
}

Producción:

211182246 is a random number between 1 and 2147483646

2. mersenne_twister_engine: Es un motor de números aleatorios basado en el algoritmo Mersenne Twister. Produce números aleatorios enteros sin signo de alta calidad en el intervalo [0, (2^w)-1].
donde ‘w’ es el tamaño de palabra: Número de bits de cada palabra en la secuencia de estado. 

  • operator(): Genera el número aleatorio.
  • min: Devuelve el valor mínimo devuelto por el operador miembro(), que para mersenne_twister_engine siempre es cero.
  • max: Devuelve el valor máximo devuelto por el operador miembro(), que para mersenne_twister_engine es 2w-1 (donde w es el tamaño de la palabra).

C++

// C++ program to illustrate the use of
// operator(), min and max
// in mersenne_twister_engine
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
 
// Driver program
int main ()
{
     
    // finds the time between the system clock
    // (present time) and clock's epoch
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
     
    // mt19937 is a standard mersenne_twister_engine
    mt19937 generator (seed);
     
    // use of operator()
    cout << generator() << " is a random number between ";
     
    // use of max and min
    cout << generator.min() << " and " << generator.max();
     
    return 0;
}

Producción:

3348201622 is a random number between 0 and 4294967295

3. subtract_with_carry_engine: es un motor generador de números pseudoaleatorios que produce números enteros sin signo.
El algoritmo utilizado es un generador de Fibonacci retrasado , con una secuencia de estado de elementos enteros r, más un valor de acarreo.

  • operator() : Genera el número aleatorio.
  • max : Devuelve el valor máximo devuelto por el operador miembro(), que es (2^w)-1 para subtract_with_carry_engine , donde ‘w’ es el tamaño de la palabra.
  • min : Devuelve el valor mínimo devuelto por el operador miembro(), que siempre es cero para subtract_with_carry_engine.

C++

// C++ program to illustrate the use of
// operator(), min and max
// in subtract_with_carry_engine
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
 
// Driver program
int main ()
{
     
    // finds the time between the system clock
    // (present time) and clock's epoch
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
     
    subtract_with_carry_engine<unsigned, 24, 10, 24> generator (seed);
     
    // use of operator()
    cout << generator() << " is a random number between ";
     
    // use of min and max
    cout << generator.min() << " and " << generator.max();
 
    return 0;
}

Producción:

8606455 is a random number between 0 and 16777215

II. Generador de números aleatorios : Es un generador de números aleatorios que produce números aleatorios no deterministas.

  • random_device : Es el verdadero generador de números aleatorios.
  • operator() : Devuelve un nuevo número aleatorio.
  • min : Devuelve el valor mínimo devuelto por el operador miembro(), que para random_device siempre es cero.
  • max : Devuelve el valor máximo devuelto por el operador miembro().

C++

// C++ program to illustrate the use of
// operator(), min and max
// in random_device
#include <iostream>
#include <random>
using namespace std;
 
//Driver program
int main ()
{
    random_device example;
     
    cout << "default random_device characteristics:" << endl;
     
    // use of min
    cout << "minimum: " << example.min() << endl;
     
    // use of max
    cout << "maximum: " << example.max() << endl;
     
    // use of entropy
    cout << "entropy: " << example.entropy() << endl;
     
    // use of operator()
    cout << "a random number: " << example() << endl;
     
    return 0;
}

Producción:

default random_device characteristics:
minimum: 0
maximum: 4294967295
entropy: 0
a random number: 3705944883

tercero Motores de números pseudoaleatorios (instancias) : Estas son las instancias particulares de los motores generadores y adaptadores:

Pseudo-random number engines (instantiations)

1. default_random_engine : esta es una clase de motor de números aleatorios que genera números pseudoaleatorios.

  • min : Devuelve el valor mínimo dado por operator().
  • max : Devuelve el valor máximo dado por operator().
  • operator() : Devuelve un nuevo número aleatorio.
    La función cambia el estado interno por uno, lo que modifica el valor del estado de acuerdo con el algoritmo dado:
 x= (a.x + c)mod m
 Where x= current state value
 a and c = respective class template parameters
 m = class template parameter 

C++

// C++ program to illustrate the use of 
// operator(), min and max
// in default_random_engine 
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
// Driver program 
int main ()
{
       
    // finds the time between the system clock
    // (present time) and clock's epoch 
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
       
    // minstd_rand0 is a standard linear_congruential_engine
    minstd_rand0 generator (seed); 
       
    // generates the random number
    cout << generator() << " is a random number between ";
       
    // Use of min and max
    cout << generator.min() << " and " << generator.max();
       
    return 0;
}

Producción:

201066682 is a random number between 1 and 2147483646

2. minstd_rand: Genera números pseudoaleatorios; es similar al generador lineal congruente

  • operator(): Devuelve un nuevo número aleatorio. La función cambia el estado interno por uno, lo que modifica el valor del estado según el siguiente algoritmo:
x = (a.x + c) mod m
where x= current state value
a ,c and m=class template parameter
  • min: Devuelve el valor mínimo dado por el operador miembro().
  • max: Devuelve el valor máximo dado por el operador miembro(), que para linear_congruential_engine es (módulo-1).

C++

// C++ program to illustrate
// the use of operator(), max and min
// in minstd_rand
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
//Driver program
int main ()
{
       
   // finds the time between the system clock
  //(present time) and clock's epoch   
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
     
  // minstd_rand0 is a standard
  //linear_congruential_engine
  minstd_rand0 generator (seed);
     
  // use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

489592737 is a random number between 1 and 2147483646

3. mt19937: Es el generador Mersenne Twister 19937. Es un generador pseudoaleatorio de números de 32 bits con un tamaño de estado de 19937 bits.

  • operator(): Genera un número aleatorio. La función cambia el estado interno por uno utilizando un algoritmo de transición que produce un giro en el elemento seleccionado.
  • max: Devuelve el valor máximo dado por operator().
  • min: Devuelve el valor mínimo dado por operator().
     

C++

// C++ program to illustrate the 
// use of operator(),min and max 
// in mt19937
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
// Driver program
int main ()
{
       
  // finds the time between the system clock
  //(present time) and clock's epoch     
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
     
  // mt19937 is a standard 
  //mersenne_twister_engine
  mt19937 generator (seed);  
   
  //use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

1445431990 is a random number between 0 and 4294967295

4. ranlux24_base: Es el generador base Ranlux 24. Es un generador pseudoaleatorio de resta con acarreo de números de 24 bits, generalmente utilizado como motor base para el generador ranlux24.

  • operator(): Devuelve un nuevo número aleatorio.
    La función cambia el estado interno llamando a su algoritmo de transición que aplica una operación de resta con acarreo en el elemento.
  • max: Devuelve el valor máximo dado por operator().
  • min: Devuelve el valor mínimo dado por operator().

C++

// C++ program to illustrate 
// the use of operator(),min and max
// in ranlux24_base
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
//Driver program
int main ()
{
       
  // finds the time between the system clock
  //(present time) and clock's epoch      
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
  subtract_with_carry_engine<unsigned,24,10,24> generator (seed);
   
  //use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

7275352 is a random number between 0 and 16777215

Se aplica un formato similar para los otros ejemplos.

IV. Adaptadores de motor

1. descartar_bloque_engine: Es una plantilla de clase de adaptador de motor que adapta un tipo de motor generador de números pseudoaleatorios usando solo elementos ‘r’ de cada bloque de elementos ‘p’ de la secuencia que produce, descartando el resto.
El adaptador mantiene un recuento interno de cuántos elementos se han producido en el bloque actual.

Los generadores estándar ranlux24 y ranlux48 adaptan un subtract_with_carry_engine utilizando este adaptador.

  • operator(): Devuelve un nuevo número aleatorio.
  • max: Devuelve el valor máximo dado por operator().
  • min: Devuelve el valor mínimo dado por operator().

C++

// C++ program to illustrate
// the use of operator(),min and max
// in the discard_block_engine
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
//Driver program
int main ()
{
       
  // finds the time between the system clock
  //(present time) and clock's epoch   
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
   
  // ranlux24 is a standard instantiation 
  //of discard_block_engine:
  ranlux24 generator (seed);
   
  //use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

8132325 is a random number between 0 and 16777215

2. independent_bits_engine: es una plantilla de clase de adaptador de motor que adapta un tipo de motor generador de números pseudoaleatorios para producir números aleatorios con un número específico de bits (w).

  • operator(): Devuelve un nuevo número aleatorio.
    El algoritmo de transición del motor invoca el miembro operator() de los motores base tantas veces como sea necesario para obtener suficientes bits significativos para construir un valor aleatorio.
  • max: Devuelve el valor máximo dado por operator().
  • min: Devuelve el valor mínimo dado por operator().

C++

// C++ program to illustrate
// the use of operator(),min and max
// in independent_bits_engine
#include <iostream>
#include <chrono>
   
// It imports the symbol names in 
// std namespace and possibly in Global namespace.
#include <cstdint>
#include <random>
using namespace std;
   
//Driver program
int main ()
{
       
  // finds the time between the system clock
  //(present time) and clock's epoch    
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
   
  //use of independent_bits_engine
  independent_bits_engine<mt19937,64,uint_fast64_t> generator (seed);
   
  //use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

13551674127875514537 is a random number between 0 and 184467

3. shuffle_order_engine: es una plantilla de clase de adaptador de motor que adapta un tipo de motor generador de números pseudoaleatorios para que los números se entreguen en una secuencia diferente.
El objeto mantiene un búfer de k números generados internamente y, cuando se le solicita, devuelve un número seleccionado aleatoriamente dentro del búfer, reemplazándolo con un valor obtenido de su motor base.

  • operator(): Devuelve un nuevo número aleatorio.
    El algoritmo de transición del motor elige un valor en la tabla interna (que es devuelto por la función) y lo reemplaza con un nuevo valor obtenido de su motor base.
  • max: Devuelve el valor máximo dado por operator().
  • min: Devuelve el valor mínimo dado por operator().

C++

// C++ program to illustrate
// the use of operator(),min and max
// in shuffle_order_engine
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
   
int main ()
{
       
  // finds the time between the system clock
  //(present time) and clock's epoch    
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
   
  // ranlux24 is a standard instantiation
  // of discard_block_engine:
  ranlux24 generator (seed);
   
  //use of operator()
  cout << generator() << " is a random number between ";
     
  //use of max and min
  cout << generator.min() << " and " << generator.max();
   
  return 0;
}

Producción:

9213395 is a random number between 0 and 16777215

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *