Gerar um número aleatório entre 0 e 1 em C++

Jinku Hu 12 outubro 2023
  1. Utilize C++11 <random> Biblioteca para Gerar um número aleatório entre 0 e 1
  2. Utilizar std::rand Função para gerar uma flutuação aleatória entre 0 e 1 em C++
Gerar um número aleatório entre 0 e 1 em C++

Este artigo explica vários métodos C++ sobre como se pode gerar uma flutuação aleatória em intervalos de 0 a 1.

Utilize C++11 <random> Biblioteca para Gerar um número aleatório entre 0 e 1

A versão C++11 fornece classes/métodos para a geração de números aleatórios e pseudorandômicos. Estas facilidades padrão de biblioteca são recomendadas para a manipulação da geração de números aleatórios na moderna base de códigos C++.

std::random_device é inicializado primeiro; é um gerador de bits aleatórios uniforme não determinístico utilizado para semear o motor de números aleatórios std::default_random_engine, que é inicializado na linha seguinte. Desta forma, assegura-se que o motor não produzirá as mesmas sequências de números.

Existem vários motores de números aleatórios que são implementados na biblioteca C++ <random>, e diferem em alguns factores como requisitos de tempo/espaço (ver a lista completa aqui). No exemplo seguinte abaixo, demonstramos a geração de flutuações aleatórias utilizando std::default_random_engine. Podemos especificar um determinado motor de algoritmo, conforme exigido pelas restrições da aplicação. O passo seguinte é inicializar uma distribuição uniforme e passar valores min/max como argumentos. Finalmente, imprimimos 5 valores aleatórios de ponto flutuante em intervalo [0-1] para a 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

Note que std::uniform_real_distribution< T > produz um comportamento indefinido se um dos seguintes tipos não for passado como parâmetro modelo: float, double, ou long double até.

Utilizar std::rand Função para gerar uma flutuação aleatória entre 0 e 1 em C++

A função rand é uma parte das instalações de geração de números aleatórios da biblioteca padrão C. Não é recomendada para aplicações que exijam uma aleatoriedade de alta qualidade. Ainda assim, pode ser utilizada para fins de teste ou geração de números criptográficos não sensíveis.

A função rand gera um inteiro pseudo-aleatória entre 0 e RAND_MAX (ambos incluídos). Uma vez que o valor RAND_MAX é dependente da implementação, e o valor mínimo garantido é de apenas 32767, os números gerados têm restringido a aleatoriedade. Tenha em mente que esta função deve ser semeada com std::srand (de preferência passando a hora actual utilizando std::time). Finalmente, podemos gerar valores de ponto flutuante no 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

Artigo relacionado - C++ Float