Bonjour,

Je m'intéresse depuis peu à boost::random. Ca a l'air très performant... mais c'est aussi relativement compliqué. C'est pourquoi j'ai entrepris de me faire ma classe NormalDistribution histoire d'aller plus vite ultérieurement.

Mais voilà, conception de boost oblige (et manque de savoir faire de ma part), les templates posent problème avec les modifications runtime : je souhaiterais pouvoir choisir les parametres de ma distribution pendant l'execution du programme, et non avant compilation.

Du coup, j'ai fait comme cela :

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
46
47
48
49
50
 
class NormalDistribution
{
private:
	double m_Mean;
	double m_StdDev;
 
	boost::lagged_fibonacci19937* engine;
	boost::variate_generator<boost::lagged_fibonacci19937&, boost::normal_distribution<double> >* bind;
 
 
 
public:
	NormalDistribution(const double& _Mean, const double _StdDev)
	{
		m_Mean = _Mean;
		m_StdDev = _StdDev;
 
		bind = NULL;
		engine = new boost::lagged_fibonacci19937( time(NULL) );
	}
 
	~NormalDistribution()
	{
		delete engine;
		delete bind;
	}
 
	void SetMean(const double& _Mean) {m_Mean = _Mean;}
	void SetStdDev(const double& _StdDev) {m_StdDev = _StdDev;}
 
	inline double GetMean() const { return m_Mean; }
	inline double GetStdDev() const { return m_StdDev; }
 
	void Prepare()
	{
		boost::normal_distribution<double> generator(m_Mean,m_StdDev);
 
		if(bind)
			delete bind;
 
		bind = new boost::variate_generator<boost::lagged_fibonacci19937&, boost::normal_distribution<double> >(*engine,generator);
	}
 
	double operator()(void)
	{
		return (*bind)();
	}
 
};
Ca fonctionne (aux premiers essais, un peu basiques), mais ça m'a l'air relativement bancal.

Qu'en pensez-vous? Quelle technique utiliseriez-vous pour factoriser boost et la rendre modifiable en runtime?

Merci

Cordialement