Salve, mi sto esercitando sull'utilizzo delle classi risolvendo alcuni esercizi di Stroustrup. Purtroppo non ho le soluzioni (non so neanche se esistono) e facendo da autodidatta non riesco a capire se sto facendo bene o meno, quindi chi avrà la pazienza di leggere e darmi un riscontro avrà la mia gratitudine (che fortuna eh...).
Il programma sembra funzionare correttamente, ma ovviamente non so autovalutare il mio lavoro d'implementazione. L'esercizio richiedeva la scrittura di una classe per la generazione di random variable estratte dalla distribuzione uniforme e esponenziale.
Qui riporto l'header e il source, grazie a chi vorrà commentare.
In particolare ho dubbi sulla ripetizione degli header nei due file (forse il cpp può evitare di riscrivere gli header già inclusi nel .header annesso?, in questo caso solo <vector>, ma la domanda è generale, cioè c'è una prassi?). Inoltre non so quale implementazione della funzione che genera un vettore di r.v. è il migliore. Grazie
Header
Sourcecodice:#ifndef UNIFORM_DISTRIBUTION_H #define UNIFORM_DISTRIBUTION_H #include <vector> class UniformDist { private: double _a, _b; //distributions' interval public: UniformDist(); //default constructor (default interval [0,1]) UniformDist(const double& a_, const double& b_); //parameter constructor UniformDist(const UniformDist& rhs); //copy constructor virtual ~UniformDist(); //virtual destructor double get_a(); //get _a double get_b(); //get _b // extract a realization of a r.v. having a uniform distribution on the [a,b] interval void gen_samples(std::vector<double>& Vsamples); void gen_samples(const int& Nsamples, std::vector<double>& Vsamples); }; #endif
codice:#ifndef UNIFORM_DISTRIBUTION_CPP #define UNIFORM_DISTRIBUTION_CPP #include <cstdlib> #include <vector> #include <ctime> #include "UniformDist.h" //default constructor UniformDist::UniformDist(){ srand(time(0)); _a = 0; _b = 1; } //parameter constructor UniformDist::UniformDist(const double& a_, const double& b_){ srand(time(0)); _a = a_; _b = b_; } //copy constructor UniformDist::UniformDist(const UniformDist& rhs){ _a = rhs.get_a(); _b = rhs.get_b(); } //virtual destructor UniformDist::~UniformDist() {}; //getters double UniformDist::get_a(){ return _a; } double UniformDist::get_b(){ return _b; } //return a vector of Nsample samples from the uniform distribution on the [_a,_b] interval void UniformDist::gen_samples(const int& Nsamples, std::vector<double>& Vsamples){ srand(time(0)); Vsamples.assign(Nsamples, 0.0); for(std::vector<double>::iterator iter = Vsamples.begin(); iter != Vsamples.end(); iter++){ *iter = (_b -_a)*(rand() / (double)RAND_MAX) +_a; } } /*//return a vector of Nsample samples from the uniform distribution on the [_a,_b] interval void UniformDist::gen_samples(const int& Nsamples, std::vector<double>& Vsamples){ srand(time(0)); for(int i=0;i<Nsamples;i++){ Vsamples.push_back((_b-_a)*(rand()/(double)RAND_MAX) + _a); } }*/ #endif

Rispondi quotando