IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

factorisation de boost


Sujet :

Boost C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut factorisation de boost
    bonjour,

    dans le cadre d'un travail, je dois utiliser le random de la librarie boost

    pour cela , j'ai une classe random que voici.


    Random.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #ifndef RANDOM_HPP
    #define RANDOM_HPP
     
    #include <boost/random.hpp>
     
    #include "Singleton.hpp"
     
    const double PI = 3.14159265358979323846;
     
    class CRandom : public CSingleton<CRandom>{
     
        friend class CSingleton<CRandom>;
     
        private: 
     
    		static boost::mt19937 rand_gen;
     
    		static boost::uniform_01<boost::mt19937> uni;
    		static boost::normal_distribution<double> norm;
    		static boost::normal_distribution<double> norm_P;
    		static boost::triangle_distribution<double> tri;
    		static boost::exponential_distribution<double> expo;
     
    		static boost::variate_generator
    		    <boost::mt19937&,boost::normal_distribution<double> > normal;
    		static boost::variate_generator
    		    <boost::mt19937&,boost::normal_distribution<double> > normal_P;
    		static boost::variate_generator
    		    <boost::mt19937&,boost::triangle_distribution<double> > triangle;
    		static boost::variate_generator
    		    <boost::mt19937&,boost::exponential_distribution<double> > expon;
     
         CRandom(){};
     
        public:  
    		 double Rand(bool P=false);
    };
     
     
    #endif

    et voici le fichier .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include "Random.hpp"
    #include "General.hpp"
     
    boost::mt19937 CRandom::rand_gen(std::time(NULL));
     
    boost::uniform_01<boost::mt19937> CRandom::uni(rand_gen);
     
    boost::normal_distribution<double> CRandom::norm(0,1);
    boost::variate_generator <boost::mt19937&,
    		boost::normal_distribution<double> >
    			CRandom::normal(CRandom::rand_gen,norm);
     
    boost::normal_distribution<double> CRandom::norm_P(PI,PI);
    boost::variate_generator <boost::mt19937&,
    		boost::normal_distribution<double> > 
    			CRandom::normal_P(CRandom::rand_gen,norm_P);
     
    boost::triangle_distribution<double> CRandom::tri(0,1,1);
    boost::variate_generator <boost::mt19937&,
    		boost::triangle_distribution<double> > 
    			CRandom::triangle(CRandom::rand_gen,tri);
     
    boost::exponential_distribution<double> CRandom::expo(PI);			
    boost::variate_generator <boost::mt19937&,
    		boost::exponential_distribution<double> > 
    			CRandom::expon(CRandom::rand_gen,expo);
     
     
    double CRandom::Rand(bool P){
    		double a;
    		if(GENERAL.distribution == UNIFORM){
    			a= uni();
    		}else  if(GENERAL.distribution == NORMAL){
    			if (P) a= normal_P();
    			else a = normal();		
    		}else  if(GENERAL.distribution == TRIANGLULAIRE){
    			a = triangle();
    		}else  if(GENERAL.distribution == EXPO){
    			a = expon();
    		}
    		return a;
     
     
    }

    comme vous le voyez, ce truc est immonde et c'est statique (quand je veux changer qqch, je dois tout recompiler) . en fait, ce que j'aimerais, c'est pouvoir choisir dynamiquement les parametres des distributions (par exemple choisir a l'execution le parametre de la distribution exponentiel, ou bien ne pas avoir deux distribution normal, mais 1 dont je peux choisir les parametres.)

    le probleme est que je ne m'y connait absolument pas en boost pour pouvoir faire cela. si qqn pouvait me montré pour que j'apprenne.

    merci

    a+++

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ce n'est pas un problème de Boost, mais un problème de conception.
    Tout d'abord, tu utilises une série de if pour sélectionner ton générateur aléatoire. Bof... prend plutôs une std::map qui te retourne une fonction à appeler dans laquelle tu as le bon générateur.
    Une fois que tu as ça, tu pourras facilement étendre les possibilités de ta classe pour gérer d'autres générateurs.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ben là tu fais déjà le choix à l'execution en fonction de GENERAL.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    bonjour, et merci

    le truc en fait, c'est que j'aimerais pouvoir choisir pour la normal autre chose que 0 et 1, PI et PI., en fait, j'aimerais un truc du genre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double RandomNormal(double m, double e){
    me retroune un nombre aleatoire via une N(m,e)
    }
    et ca je sais pas comment faire. peut on faire un turc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    double RandomNormal(double m, double e){
      normal_distribution<double> CRandom::norm_P(M,E);
      variate_generator <boost::mt19937&,
    		boost::normal_distribution<double> > 
    			CRandom::normal_P(CRandom::rand_gen,norm_P);
                RETURN normal_P();
    }

    parce que chez moi, ca veux pas. (compilateur pas comptant);


    merci


    a++

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/07/2009, 22h12
  2. installation de boost
    Par heinquoi dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 18/04/2005, 17h20
  3. [Plugin] Factoriser les import (gestion des import)
    Par Oliveuh dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 08/07/2004, 12h21
  4. cherchecomment utiliser boost sous linux
    Par Krost dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/02/2004, 22h03
  5. Réponses: 4
    Dernier message: 06/11/2003, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo