1*6467f958SSadaf Ebrahimi 2*6467f958SSadaf Ebrahimi /* 3*6467f958SSadaf Ebrahimi * mt19937.h 4*6467f958SSadaf Ebrahimi * 5*6467f958SSadaf Ebrahimi * Mersenne Twister. 6*6467f958SSadaf Ebrahimi * 7*6467f958SSadaf Ebrahimi A C-program for MT19937, with initialization improved 2002/1/26. 8*6467f958SSadaf Ebrahimi Coded by Takuji Nishimura and Makoto Matsumoto. 9*6467f958SSadaf Ebrahimi 10*6467f958SSadaf Ebrahimi Before using, initialize the state by using init_genrand(seed) 11*6467f958SSadaf Ebrahimi or init_by_array(init_key, key_length). 12*6467f958SSadaf Ebrahimi 13*6467f958SSadaf Ebrahimi Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, 14*6467f958SSadaf Ebrahimi All rights reserved. 15*6467f958SSadaf Ebrahimi 16*6467f958SSadaf Ebrahimi Redistribution and use in source and binary forms, with or without 17*6467f958SSadaf Ebrahimi modification, are permitted provided that the following conditions 18*6467f958SSadaf Ebrahimi are met: 19*6467f958SSadaf Ebrahimi 20*6467f958SSadaf Ebrahimi 1. Redistributions of source code must retain the above copyright 21*6467f958SSadaf Ebrahimi notice, this list of conditions and the following disclaimer. 22*6467f958SSadaf Ebrahimi 23*6467f958SSadaf Ebrahimi 2. Redistributions in binary form must reproduce the above copyright 24*6467f958SSadaf Ebrahimi notice, this list of conditions and the following disclaimer in the 25*6467f958SSadaf Ebrahimi documentation and/or other materials provided with the distribution. 26*6467f958SSadaf Ebrahimi 27*6467f958SSadaf Ebrahimi 3. The names of its contributors may not be used to endorse or promote 28*6467f958SSadaf Ebrahimi products derived from this software without specific prior written 29*6467f958SSadaf Ebrahimi permission. 30*6467f958SSadaf Ebrahimi 31*6467f958SSadaf Ebrahimi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*6467f958SSadaf Ebrahimi "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*6467f958SSadaf Ebrahimi LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34*6467f958SSadaf Ebrahimi A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 35*6467f958SSadaf Ebrahimi OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 36*6467f958SSadaf Ebrahimi EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 37*6467f958SSadaf Ebrahimi PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 38*6467f958SSadaf Ebrahimi PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 39*6467f958SSadaf Ebrahimi LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 40*6467f958SSadaf Ebrahimi NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 41*6467f958SSadaf Ebrahimi SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42*6467f958SSadaf Ebrahimi 43*6467f958SSadaf Ebrahimi 44*6467f958SSadaf Ebrahimi Any feedback is very welcome. 45*6467f958SSadaf Ebrahimi http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html 46*6467f958SSadaf Ebrahimi email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) 47*6467f958SSadaf Ebrahimi */ 48*6467f958SSadaf Ebrahimi 49*6467f958SSadaf Ebrahimi #ifndef MT19937_H 50*6467f958SSadaf Ebrahimi #define MT19937_H 1 51*6467f958SSadaf Ebrahimi 52*6467f958SSadaf Ebrahimi #if defined(__APPLE__) 53*6467f958SSadaf Ebrahimi #include <OpenCL/cl_platform.h> 54*6467f958SSadaf Ebrahimi #else 55*6467f958SSadaf Ebrahimi #include <CL/cl_platform.h> 56*6467f958SSadaf Ebrahimi #endif 57*6467f958SSadaf Ebrahimi 58*6467f958SSadaf Ebrahimi /* 59*6467f958SSadaf Ebrahimi * Interfaces here have been modified from original sources so that they 60*6467f958SSadaf Ebrahimi * are safe to call reentrantly, so long as a different MTdata is used 61*6467f958SSadaf Ebrahimi * on each thread. 62*6467f958SSadaf Ebrahimi */ 63*6467f958SSadaf Ebrahimi 64*6467f958SSadaf Ebrahimi typedef struct _MTdata *MTdata; 65*6467f958SSadaf Ebrahimi 66*6467f958SSadaf Ebrahimi /* Create the random number generator with seed */ 67*6467f958SSadaf Ebrahimi MTdata init_genrand(cl_uint /*seed*/); 68*6467f958SSadaf Ebrahimi 69*6467f958SSadaf Ebrahimi /* release memory used by a MTdata private data */ 70*6467f958SSadaf Ebrahimi void free_mtdata(MTdata /*data*/); 71*6467f958SSadaf Ebrahimi 72*6467f958SSadaf Ebrahimi /* generates a random number on [0,0xffffffff]-interval */ 73*6467f958SSadaf Ebrahimi cl_uint genrand_int32(MTdata /*data*/); 74*6467f958SSadaf Ebrahimi 75*6467f958SSadaf Ebrahimi /* generates a random number on [0,0xffffffffffffffffULL]-interval */ 76*6467f958SSadaf Ebrahimi cl_ulong genrand_int64(MTdata /*data*/); 77*6467f958SSadaf Ebrahimi 78*6467f958SSadaf Ebrahimi /* generates a random number on [0,1]-real-interval */ 79*6467f958SSadaf Ebrahimi double genrand_real1(MTdata /*data*/); 80*6467f958SSadaf Ebrahimi 81*6467f958SSadaf Ebrahimi /* generates a random number on [0,1)-real-interval */ 82*6467f958SSadaf Ebrahimi double genrand_real2(MTdata /*data*/); 83*6467f958SSadaf Ebrahimi 84*6467f958SSadaf Ebrahimi /* generates a random number on (0,1)-real-interval */ 85*6467f958SSadaf Ebrahimi double genrand_real3(MTdata /*data*/); 86*6467f958SSadaf Ebrahimi 87*6467f958SSadaf Ebrahimi /* generates a random number on [0,1) with 53-bit resolution*/ 88*6467f958SSadaf Ebrahimi double genrand_res53(MTdata /*data*/); 89*6467f958SSadaf Ebrahimi 90*6467f958SSadaf Ebrahimi 91*6467f958SSadaf Ebrahimi #ifdef __cplusplus 92*6467f958SSadaf Ebrahimi 93*6467f958SSadaf Ebrahimi /* generates a random boolean */ 94*6467f958SSadaf Ebrahimi bool genrand_bool(MTdata /*data*/); 95*6467f958SSadaf Ebrahimi 96*6467f958SSadaf Ebrahimi #include <cassert> 97*6467f958SSadaf Ebrahimi #include <utility> 98*6467f958SSadaf Ebrahimi 99*6467f958SSadaf Ebrahimi class MTdataHolder { 100*6467f958SSadaf Ebrahimi public: 101*6467f958SSadaf Ebrahimi MTdataHolder() = default; MTdataHolder(cl_uint seed)102*6467f958SSadaf Ebrahimi explicit MTdataHolder(cl_uint seed) 103*6467f958SSadaf Ebrahimi { 104*6467f958SSadaf Ebrahimi m_mtdata = init_genrand(seed); 105*6467f958SSadaf Ebrahimi assert(m_mtdata != nullptr); 106*6467f958SSadaf Ebrahimi } 107*6467f958SSadaf Ebrahimi 108*6467f958SSadaf Ebrahimi // Forbid copy. 109*6467f958SSadaf Ebrahimi MTdataHolder(const MTdataHolder&) = delete; 110*6467f958SSadaf Ebrahimi MTdataHolder& operator=(const MTdataHolder&) = delete; 111*6467f958SSadaf Ebrahimi 112*6467f958SSadaf Ebrahimi // Support move semantics. MTdataHolder(MTdataHolder && h)113*6467f958SSadaf Ebrahimi MTdataHolder(MTdataHolder&& h) { std::swap(m_mtdata, h.m_mtdata); } 114*6467f958SSadaf Ebrahimi MTdataHolder& operator=(MTdataHolder&& h) 115*6467f958SSadaf Ebrahimi { 116*6467f958SSadaf Ebrahimi std::swap(m_mtdata, h.m_mtdata); 117*6467f958SSadaf Ebrahimi return *this; 118*6467f958SSadaf Ebrahimi } 119*6467f958SSadaf Ebrahimi ~MTdataHolder()120*6467f958SSadaf Ebrahimi ~MTdataHolder() 121*6467f958SSadaf Ebrahimi { 122*6467f958SSadaf Ebrahimi if (m_mtdata) free_mtdata(m_mtdata); 123*6467f958SSadaf Ebrahimi } 124*6467f958SSadaf Ebrahimi MTdata()125*6467f958SSadaf Ebrahimi operator MTdata() const 126*6467f958SSadaf Ebrahimi { 127*6467f958SSadaf Ebrahimi assert(m_mtdata && "Object wasn't initialised"); 128*6467f958SSadaf Ebrahimi return m_mtdata; 129*6467f958SSadaf Ebrahimi } 130*6467f958SSadaf Ebrahimi 131*6467f958SSadaf Ebrahimi private: 132*6467f958SSadaf Ebrahimi MTdata m_mtdata = nullptr; 133*6467f958SSadaf Ebrahimi }; 134*6467f958SSadaf Ebrahimi 135*6467f958SSadaf Ebrahimi #endif // #ifdef __cplusplus 136*6467f958SSadaf Ebrahimi 137*6467f958SSadaf Ebrahimi #endif /* MT19937_H */ 138