C ++: générer distribution gaussienne
-
12-09-2019 - |
Question
Je voudrais savoir si, dans des bibliothèques C ++ standard est-il un nombre distribution gaussienne générateur, ou si vous avez un extrait de code pour passer.
Merci d'avance.
La solution
La bibliothèque standard ne fonctionne pas. Boost.Random fait, cependant. Je l'utilise que si je vous étais.
Autres conseils
C ++ Rapport technique 1 ajoute le support pour la génération de nombres aléatoires. Donc, si vous utilisez un compilateur relativement récent (c ++ 2008 visuelle GCC 4.3), il est probable qu'il est disponible hors de la boîte.
Voir pour l'utilisation de l'échantillon de std::tr1::normal_distribution
(et beaucoup d'autres).
Les bibliothèques GNU Scientific a cette fonctionnalité. GSL - gaussienne de distribution
La réponse à cette question change avec C ++ 11 qui a l'en-tête aléatoire qui comprend std :: normal_distribution . Le papier de Walter Brown N3551, génération de nombres aléatoires en C ++ 11 est probablement l'un des meilleurs introductions à cette bibliothèque.
Le code suivant montre comment utiliser cet en-tête ( voir vivre ) :
#include <iostream>
#include <iomanip>
#include <map>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::normal_distribution<> dist(2, 2);
std::map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[std::floor(dist(e2))];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
Je donne une série d'exemples de génération de nombres aléatoires plus générale en C ++ 11 dans ma réponse à C ++ génération de nombres aléatoires float avec un exemple en utilisant Boost et rand()
ainsi.