DSQSS
1.1
|
00001 /* 00002 *================================================================= 00003 * Header of Class Random for random number generation 00004 *================================================================= 00005 * $Log: Random.h,v $ 00006 * Revision 1.1 2000/02/10 16:14:16 kenji 00007 * Initial revision 00008 * 00009 *================================================================= 00010 * The copyright holder of the following codes is 00011 * 00012 * Kenji HARADA 00013 * Graduate School of Infomatics, Kyoto University, 00014 * Kyoto 606-8501, Japan 00015 * e-mail: harada@acs.i.kyoto-u.ac.jp 00016 * home-page: http://www-fcs.acs.i.kyoto-u.ac.jp/~harada/ 00017 *================================================================= 00018 */ 00021 00022 #ifndef _RANDOM_H_ 00023 #include <math.h> 00024 #define IPP 521 00025 #define SIZE_SEED IPP 00026 #define IQQ 32 00027 #define IPQ (IPP-IQQ) 00028 typedef unsigned int Rint; 00029 00030 //: 乱数生成 00031 // このクラスでは乱数をM系列法を用いて生成している。 00032 // 実際にt番目の乱数X(t)は次式から計算する。<BR> 00033 // X(t) := X(t-32) xor X(t-521) 00034 class Random{ 00035 private: 00036 Rint nrbit,iptr,navr; 00037 Rint iri[IPP]; 00038 double runit; 00039 00040 private: 00041 void initialize(Rint irand0,Rint nrbit0); 00042 //: 初期設定 00045 // 初期設定をする関数 00046 00047 public: 00048 Random(Rint *seed,Rint nrbit0); 00049 //: 初期値と精度を指定した Class Constructor 00050 // 整数値配列 seedに格納されている521個を 00051 // 精度nrbit0ビットの初期値としてセットする。 00052 00053 Random(Rint irand0=20000101,Rint nrbit0=32); 00054 //: 種、精度指定した Class Constructor 00055 // 種 irand0を使ってnrbit0ビットの精度をもつ乱数のための初期設定をする。 00056 00057 void setSeed(Rint irand0,Rint nrbit0=32); 00058 //: 種、精度を指定した再初期設定 00061 // 種をirand0に精度nrbit0ビットで再初期設定をする。 00062 00063 void setSeed(Rint *seed,Rint nrbit0); 00064 //: 初期値と精度を再設定 00067 // 整数値配列 initに格納されている521個を 00068 // 精度nrbit0ビットの初期値としてセットする。 00069 00070 Rint getSeed (Rint *seed); 00071 //: 現在の乱数の初期値と精度を返す 00073 // 現在の乱数の初期値(521個)をポインタseedの指す記憶領域に格納する。 00074 // さらに精度のビット数を戻り値として返す。 00075 00076 double Uniform(void); 00077 //add ---sakakura 20110322 --- 00078 double Dicex(void); 00079 void InitRand(); 00080 //add ---sakakura 20110322 --- 00081 00082 Rint Int(Rint); 00083 //: 離散一様分布 (0, 1, .. ,ilimit-1) 00085 // 戻り値に 0以上、ilimit未満の乱数(整数)を返す。 00086 00087 Rint Int(void); 00088 00089 void Uniform(Rint nr,Rint *ir); 00090 //: 離散一様分布乱数(整数値配列) 00093 // 整数値乱数(0以上、2**nrbit0-1未満)をnr個生成し、整数ポインタ irの指す番地から順番に格納する。 00094 00095 void Uniform(Rint nr,double *rx); 00096 //: 一様分布乱数(実数値配列) 00099 // 実数値乱数(0以上、1未満)をnr個生成し、実数ポインタ rxの指す番地から順番に格納する。 00100 00101 void Int(Rint nr,Rint *ir,Rint ilimit); 00102 //: 上限付き離散一様分布(整数値配列) 00106 // 整数値乱数(0以上、ilimit未満)をnr個生成し、整数ポインタ irの指す番地から順番に格納する。 00107 00108 double Gauss(){ 00109 double theta; 00110 theta = 6.283185307179586477*Uniform(); 00111 return sqrt(-2e0*log(1e0-Uniform()))*sin(theta); 00112 } 00113 //: 正規分布 00114 00115 double Exp(){return -log(1e0-Uniform());} 00116 //: 正規指数分布 00117 00118 int Binary(double P){return ((int) (Uniform()/P));} 00119 //: 2項分布 00120 00121 void Perm(Rint, int*); 00122 00123 void Scramble(Rint, int*); 00124 00125 }; 00126 00127 #define _RANDOM_H_ 00128 #endif