Cómo generar un número aleatorio entre 0 y 1 en C++

Jinku Hu 12 octubre 2023
  1. Usa la librería de C++11 <random> para generar un número aleatorio entre 0 y 1
  2. Usa la función std::rand para generar un float aleatorio entre 0 y 1 en C++
Cómo generar un número aleatorio entre 0 y 1 en C++

Este artículo explica varios métodos de C++ sobre cómo se puede generar un float aleatorio en un intervalo de 0 a 1.

Usa la librería de C++11 <random> para generar un número aleatorio entre 0 y 1

La versión C++11 proporciona clases/métodos para la generación de números aleatorios y pseudoaleatorios. Estas facilidades de biblioteca estándar se recomiendan para manejar la generación de números aleatorios en la moderna base de código C++.

El objeto std::random_device se inicializa primero; 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, que se inicializa en la siguiente línea. De esta manera se asegura que el motor no produzca las mismas secuencias de números.

Hay varios motores de números aleatorios que están implementados en la librería C++ <random>, y se diferencian en algunos factores como los requerimientos de tiempo/espacio (ver la lista completa aquí). En el siguiente ejemplo, demostramos la generación de floates aleatorios utilizando std::default_random_engine. Podemos especificar un determinado motor de algoritmo según lo requieran las restricciones de la aplicación. El siguiente paso es inicializar una distribución uniforme y pasar valores min/max como argumentos. Finalmente, imprimimos 5 valores de punto flotante aleatorios en el intervalo [0-1] a la consola.

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

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

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

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(6) << distr(eng) << "\n";
  }

  return EXIT_SUCCESS;
}

Resultado:

0.22808
0.343274
0.408204
0.687902
0.572947

Observe que std::uniform_real_distribution<T> produce un comportamiento indefinido si no se pasa uno de los siguientes tipos como parámetro de la plantilla: float, double, o long double a.

Usa la función std::rand para generar un float aleatorio entre 0 y 1 en C++

La función de rand es una parte de las instalaciones de generación de números aleatorios de la biblioteca estándar C. No se recomienda para aplicaciones que requieran aleatoriedad de alta calidad. Aún así, puede ser utilizada para propósitos de prueba o generación de números criptográficamente no sensibles.

La función rand 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 tienen una aleatoriedad limitada. Ten en cuenta que esta función debe ser sembrada con std::srand (preferentemente pasando la hora actual usando std::time). Finalmente, podemos generar valores de punto flotante en el intervalo de [0-1].

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

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

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(6)
         << FLOAT_MIN +
                (float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
         << endl;

  return EXIT_SUCCESS;
}

Resultado:

0.483029
0.252537
0.264023
0.90233
0.573071
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