Como gerar um número de flutuação aleatório em C++
-
Use C++11
<random>
Biblioteca para Gerar uma flutuação aleatória -
Utilize a função
rand
para gerar um ponto flutuante aleatório
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;
}
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