00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 2 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * This program is distributed in the hope that it will be useful, 00008 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00009 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00010 * GNU General Public License for more details. 00011 * 00012 * You should have received a copy of the GNU General Public License 00013 * along with this program; if not, write to the Free Software 00014 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00015 * 00016 * This file is extracted from the random generator library provided by Agner Fog 00017 * (http://www.agner.org/random/) and has been modified for Seagull. 00018 * (c) 2002 Agner Fog. GNU General Public License www.gnu.org/copyleft/gpl.html 00019 * 00020 * (c)Copyright 2006 Hewlett-Packard Development Company, LP. 00021 * 00022 */ 00023 00024 #ifndef RANDOMC_H 00025 #define RANDOMC_H 00026 00027 #ifdef __INTEL_COMPILER 00028 #include <mathimf.h> // Intel math function library 00029 #else 00030 #include <math.h> // default math function linrary 00031 #endif 00032 00033 #include <assert.h> 00034 #include <stdio.h> 00035 00036 // Define 32 bit signed and unsigned integers. 00037 // Change these definitions, if necessary, on 64 bit computers 00038 typedef signed long int32; 00039 typedef unsigned long uint32; 00040 00041 class TRandomMersenne { // encapsulate random number generator 00042 #if 0 00043 // define constants for MT11213A: 00044 // (32 bit constants cannot be defined as enum in 16-bit compilers) 00045 #define MERS_N 351 00046 #define MERS_M 175 00047 #define MERS_R 19 00048 #define MERS_U 11 00049 #define MERS_S 7 00050 #define MERS_T 15 00051 #define MERS_L 17 00052 #define MERS_A 0xE4BD75F5 00053 #define MERS_B 0x655E5280 00054 #define MERS_C 0xFFD58000 00055 #else 00056 // or constants for MT19937: 00057 #define MERS_N 624 00058 #define MERS_M 397 00059 #define MERS_R 31 00060 #define MERS_U 11 00061 #define MERS_S 7 00062 #define MERS_T 15 00063 #define MERS_L 18 00064 #define MERS_A 0x9908B0DF 00065 #define MERS_B 0x9D2C5680 00066 #define MERS_C 0xEFC60000 00067 #endif 00068 public: 00069 TRandomMersenne(uint32 seed) { // constructor 00070 RandomInit(seed);} 00071 void RandomInit(uint32 seed); // re-seed 00072 double Random(); // output random float 00073 uint32 BRandom(); // output random bits 00074 private: 00075 uint32 mt[MERS_N]; // state vector 00076 int mti; // index into mt 00077 enum TArch {LITTLE_ENDIAN1, BIG_ENDIAN1, NONIEEE}; 00078 TArch Architecture; // conversion to float depends on computer architecture 00079 }; 00080 00081 #endif