/*	
 *	clipmt.h
 *
 *	メルセンヌ・ツイスタ擬似乱数
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2012 Naoyuki Sawa
 *
 *	* Thu Dec 06 17:08:54 JST 2012 Naoyuki Sawa
 *	- clipmisc.h から分離しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Sat Feb 20 21:07:39 JST 2016 Naoyuki Sawa
 *	- 構造体名'_MT'を'tagMT'に変更しました。_MTはWin32のマルチスレッドプロジェクトで定義されるシンボルと衝突するからです。
 */
#ifndef __CLIP_MT_H__
#define __CLIP_MT_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	メルセンヌ・ツイスタ擬似乱数
 ****************************************************************************/

#define MT_N 624
#define MT_M 397

/* 擬似乱数生成器 */
//{{2016/02/20変更:構造体名'_MT'を'tagMT'に変更しました。_MTはWin32のマルチスレッドプロジェクトで定義されるシンボルと衝突するからです。
//typedef struct _MT {		/* アセンブラから参照するためレイアウト固定 */
//↓2016/02/20変更:構造体名'_MT'を'tagMT'に変更しました。_MTはWin32のマルチスレッドプロジェクトで定義されるシンボルと衝突するからです。
typedef struct tagMT {		/* アセンブラから参照するためレイアウト固定 */
//}}2016/02/20変更:構造体名'_MT'を'tagMT'に変更しました。_MTはWin32のマルチスレッドプロジェクトで定義されるシンボルと衝突するからです。
	unsigned mti;		/* +0,4          */
	unsigned mt[MT_N];	/* +4,4* MT_N    */
} MT;				/* =  4*(MT_N+1) */

/*--------------------------------------------------------------------------*/

/* 擬似乱数生成器を初期化します。
 * [in]
 *	s		シード。
 * [note]
 *	* オリジナル版プログラムの、init_genrand()に相当します。
 */
void MT_init(MT* self, unsigned s);

/* 32ビット符号無し乱数を生成します。
 * [out]
 *	戻り値		32ビット符号無し乱数。
 * [note]
 *	* オリジナル版プログラムの、genrand_int32()に相当します。
 *	* genrand_int32()は、未初期化だった場合に、自動的にシード5489で初期化しますが、
 *	  本関数は、未初期化かどうかの判断を行っていません。
 *	  本関数を呼び出す前に、MT_init()を呼び出して、明示的に初期化を行ってください。
 */
unsigned MT_int32(MT* self);

/*
	■使用例:

	MT mt; // MT構造体は約2.5キロバイトの大きさなので、スタック上に置くのは危険です!!
	void test() {
		int i, r;
		MT_init(&mt, 5489); // 暗黙の初期化は行わないので、明示的な初期化が必要です。
		for(i = 0; i < 1000; i++) {
			r = MT_int32(&mt);
		}
	}

	□上記の例は、オリジナル版プログラムの、以下のコードと同じ乱数系列を生成します。

	void main() {
		int i, r;
		//init_genrand(5489); // 暗黙の初期化を行ってくれるので、省略しても同じです。
		for(i = 0; i < 1000; i++) {
			r = genrand_int32();
		}
	}
*/

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_MT_H__*/
