Cómo generar un número aleatorio en el rango en C++

Jinku Hu 12 octubre 2023
  1. Usar la biblioteca de C++11 <random> para generar un número aleatorio en el intervalo
  2. Utilice la función rand para generar un número aleatorio en el rango
Cómo generar un número aleatorio en el rango en C++

En este artículo se presentarán múltiples métodos de C++ sobre cómo generar números aleatorios en un intervalo de números especificado.

Usar la biblioteca de C++11 <random> para generar un número aleatorio en el intervalo

El C++ añadió facilidades de librería estándar para la generación de números aleatorios con el lanzamiento de C++11 bajo un nuevo encabezado <random>. Las características de flujo de trabajo RNG proporcionadas por el encabezado <random> se dividen en dos partes: motor aleatorio y distribución. El motor aleatorio es responsable de devolver el flujo de bits impredecible. La distribución devuelve los números aleatorios (del tipo especificado por el usuario) que satisfacen la distribución de probabilidad específica, por ejemplo, uniforme, normal u otra.

Al principio, el usuario debe inicializar el motor aleatorio con el valor de la semilla. Se recomienda sembrar el motor con std::random_device, la fuente específica del sistema para los bits aleatorios no determinantes. Esto permite que el motor genere diferentes flujos de bits aleatorios en cada ejecución. Por otro lado, si el usuario necesita generar las mismas secuencias a través de múltiples ejecuciones del programa, el motor aleatorio debe ser inicializado con la constante int literal.

A continuación, el objeto de distribución se inicializa con argumentos de valores mín/máx para un intervalo, a partir del cual se generan los números aleatorios. En el siguiente ejemplo, usamos uniform_int_distribution y la salida 10 enteros para consolar arbitrariamente.

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

57; 38; 8; 69; 5; 27; 65; 65; 73; 4;

El encabezado <random> proporciona múltiples motores aleatorios con diferentes algoritmos y compensaciones de eficiencia. Por lo tanto, podemos inicializar el motor aleatorio específico, como se muestra en el siguiente ejemplo de código:

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::random_device rd;
  std::mt19937 eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

59; 47; 81; 41; 28; 88; 10; 12; 86; 7;

Utilice la función rand para generar un número aleatorio en el rango

La función rand es parte de la biblioteca estándar de C y puede ser llamada desde el código C++. Aunque no se recomienda utilizar la función rand para la generación de números aleatorios de alta calidad, puede ser utilizada para llenar matrices o arrays con datos arbitrarios para diferentes propósitos. En este ejemplo, la función genera un entero aleatorio entre 0 y el intervalo de números MAX. Nótese que esta función debe ser sembrada con std::srand (preferentemente pasando el tiempo actual con std::time(nullptr)) para generar diferentes valores a través de las múltiples ejecuciones, y sólo entonces podemos llamar al rand.

#include <ctime>
#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++) cout << rand() % MAX << "; ";
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Random