Como gerar um número de flutuação aleatório em C++

Jinku Hu 12 outubro 2023
  1. Use C++11 <random> Biblioteca para Gerar uma flutuação aleatória
  2. Utilize a função rand para gerar um ponto flutuante aleatório
Como gerar um número de flutuação aleatório em C++

Este artigo explicará vários métodos sobre como gerar um número aleatório de flutuação em C++.

Use C++11 <random> Biblioteca para Gerar uma flutuação aleatória

Este método é a forma recomendada de gerar números aleatórios de alta qualidade em C++ contemporâneos. A princípio, o objeto std::random_device deve ser inicializado. Ele produz bits aleatórios não determinísticos para a semeadura de motores aleatórios, o que é crucial para evitar a produção das mesmas seqüências de números. Neste exemplo, usamos std::default_random_engine para gerar valores pseudo-aleatórios, mas você pode declarar um algoritmo específico (veja a lista completa aqui). Em seguida, inicializamos uma distribuição uniforme e passamos valores min/max como argumentos opcionais.

Como resultado, emitimos 5 bóias aleatórias para o console.

#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

A versão anterior realmente gera valores de ponto flutuante de precisão dupla (64 bits). Você pode personalizar o tipo de flutuador especificando float, double, ou long double para std::uniform_real_distribution< T >. Observe que, se o argumento não for um desses, ele produz um comportamento indefinido. O exemplo seguinte gera números de ponto flutuante de precisão única:

#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;
}

Utilize a função rand para gerar um ponto flutuante aleatório

A função rand vem da biblioteca C e não é recomendada se a aleatoriedade de qualidade for necessária. Esta função gera um inteiro pseudo-aleatória entre 0 e RAND_MAX (ambos incluídos). Como o valor RAND_MAX é dependente da implementação e o valor mínimo garantido é de apenas 32767, os números gerados pelo rand restringiram a aleatoriedade. Note que esta função deve ser semeada com std::srand (de preferência passando o argumento de tempo atual), e então podemos gerar valores de ponto flutuante aleatórios com alguma aritmética incômoda.

#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

Artigo relacionado - C++ Float