Cómo generar el doble aleatorio en C++

Jinku Hu 12 octubre 2023
  1. Usar la biblioteca de C++11 <random> para generar un doble aleatorio en C++
  2. Usa la función std::rand para generar un doble aleatorio en C++
Cómo generar el doble aleatorio en C++

Este artículo explicará varios métodos de cómo generar números aleatorios de doble punto flotante en C++.

Usar la biblioteca de C++11 <random> para generar un doble aleatorio en C++

Desde la versión C++11, la biblioteca estándar proporciona clases y métodos para la generación de números aleatorios y pseudoaleatorios. Cualquier aplicación que requiera números aleatorios de alta calidad debe utilizar estos métodos, pero otros casos también pueden beneficiarse de esta interfaz STL limpia y rica en características.

El objeto std::random_device, que se inicializa al principio, es un generador de bits aleatorios uniforme y no determinante que se utiliza para sembrar el motor de números aleatorios std::default_random_engine inicializado en la siguiente línea. Este paso asegura que el motor no produzca las mismas secuencias. Varios motores de números aleatorios están implementados en la biblioteca numérica de C++, y difieren en términos de requerimientos de tiempo/espacio (ver la lista completa aquí).

En el siguiente ejemplo, usamos std::default_random_engine para generar valores pseudo-aleatorios, pero puede inicializar el motor de algoritmo específico según lo requieran las restricciones de su aplicación. A continuación, inicializamos una distribución uniforme y pasamos valores min/max como argumentos opcionales. Finalmente, imprimimos 5 valores dobles aleatorios del intervalo [10-100] a la consola.

#include <iomanip>
#include <iostream>
#include <random>

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

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

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

73.68930968
24.37712986
40.37815433
77.24899374
94.62192505

Observe que std::uniform_real_distribution< T > produce un comportamiento indefinido si uno de los siguientes tipos no se pasa como parámetro de la plantilla: float, double, o long double. El siguiente ejemplo genera números de punto flotante de precisión simple:

#include <iomanip>
#include <iostream>
#include <random>

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

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

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Usa la función std::rand para generar un doble aleatorio en C++

La función de rand es parte de las facilidades de generación de números aleatorios de la biblioteca estándar C. No se recomienda para aplicaciones que requieran una aleatoriedad de alta calidad, pero puede ser utilizada para múltiples escenarios, por ejemplo, si se quiere llenar matrices o vectores con números aleatorios.

Esta función genera un número entero pseudoaleatorio entre 0 y RAND_MAX (ambos incluidos). Dado que el valor RAND_MAX depende de la implementación, y el valor mínimo garantizado es sólo 32767, los números generados tienen una aleatoriedad limitada. Esta función debe ser sembrada con std::srand (preferentemente pasando la hora actual usando std::time). Finalmente, podemos generar valores de doble precisión en coma flotante con algo de aritmética engorrosa.

#include <iomanip>
#include <iostream>
#include <random>

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(10)
         << MIN + (double)(rand()) / ((double)(RAND_MAX / (MAX - MIN))) << endl;
  return EXIT_SUCCESS;
}

Resultado:

84.70076228
11.08804226
20.78055909
74.35545741
18.64741151
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++ Double