Cómo generar un número aleatorio entre 0 y 1 en C++
-
Usa la librería de C++11
<random>
para generar un número aleatorio entre 0 y 1 -
Usa la función
std::rand
para generar un float 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
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