⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eorng.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
📖 第 1 页 / 共 2 页
字号:
/** Random number generator adapted from (see comments below)The random number generator is modified into a classby Maarten Keijzer (mak@dhi.dk). Also added the Box-Mullertransformation to generate normal deviates.This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USAContact: eodev-main@lists.sourceforge.netOld contact information: todos@geneura.ugr.es, http://geneura.ugr.es*/#ifndef EO_RANDOM_NUMBER_GENERATOR#define EO_RANDOM_NUMBER_GENERATOR// uint32_t is an unsigned integer type capable of holding 32 bits.//// In the applicatione here exactly 32 are used.// 64 bits might be better on an Alpha or other 64 bit systems with GCC at high// optimization levels so feel free to try your options and see what's best for// you.# if (defined _MSC_VER)typedef unsigned long uint32_t;#else#if (! defined __sun)// The C99-standard defines uint32_t to be declared in stdint.h, but some// systems don't have that and implement it in inttypes.h.#include <stdint.h>#else#include <inttypes.h>#endif#endif#include <cmath>#include <vector>#include "eoPersistent.h"#include "eoObject.h"/** Random Number Generator@class eoRng eoRNG.h utils/eoRNG.heoRng is a persistent class that uses the ``Mersenne Twister'' randomnumber generator MT19937 for generating random numbers. The variousmember functions implement useful functions for evolutionaryalgorithms. Included are: rand(), random(), flip() and normal().EO provides a global random number generator <tt>rng</tt> that is seeded by thecurrent UNIX time at program start. Moreover some global convenience functionsare provided that use the global random number generator: <tt>random</tt>,<tt>normal</tt>.@warning If you want to repeatedly generated the same sequence of pseudo-randomnumbers, you should always reseed the generator at the beginning of your code.<h1>Documentation in original file</h1>This is the ``Mersenne Twister'' random number generator MT19937, whichgenerates pseudorandom integers uniformly distributed in 0..(2^32 - 1) startingfrom any odd seed in 0..(2^32 - 1). This version is a recode by Shawn Cokus(Cokus@math.washington.edu) on March 8, 1998 of a version by Takuji Nishimura(who had suggestions from Topher Cooper and Marc Rieffel in July-August 1997).Effectiveness of the recoding (on Goedel2.math.washington.edu, a DEC Alpharunning OSF/1) using GCC -O3 as a compiler: before recoding: 51.6 sec. togenerate 300 million random numbers; after recoding: 24.0 sec. for the same(i.e., 46.5% of original time), so speed is now about 12.5 million random numbergenerations per second on this machine.According to the URL <http://www.math.keio.ac.jp/~matumoto/emt.html> (andparaphrasing a bit in places), the Mersenne Twister is ``designed withconsideration of the flaws of various existing generators,'' has a period of2^19937 - 1, gives a sequence that is 623-dimensionally equidistributed, and``has passed many std::stringent tests, including the die-hard test of G.Marsaglia and the load test of P. Hellekalek and S. Wegenkittl.'' It isefficient in memory usage (typically using 2506 to 5012 bytes of static data,depending on data type sizes, and the code is quite short as well). It generatesrandom numbers in batches of 624 at a time, so the caching and pipelining ofmodern systems is exploited. It is also divide- and mod-free.The code as Shawn received it included the following notice: <tt>Copyright (C)1997 Makoto Matsumoto and Takuji Nishimura. When you use this, send an e-mail to<matumoto@math.keio.ac.jp> with an appropriate reference to your work.</tt> Itwould be nice to Cc: <Cokus@math.washington.edu> and<eodev-main@lists.sourceforge.net> when you write.<h1>Portability</h1>Note for people porting EO to other platforms: please make sure that the typeuint32_t in the file eoRNG.h is exactly 32 bits long. It may in principle belonger, but not shorter. If it is longer, file compatibility between EO ondifferent platforms may be broken.*/class eoRng : public eoObject, public eoPersistent{public :    /** Constructor    @param s Random seed; if you want another seed, use reseed.    @see reseed for details on usage of the seeding value.    */    eoRng(uint32_t s)        : state(0), next(0), left(-1), cached(false)        {            state = new uint32_t[N+1];            initialize(2*s);        }    /** Destructor */    ~eoRng()        {            delete [] state;        }    /** Re-initializes the Random Number Generator.    WARNING: Jeroen Eggermont <jeggermo@liacs.nl> noticed that initialize does    not differentiate between odd and even numbers, therefore the argument to    reseed is now doubled before being passed on.    Manually divide the seed by 2 if you want to re-run old runs    @version MS. 5 Oct. 2001    */    void reseed(uint32_t s)        {            initialize(2*s);        }    /** Re-initializes the Random Number Generator    This is the traditional seeding procedure. This version is deprecated and    only provided for compatibility with old code. In new projects you should    use reseed.    @see reseed for details on usage of the seeding value.    @version old version (deprecated)    */    void oldReseed(uint32_t s)        {            initialize(s);        }    /** Radnom number from unifom distribution    @param m Define interval for random number to [0, m)    @return random number in the range [0, m)    */    double uniform(double m = 1.0)        { // random number between [0, m]            return m * double(rand()) / double(1.0 + rand_max());        }    /** Radnom integer number from unifom distribution    @param m Define interval for random number to [0, m)    @return random integer in the range [0, m)    */    uint32_t random(uint32_t m)        {            return uint32_t(uniform() * double(m));        }    /** Biased coin toss    This tosses a biased coin such that flip(x/100.0) will true x% of the time    @param bias The coins' bias (the \e x above)    @return The result of the biased coin toss    */    bool flip(double bias=0.5)        {            return uniform() < bias;        }    /** Gaussian deviate    Zero mean Gaussian deviate with standard deviation 1.    @return Random Gaussian deviate    */    double normal();    /** Gaussian deviate    Gaussian deviate with zero mean and specified standard deviation.    @param stdev Standard deviation for Gaussian distribution    @return Random Gaussian deviate    */    double normal(double stdev)        { return stdev * normal(); }    /** Gaussian deviate    Gaussian deviate with specified mean and standard deviation.    @param mean Mean for Gaussian distribution    @param stdev Standard deviation for Gaussian distribution    @return Random Gaussian deviate    */    double normal(double mean, double stdev)        { return mean + normal(stdev); }    /** Random numbers using a negative exponential distribution    @param mean Mean value of distribution    @return Random number from a negative exponential distribution    */    double negexp(double mean)        {            return -mean*log(double(rand()) / rand_max());        }    /**    rand() returns a random number in the range [0, rand_max)    */    uint32_t rand();    /**    rand_max() the maximum returned by rand()    */    uint32_t rand_max() const { return uint32_t(0xffffffff); }    /** Roulette wheel selection    roulette_wheel(vec, total = 0) does a roulette wheel selection    on the input std::vector vec. If the total is not supplied, it is    calculated. It returns an integer denoting the selected argument.    */    template <typename TYPE>    int roulette_wheel(const std::vector<TYPE>& vec, TYPE total = 0)        {            if (total == 0)            { // count                for (unsigned    i = 0; i < vec.size(); ++i)                    total += vec[i];            }            double fortune = uniform() * total;            int i = 0;            while (fortune > 0)            {                fortune -= vec[i++];            }            return --i;        }    /** Randomly select element from vector.    @return Uniformly chosen element from the vector.    */    template <typename TYPE>    const TYPE& choice(const std::vector<TYPE>& vec) const        { return vec[random(vec.size())]; }    /** Randomly select element from vector.    @overload    Provide a version returning a non-const element reference.    @return Uniformly chosen element from the vector.    @warning Changing the return value does alter the vector.    */    template <typename TYPE>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -