#include "sopnamsp.h" #include "machdefs.h" #include #include "pexceptions.h" #include "srandgen.h" #include "perandom.h" //////////////////////////////////////////////////////////////////////////// /*! \class SOPHYA::FunRan \ingroup NTools Classe for generating random variables from 1D function */ /********* Methode *********/ /*! Creator from a function. \verbatim - if pdf==true: f est une densite de probabilite (PDF) non necessairement normalisee if pdf==false: f est une fonction de distribution (DF). non necessairement normalisee - Le tirage aleatoire est fait sur un histogramme Histo(xMin,xMax,nBin) (voir convention dans Histo). - Chaque bin de l'histogramme contient la valeur de la PDF (ou de la DF) au centre du bin: h(i)=f(BinCenter(i)) - Les valeurs retournees sont les valeurs du centre des bins pour le tirage non interpole et toutes les valeurs entre [xmin,xmax] pour le tirage interpole - La pdf doit etre interpretee comme etant nulle pour des x<=xmin et x>=xmax - Dans le bin "i" entre [x1,x2[ et de centre x0, h(i)=pdf(x0). Pour le tirage interpole, la DF est approximee par un segment et pdf(x0) est l'exces de proba entre x1 et x2: bin 0 entre [xmin,BinHighEdge(0)[ : la pdf va de 0 a pdf(BinCenter(0)) bin 1 entre [BinLowEdge(1),BinHighEdge(1)[: la pdf va de pdf(BinCenter(0)) a pdf(BinCenter(1)) ... bin n-1 entre [BinLowEdge(n-1),xmax[: la pdf va de pdf(BinCenter(n-2)) a pdf(BinCenter(n-1)) \endverbatim */ FunRan::FunRan(FunRan::Func f, r_8 xMin, r_8 xMax, int_4 nBin, bool pdf) : Histo(xMin,xMax,nBin) { if(nBin<=1) throw RangeCheckError("FunRan::FunRan less than 2 bins requested"); for(int_4 i=0;i& tab, bool pdf) : Histo(-0.5,tab.Size()-0.5,tab.Size()) { if(tab.Size()<=1) throw RangeCheckError("TsFunRan::TsFunRan less than 2 bins requested"); for(int_4 i=0;i& tab, r_8 xMin, r_8 xMax, bool pdf) : Histo(xMin,xMax,tab.Size()) { if(tab.Size()<=1) throw RangeCheckError("TsFunRan::TsFunRan less than 2 bins requested"); for(int_4 i=0;i=0; i--) delete ranY[i]; delete[] ranY; delete ranX; } /********* Methode *********/ /*! Tirage avec retour du numeros de bin. */ void FunRan2D::BinRandom(int_4& x, int_4& y) { x = ranX->BinRandom(); y = ranY[x]->BinRandom(); } /********* Methode *********/ /*! Tirage avec retour abscisse et ordonnee du bin interpole. */ void FunRan2D::Random(r_8& x, r_8& y) { x = ranX->Random(); int_4 i = int_4(ceil(x)); y = ranY[i]->Random(); }