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