Mercurial > repos > dereeper > sniplay
diff egglib/egglib-2.1.5/include/egglib-cpp/Random.hpp @ 1:420b57c3c185 draft
Uploaded
author | dereeper |
---|---|
date | Fri, 10 Jul 2015 04:39:30 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/egglib/egglib-2.1.5/include/egglib-cpp/Random.hpp Fri Jul 10 04:39:30 2015 -0400 @@ -0,0 +1,134 @@ +/* + Copyright 2008,2009,2012 Stéphane De Mita, Mathieu Siol + Adapted from MStrat, developed by Charles-Edouard Coste, + Thomas M. Bataillon, Mathieu Cotisson, Guy Decoux, Chistophe Rozale, + Daniel J. Schoen and Jacques L. David. + + This file is part of the EggLib library. + + EggLib is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + EggLib is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with EggLib. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef EGGLIB_RANDOM_HPP +#define EGGLIB_RANDOM_HPP + +namespace egglib { + + /** \brief Pseudo-random number generator + * + * \ingroup core + * + * Random is a pseudo-random number generator, adapted from a part of MStrat, + * developed by Charles-Edouard Coste, Thomas M. Bataillon, Mathieu Cotisson, + * Guy Decoux, Chistophe Rozale, Daniel J. Schoen and Jacques L. David. + * + * It uses two different seeds. By default, they are initialized to available + * arbitrary values. However, a given sequence can be repeated by passing the + * same two seeds. + * + */ + class Random { + public: + /** \brief Initializes using default seeds + * + * Uses the current system time and the memory address of the object as an attempt to generate unique sequences. + */ + Random(); + + /** \brief Initializes using given seeds + * + * This constructor can be used to reproduce a given sequence. + */ + Random(double seed1, double seed2); + + /** \brief Draws a number from an exponential distribution + * + * \param expectation the distribution mean (also 1/lambda + * where lambda is the rate parameter). + * + */ + double erand(double expectation); + + /** \brief Draws an integer from a uniform distribution bound by 0 and max (max is not included) + * + * max is not included. + * + */ + unsigned int irand(unsigned int max); + + /** \brief Draws an integer from a Poisson distribution with parameter p + * + * The Poisson transformation algorithm was taken from (in French) + * http://www.u-picardie.fr/~cochard/IEM/demos/C107/C107_3.htm. + */ + unsigned int prand(double p); + + /** \brief Draws a number from a normal distribution of expectation 0 and variance 1 + * + * The algorithm used is the polar form of the Box-Muller + * algorithm. \todo use the Ziggurat algorithm for the + * nrand() method of Random. + * + */ + double nrand(); + + /** \brief Draws a number from a geometric law + * + * \param param the parameter of the law + * + */ + unsigned int grand(double); + + /** \brief Draws a number from a uniform distribution between 0 and 1 + * + */ + double uniform(); + + /** \brief Gets the current value of the first seed + * + */ + double seed1() const; + + /** \brief Gets the current value of the second seed + * + */ + double seed2() const; + + /** \brief Sets the current value of the first seed + * + */ + void seed1(double); + + /** \brief Sets the current value of the second seed + * + */ + void seed2(double); + + private: + // First seed + double _seed1; + + // Second seed + double _seed2; + + /* since the normal random generator draws two numbers at + * a time, one is cached and returned at any subsequent call + */ + bool b_ncached; + double v_ncached; + + }; +} + +#endif