Generare un double casuale in C++

Jinku Hu 12 ottobre 2023
  1. Usa la libreria C++ 11 <random> per generare un double casuale in C++
  2. Usa la funzione std::rand per generare un double casuale in C++
Generare un double casuale in C++

Questo articolo spiegherà diversi metodi su come generare numeri in virgola mobile doppi casuali in C++.

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

Dalla versione C++ 11, la libreria standard fornisce classi e metodi per la generazione di numeri casuali / pseudo-casuali. Qualsiasi applicazione che richiede numeri casuali di alta qualità deve utilizzare questi metodi, ma anche altri casi possono trarre vantaggio da questa interfaccia STL pulita e ricca di funzionalità.

L’oggetto std::random_device, che viene inizializzato all’inizio, è un generatore di bit casuale uniforme non deterministico usato per seminare il motore di numeri casuali std::default_random_engine inizializzato sulla riga successiva. Questo passaggio garantisce che il motore non produca le stesse sequenze. Diversi motori di numeri casuali sono implementati nella libreria numerica C++ e differiscono in termini di requisiti di tempo / spazio (vedere l’lista completo qui).

Nel seguente esempio, usiamo std::default_random_engine per generare valori pseudo-casuali, ma puoi inizializzare il motore dell’algoritmo specifico come richiesto dai vincoli dell’applicazione. Successivamente, inizializziamo una distribuzione uniforme e passiamo i valori min / max come argomenti opzionali. Infine, stampiamo 5 valori double casuali dall’intervallo [10-100] alla console.

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<double> distr(MIN, MAX);

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

73.68930968
24.37712986
40.37815433
77.24899374
94.62192505

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. L’esempio seguente genera numeri in virgola mobile a precisione singola.

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<float> distr(MIN, MAX);

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Usa la funzione std::rand per generare un double casuale in C++

La funzione rand fa parte delle strutture per la generazione di numeri casuali della libreria standard C. Non è consigliato per applicazioni che richiedono casualità di alta qualità, ma può essere utilizzato per più scenari, ad es. se si vogliono riempire matrici o vettori con numeri casuali.

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 hanno una casualità vincolata. Questa funzione dovrebbe essere inizializzata con std::srand (preferibilmente passando l’ora corrente usando std::time). Infine, possiamo generare valori in virgola mobile a doppia precisione con alcuni complicati calcoli aritmetici.

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

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

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(10)
         << MIN + (double)(rand()) / ((double)(RAND_MAX / (MAX - MIN))) << endl;
  return EXIT_SUCCESS;
}

Produzione:

84.70076228
11.08804226
20.78055909
74.35545741
18.64741151
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++ Double