Genera un numero casuale tra 0 e 1 in C++

Jinku Hu 12 ottobre 2023
  1. Usa la libreria C++ 11 <random> per generare un numero casuale compreso tra 0 e 1
  2. Usa la funzione std::rand per generare un float casuale compreso tra 0 e 1 in C++
Genera un numero casuale tra 0 e 1 in C++

Questo articolo spiega diversi metodi C++ su come generare un float casuale in un intervallo da 0 a 1.

Usa la libreria C++ 11 <random> per generare un numero casuale compreso tra 0 e 1

La versione C++ 11 fornisce classi / metodi per la generazione di numeri casuali e pseudocasuali. Queste funzionalità di libreria standard sono consigliate per gestire la generazione di numeri casuali nella moderna codebase C++.

L’oggetto std::random_device viene inizializzato per primo; è un generatore di bit casuale uniforme non deterministico usato per inizializzare il motore di numeri casuali std::default_random_engine, che viene inizializzato nella riga successiva. In questo modo è garantito che il motore non produrrà le stesse sequenze di numeri.

Esistono diversi motori di numeri casuali implementati nella libreria C++ <random> e differiscono per alcuni fattori come i requisiti di tempo / spazio (vedere l’lista completo qui). Nel seguente esempio di seguito, mostriamo la generazione di float casuali usando std::default_random_engine. Possiamo specificare un determinato motore di algoritmo come richiesto dai vincoli dell’applicazione. Il passo successivo è inizializzare una distribuzione uniforme e passare i valori min / max come argomenti. Infine, stampiamo 5 valori in virgola mobile casuali nell’intervallo [0-1] sulla console.

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

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

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

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(6) << distr(eng) << "\n";
  }

  return EXIT_SUCCESS;
}

Produzione:

0.22808
0.343274
0.408204
0.687902
0.572947

Nota che std::uniform_real_distribution< T > produce un comportamento indefinito se uno dei seguenti tipi non viene passato come parametro del modello: float, double o long double a.

Usa la funzione std::rand per generare un float casuale compreso tra 0 e 1 in C++

La funzione rand fa parte delle strutture di generazione di numeri casuali della libreria standard C. Non è consigliato per applicazioni che richiedono casualità di alta qualità. Tuttavia, può essere utilizzato per scopi di test o per la generazione di numeri crittograficamente non sensibili.

La funzione rand genera un numero intero pseudo-casuale compreso tra 0 e RAND_MAX (entrambi inclusi). Poiché il valore RAND_MAX dipende dall’implementazione e il valore minimo garantito è solo 32767, i numeri generati hanno una casualità vincolata. Tieni presente che questa funzione deve essere inizializzata con std::srand (preferibilmente passando l’ora corrente usando std::time). Infine, possiamo generare valori in virgola mobile nell’intervallo [0-1].

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

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

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(6)
         << FLOAT_MIN +
                (float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
         << endl;

  return EXIT_SUCCESS;
}

Produzione:

0.483029
0.252537
0.264023
0.90233
0.573071
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

Articolo correlato - C++ Float