Como Gerar o Duplo Aleatório em C++

Jinku Hu 12 outubro 2023
  1. Use C++11 <random> Biblioteca para Gerar um Duplo Aleatório em C++
  2. Utilize std::rand Função para Gerar um Duplo Aleatório em C++
Como Gerar o Duplo Aleatório em C++

Este artigo explicará vários métodos de como gerar números aleatórios de pontos flutuantes em C++.

Use C++11 <random> Biblioteca para Gerar um Duplo Aleatório em C++

Desde a versão C++11, a biblioteca padrão fornece classes e métodos para geração de números aleatórios/pseudo-aleatórios. Qualquer aplicação que requeira números aleatórios de alta qualidade deve usar estes métodos, mas outros casos também podem se beneficiar desta interface STL limpa e rica em recursos.

O objeto std::random_device, que é inicializado no início, é 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 inicializado na linha seguinte. Esta etapa garante que o motor não produza as mesmas seqüências. Vários motores de números aleatórios são implementados na biblioteca de números C++, e diferem em termos de tempo/espaço (veja a lista completa aqui).

No exemplo a seguir, utilizamos std::default_random_engine para gerar valores pseudo-aleatórios, mas você pode inicializar o motor de algoritmo específico conforme exigido por suas restrições de aplicação. Em seguida, inicializamos uma distribuição uniforme e passamos valores min/max como argumentos opcionais. Finalmente, imprimimos 5 valores duplos aleatórios de [10-100] intervalo para o console.

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<double> distr(MIN, MAX);

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

  return EXIT_SUCCESS;
}

Resultado:

73.68930968
24.37712986
40.37815433
77.24899374
94.62192505

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. O seguinte exemplo gera números de ponto flutuante de precisão simples:

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

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

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

  return EXIT_SUCCESS;
}

Utilize std::rand Função para Gerar um Duplo Aleatório em C++

A função order é 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 aleatoriedade de alta qualidade, mas pode ser utilizada para múltiplos cenários, por exemplo, se se deseja preencher arrays ou vetores com números aleatórios.

Esta função gera um número 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 restringiram a aleatoriedade. Esta função deve ser semeada com std::srand (de preferência passando o tempo atual utilizando std::time). Finalmente, podemos gerar valores de ponto flutuante de precisão dupla com alguma aritmética incômoda.

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(10)
         << MIN + (double)(rand()) / ((double)(RAND_MAX / (MAX - MIN))) << endl;
  return EXIT_SUCCESS;
}

Resultado:

84.70076228
11.08804226
20.78055909
74.35545741
18.64741151
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++ Double