Cómo generar un número flotante aleatorio en C++

Jinku Hu 12 octubre 2023
  1. Usar la librería C++11 <random> para generar un número de flotante aleatorio
  2. Usa la función rand para generar una flotante aleatoria
Cómo generar un número flotante aleatorio en C++

Este artículo explicará varios métodos sobre cómo generar un número de flotante aleatorio en C++.

Usar la librería C++11 <random> para generar un número de flotante aleatorio

Este método es la forma recomendada de generar números aleatorios de alta calidad en C++ contemporáneo. Al principio, el objeto std::random_device debe ser inicializado. Produce bits aleatorios no determinantes para la siembra de motores aleatorios, lo que es crucial para evitar producir las mismas secuencias de números. En este ejemplo usamos std::default_random_engine para generar valores pseudo-aleatorios, pero puedes declarar un motor algorítmico específico (ver la lista completa aquí). A continuación, inicializamos una distribución uniforme y pasamos valores min/max como argumentos opcionales.

Como resultado, emitimos 5 floates aleatorios a la consola.

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

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

constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<> distr(FLOAT_MIN, FLOAT_MAX);

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

  return EXIT_SUCCESS;
}

Resultado:

19.54383877
92.41870106
92.42645927
93.53035308
39.09127952

La versión anterior genera en realidad valores de coma flotante de doble precisión (64 bits). Puedes personalizar el tipo de float especificando float, double, o long double a std::distribución_real_uniforme< T >. Sin embargo, ten en cuenta que si el argumento no es uno de estos, produce un comportamiento indefinido. 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;

constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;

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

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

  return EXIT_SUCCESS;
}

Usa la función rand para generar una flotante aleatoria

La función de rand viene de la biblioteca C y no se recomienda si se requiere la aleatoriedad de la calidad. Esta función genera un número entero pseudo-aleatorio 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 por rand tienen una aleatoriedad limitada. Note que esta función debe ser sembrada con std::srand (preferentemente pasando el argumento del tiempo actual), y entonces podemos generar valores aleatorios en coma flotante con alguna aritmética engorrosa.

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

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

constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;

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

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

  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(10)
         << FLOAT_MIN +
                (float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
         << endl;
  return EXIT_SUCCESS;
}
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++ Float