DSQSS  1.1
random.h
説明を見る。
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
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型の値 フレンド マクロ定義