8
votes

C ++: générer une distribution gaussienne

J'aimerais savoir si dans les bibliothèques standard C ++ Il y a une Générateur de numéros gaussiennes , ou si vous avez un extrait de code à passer.

Merci d'avance.


1 commentaires

Code CA L'extrait de code est disponible dans une similaire, une question ultérieure (cliquez ici)


4 Réponses :


15
votes

La bibliothèque standard ne le fait pas. Boost.Random fait cependant. J'utiliserais ça si j'étais toi.


0 commentaires

6
votes

1 commentaires

Lol, j'ai écrit ça avant de regarder la réponse ... Je suppose que je devrais le changer :)



13
votes

Rapport technique C ++ 1 ajoute la prise en charge de la génération de nombres aléatoires. Donc, si vous utilisez un compilateur relativement récent (Visual C ++ 2008 GCC 4.3), des chances sont qu'il est disponible hors de la boîte.

voir ici pour l'échantillon d'utilisation de std :: tr1 :: normale_distribution (et beaucoup d'autres).


1 commentaires

Si ce n'est pas encore là, vous pouvez aussi le trouver dans le cadre de Boost aussi: boost.org/doc/libs/1_39_0/doc/html/boost_tr1/...



4
votes

La réponse à cette question change avec C ++ 11 qui a le Random Header qui inclut std :: normal_distribution . Le papier de Walter Brown's N3551, génération de nombres aléatoires en C ++ 11 A > est probablement l'une des meilleures introductions à cette bibliothèque.

Le code suivant montre comment utiliser cet en-tête ( Voir It Live em>) : P>

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


0 commentaires