Genera numero casuale nell'intervallo in C++

Jinku Hu 12 ottobre 2023
  1. Usa la libreria C++ 11 <random> per generare un numero casuale nell’intervallo
  2. Usa la funzione rand per generare un numero casuale nell’intervallo
Genera numero casuale nell'intervallo in C++

Questo articolo introdurrà più metodi C++ su come generare numeri casuali in un intervallo di numeri specificato.

Usa la libreria C++ 11 <random> per generare un numero casuale nell’intervallo

Il C++ ha aggiunto servizi di libreria standard per la generazione di numeri casuali con il rilascio C++ 11 sotto una nuova intestazione <random>. Le funzionalità del flusso di lavoro RNG fornite dall’intestazione <random> sono divise in due parti: motore casuale e distribuzione. Il motore casuale è responsabile della restituzione di bitstream imprevedibili. La distribuzione restituisce numeri casuali (del tipo specificato dall’utente) che soddisfano la specifica distribuzione di probabilità, ad es. uniforme, normale o altro.

All’inizio, l’utente dovrebbe inizializzare il motore casuale con il valore seed. Si consiglia di seminare il motore con std::random_device, l’origine specifica del sistema per i bit casuali non deterministici. Consente al motore di generare diversi flussi di bit casuali ad ogni esecuzione. D’altra parte, se l’utente ha bisogno di generare le stesse sequenze su più esecuzioni del programma, il motore casuale dovrebbe essere inizializzato con la costante int letterale.

Successivamente, l’oggetto di distribuzione viene inizializzato con argomenti di valori min / max per un intervallo, da cui vengono generati i numeri casuali. Nell’esempio seguente, usiamo uniform_int_distribution e produciamo 10 numeri interi per console 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;
}

Uscita (* casuale):

57; 38; 8; 69; 5; 27; 65; 65; 73; 4;

L’intestazione <random> fornisce più motori casuali con diversi algoritmi e compromessi di efficienza. Quindi, possiamo inizializzare il motore casuale specifico, come mostrato nel prossimo esempio di codice:

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

Uscita (* casuale):

59; 47; 81; 41; 28; 88; 10; 12; 86; 7;

Usa la funzione rand per generare un numero casuale nell’intervallo

La funzione rand fa parte della libreria standard C e può essere chiamata dal codice C++. Sebbene non sia consigliabile utilizzare la funzione rand per la generazione di numeri casuali di alta qualità, può essere utilizzata per riempire array o matrici con dati arbitrari per scopi diversi. In questo esempio, la funzione genera un numero intero casuale compreso tra 0 e l’intervallo numerico MAX. Nota che questa funzione dovrebbe essere inizializzata con std::srand (preferibilmente passando l’ora corrente con std::time(nullptr)) per generare valori diversi attraverso le ripetizioni multiple, e solo allora possiamo chiamare 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;
}

Uscita (* casuale):

36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
Autore: 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