Genera un numero float casuale in C++

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

Questo articolo spiegherà diversi metodi su come generare un numero float casuale in C++.

Usa la libreria C++ 11 <random> per generare un float casuale

Questo metodo è il modo consigliato per generare numeri casuali di alta qualità nel C++ contemporaneo. All’inizio, l’oggetto std::random_device dovrebbe essere inizializzato. Produce bit casuali non deterministici per il seeding casuale del motore, che è fondamentale per evitare di produrre le stesse sequenze numeriche. In questo esempio usiamo std::default_random_engine per generare valori pseudo-casuali, ma puoi dichiarare un motore di algoritmo specifico (vedi l’lista completo qui). Successivamente, inizializziamo una distribuzione uniforme e passiamo i valori min / max come argomenti opzionali.

Di conseguenza, restituiamo 5 float casuali alla 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;
}

Produzione:

19.54383877
92.41870106
92.42645927
93.53035308
39.09127952

La versione precedente genera effettivamente valori in virgola mobile a doppia precisione (64 bit). Puoi personalizzare il tipo di float specificando float, double o long double in std::uniform_real_distribution< T >. Nota però che se l’argomento non è uno di questi, produce un comportamento indefinito. L’esempio seguente genera numeri in virgola mobile a precisione singola: The following example generates single-precision floating point numbers:

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

Usa la funzione rand per generare un flottante casuale

La funzione rand proviene dalla libreria C e non è consigliata se è richiesta la casualità della qualità. Questa funzione 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 da rand hanno una casualità vincolata. Si noti che questa funzione dovrebbe essere inizializzata con std::srand (preferibilmente passando l’argomento dell’ora corrente), e quindi possiamo generare valori in virgola mobile casuali con un po’ di aritmetica ingombrante.

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