/*	
 *	clipwell.h
 *
 *	乱数生成アルゴリズムWELL
 *
 *	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プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_WELL_H__
#define __CLIP_WELL_H__

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

/****************************************************************************
 *	乱数生成アルゴリズムWELL
 ****************************************************************************/

/* - 周期2^512-1のWELL乱数です。
 *   WELL乱数には、様々な周期のバージョンがあり、周期2^512-1は最も短い周期のバージョンです。
 *   通常の用途では、周期2^512-1でも充分だと思います。
 * - 周期2^512-1のWELL乱数は、MT乱数(周期2^19937-1)に較べて、以下の利点が有ります。
 *   ・必要なRAM容量が少ない。(MT乱数は約2.5KB、周期2^512-1のWELL乱数は64byte程度)
 *   ・応答時間が一定である。(MT乱数は通常は高速だが、624回毎に一度、長時間かかる)
 *   ・初期化直後の乱数の品質が良い。(MT乱数は、初期化直後の乱数に偏りがあるらしい)
 *   通常の用途では、周期2^512-1でも充分なので、WELL乱数の方が使い易いと思います。
 */
typedef struct _WELL {		/* アセンブラから参照するためレイアウト固定 */
	unsigned state[16];	/* + 0,64 */
} WELL;				/* =64    */

/* 擬似乱数生成器を初期化します。
 * [in]
 *	self		擬似乱数生成器。
 *	s		シード。
 * [note]
 *	* 標準実装の、InitWELLRNG512a()に相当します。
 */
void WELL_init(WELL* self, unsigned s);

/* 32ビット符号無し乱数を生成します。
 * [in]
 *	self		擬似乱数生成器。
 * [out]
 *	戻り値		32ビット符号無し乱数。
 * [note]
 *	* 標準実装の、WELLRNG512a()に相当します。
 */
unsigned WELL_next(WELL* self);

/*
	■使用例:

	WELL well; // WELL構造体は64バイトの小ささなので、場合によってはスタック上に置いても大丈夫です。
	void test() {
		int i, r;
		WELL_init(&well, pceTimerGetCount()); // 暗黙の初期化は行わないので、明示的な初期化が必要です。
		for(i = 0; i < 1000; i++) {
			r = WELL_next(&well);
		}
	}
*/

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

#endif /*__CLIP_WELL_H__*/
