rand() / double(RAND_MAX)
génère un nombre aléatoire à virgule flottante compris entre 0 (inclus) et 1 ( inclusivement ), mais ce n'est pas une bonne méthode pour les raisons suivantes (car RAND_MAX est généralement 32767) :
- Le nombre de numéros aléatoires différents qui peuvent être générés est trop faible : 32768. Si vous avez besoin de plus de nombres aléatoires différents, vous devez utiliser une autre méthode (un exemple de code est donné ci-dessous)
- Les nombres générés sont trop grossiers : vous pouvez obtenir 1/32768, 2/32768, 3/32768, mais jamais rien d'intermédiaire.
- États limités du moteur du générateur de nombres aléatoires : après avoir généré des nombres aléatoires RAND_MAX, les implémentations commencent généralement à répéter la même séquence de nombres aléatoires.
En raison des limitations de rand() mentionnées ci-dessus, un meilleur choix pour la génération de nombres aléatoires entre 0 (inclus) et 1 ( exclusif ) serait le code suivant (similaire à l'exemple de l'adresse suivante http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution ):
#include <iostream>
#include <random>
#include <chrono>
int main()
{
std::mt19937_64 rng;
// initialize the random number generator with time-dependent seed
uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
std::seed_seq ss{uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed>>32)};
rng.seed(ss);
// initialize a uniform distribution between 0 and 1
std::uniform_real_distribution<double> unif(0, 1);
// ready to generate random numbers
const int nSimulations = 10;
for (int i = 0; i < nSimulations; i++)
{
double currentRandomNumber = unif(rng);
std::cout << currentRandomNumber << std::endl;
}
return 0;
}
Il est facile de le modifier pour générer des nombres aléatoires entre 1 (inclus) et 2 (exclus) en remplaçant unif(0, 1)
con unif(1, 2)
.
2 votes
Essayez d'ajouter
1
après le dernier)
15 votes
Notez que vous devez utiliser distribution_réelle_uniforme de toute façon pour ça. Si vous n'avez pas C++11, utilisez la fonction version améliorée .
0 votes
Erreur d'algèbre. Si
r
est un nombre aléatoire dans l'intervalle de zéro àm
alors le rapportr/m
sera dans l'intervalle(0,1)
peror/(m+1)
sera dans l'intervalle(0, m/(m+1))
PAS la gamme(1,2)
. Sim
est très grand (par rapport à un), alorsm/(m+1)
est approximativement égal à un, donc votre expressionr = ((double) rand() / (RAND_MAX + 1))
donnerait un nombre aléatoire approximativement dans l'intervalle (0,1) - c'est-à-dire, s'il n'y avait pas de débordement.