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
codice:
#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
Source
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