#ifndef RANDOM_H
#define RANDOM_H

#include <ctime>

/*!
	@brief	線形合同法を利用して一様乱数を生成する
*/
class Random
{
public:
	Random(int limit)
		: M(limit)
	{
		random = std::time(NULL);
		count = 0;
	}
	
	// 0 - (limit-1)の範囲の乱数を返す
	int rand()
	{
		// 一周したら-1を返す
		if (count == M)
		{
			count = 0;
			return -1;
		}
		
		++count;
		return random = (A * random + C) % M;
	}
	
	// 制限値を返す（乱数は0 - (制限値-1)で発生する）
	int limit()
	{
		return M;
	}

private:
	int random;	 /* 疑似乱数値を保持 */
	static const int A = 21;	/* 8n + 5 */
	static const int C = 11;	/* 2n + 1 */
	const int M;	/* 2^n */
	int count;
};

#endif	// RANDOM_H
