Gerar Número Aleatório na Gama em C++
-
Utilizar C++11
<random>
Biblioteca para Gerar um Número Aleatório no Intervalo -
Utilize a função
rand
para gerar um número aleatório no intervalo
Este artigo irá introduzir múltiplos métodos C++ de como gerar números aleatórios num intervalo de números especificado.
Utilizar C++11 <random>
Biblioteca para Gerar um Número Aleatório no Intervalo
A biblioteca C++ adicionou facilidades padrão para a geração de números aleatórios com a versão C++11 sob um novo cabeçalho <random>
. As características do fluxo de trabalho RNG fornecidas pelo cabeçalho <random>
está dividido em duas partes: motor aleatório e distribuição. O motor aleatório é responsável pelo retorno de fluxo de bits imprevisível. A distribuição retorna números aleatórios (do tipo especificado pelo utilizador) que satisfazem a distribuição de probabilidade específica, por exemplo, uniforme, normal ou outra.
No início, o utilizador deve inicializar o motor aleatório com o valor da semente. É recomendado semear o motor com std::random_device
, a fonte específica do sistema para bits aleatórios não-determinísticos. Permite que o motor gere diferentes fluxos aleatórios de bits em cada execução. Por outro lado, se o utilizador precisar de gerar as mesmas sequências em múltiplas execuções de programas, o motor aleatório deve ser inicializado com a constante int
literal.
A seguir, o objecto de distribuição é inicializado com argumentos de valores min/max para um intervalo, a partir do qual os números aleatórios são gerados. No exemplo seguinte, utilizamos o uniform_int_distribution
e produzimos 10 inteiros para consolar arbitrariamente.
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_int_distribution<int> distr(MIN, MAX);
for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
cout << distr(eng) << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
57; 38; 8; 69; 5; 27; 65; 65; 73; 4;
O cabeçalho <random>
fornece múltiplos motores aleatórios com diferentes algoritmos e compensações de eficiência. Assim, podemos inicializar o motor aleatório específico, como se mostra na próxima amostra de código:
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<int> distr(MIN, MAX);
for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
cout << distr(eng) << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
59; 47; 81; 41; 28; 88; 10; 12; 86; 7;
Utilize a função rand
para gerar um número aleatório no intervalo
A função rand
faz parte da biblioteca padrão C e pode ser chamada a partir do código C++. Embora não seja recomendada a utilização da função rand
para geração de números aleatórios de alta qualidade, pode ser utilizada para preencher arrays ou arrays com dados arbitrários para diferentes fins. Neste exemplo, a função gera um número inteiro aleatório entre 0 e um intervalo de números MAX
. Note-se que esta função deve ser semeada com std::srand
(de preferência passando a hora actual com std::time(nullptr)
) para gerar valores diferentes nas múltiplas execuções, e só então podemos chamar a função rand
.
#include <ctime>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::srand(std::time(nullptr));
for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++) cout << rand() % MAX << "; ";
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
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