#pragma once
#include <random>

namespace DXFW
{
/// <summary>乱数生成のクラス</summary>
///	<example>
///	[サンプルコード:未完成]<BR>
/// サンプル説明<BR>
///	<code>
///	int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
///	{<BR>
///		if( !Dx::Initialise() ) return -1;<BR>
///		Dx::End();<BR>
///		return 0;<BR>
/// }<BR>
/// </code>	
/// </example>
class Rand
{
private:
	static std::mt19937 engine;
	Rand();
	~Rand();
public:
	/// <summary>乱数を初期化する</summary>
	static void Reset(int seed)
	{
		engine.seed(seed);
	}
	
	///<summary>乱数を取得</summary>
	///0〜最大値の範囲の乱数を返す
	///戻り値の型と引数の型は同じ
	static double Get(double 最大値)
	{
		std::uniform_real_distribution<double> range(0.0 , 最大値);
		return range(engine);
	}
	static int Get(int 最大値)
	{
		std::uniform_int_distribution<int> range(0 , 最大値);
		return range(engine);
	}
	
	///<summary>範囲を指定して乱数を取得</summary>
	///最小値〜最大値の範囲の乱数を返す
	///戻り値の型と引数の型は同じ
	static double Get( double 最小値 , double 最大値)
	{
		std::uniform_real_distribution<double> range( 最小値 , 最大値);
		return range(engine);
	}
	static int Get( int 最小値 , int 最大値)
	{
		std::uniform_int_distribution<int> range( 最小値 , 最大値);
		return range(engine);
	}
};
}