/*
	最強の乱数 : Mersenne Twister

  -----------------------------------------------------------------

   A C-program for MT19937, with initialization improved 2002/1/26.
   Coded by Takuji Nishimura and Makoto Matsumoto.

   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
   All rights reserved.                          

   Any feedback is very welcome.
   http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
   email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
*/

#ifndef __MglMtRand_H__
#define __MglMtRand_H__

#include <windows.h>				//	timeGetTime()用
#include <mmsystem.h>				//	timeGetTime()用
#pragma comment(lib,"winmm.lib")	//	timeGetTime()用

//	Mersenne Twister 元の関数 プロトタイプ宣言 -> 開始
void init_genrand(unsigned long s);
void init_by_array(unsigned long init_key[], int key_length);
unsigned long genrand_int32(void);
long genrand_int31(void);
double genrand_real1(void);
double genrand_real2(void);
double genrand_real3(void);
double genrand_res53(void);
//	Mersenne Twister 元の関数 プロトタイプ宣言 -> 終了


//	srand()とほぼ同様に。
inline void mtsrand( unsigned long nSeed ){ init_genrand( nSeed ); }
inline void MtSRand( unsigned long nSeed ){ init_genrand( nSeed ); }
inline void MyuSRand( unsigned long nSeed ){ init_genrand( nSeed ); }

//	srand()とほぼ同様に。引数省略版。timeGetTime()を使って初期化します。
inline void mtsrand(){ MtSRand(timeGetTime()); }
inline void MtSRand(){ MtSRand(timeGetTime()); }
inline void MyuSRand(){ MtSRand(timeGetTime()); }

//	rand()とほぼ同様に。
extern bool bMslInitRand;
inline unsigned long mtrand(){
	if ( bMslInitRand == false )
		mtsrand();
	bMslInitRand = true;
	return genrand_int32();
}
inline unsigned long MtRand(){ return mtrand(); }
inline unsigned long MyuRand(){ return mtrand(); }



/*
	* 元々のMTの関数を使いたい場合は以下。

  -----------------------------------------------------------------

	日本語訳 元：http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/readme-mt-jp.html


	このコードはMersenne Twister擬似乱数発生法です。
	周期は2^19937-1で、623次元均等分布が保障されます。
	初期化を2002年1月に改良しました。 

	1.	初期化：
		二つの初期化ルーチンが選べます。
		どちらかは、使用前にかならず呼び出さないとなりません。 

	・init_genrand(seed)では、任意の符号なし一ワード長整数
	　を初期シードとして与えることができます（0でもかまいません）。 
	・init_by_array(init_key, key_length)では、 符号なしワード長の
	　配列init_keyに格納された整数列を初期 シードとして与えることができます。
	　整数key_lengthは、その 配列の頭から何ワード目までを初期シードとするかを指定します。
	　配列の長さは、1以上任意です。 

	2.	生成：
		上記の二関数のいずれかを用いて初期化した後、次のタイプの
		擬似乱数が使用できます。 

	・genrand_int32() 符号なし32ビット長整数 
	・genrand_int31() 符号なし31ビット長整数 
	・genrand_real1() 一様実乱数[0,1] (32ビット精度). 
	・genrand_real2() 一様実乱数[0,1) (32ビット精度). 
	・genrand_real3() 一様実乱数(0,1) (32ビット精度). 
	・genrand_res53() 一様実乱数[0,1) (53ビット精度). 

	ここで、[0,1]は0,1を含む、[0,1)は0は含むが1は含まない、などを表します。
*/

#endif//__MglMtRand_H__