Gerar Número Aleatório na Gama em C++

Jinku Hu 12 outubro 2023
  1. Utilizar C++11 <random> Biblioteca para Gerar um Número Aleatório no Intervalo
  2. Utilize a função rand para gerar um número aleatório no intervalo
Gerar Número Aleatório na Gama em C++

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