#pragma once


#ifndef _USING_PCH_

#   include <boost/random.hpp>


#if _MSC_VER < 1600

using namespace boost;

#endif


#ifndef _HAS_CPP0X

#   define nullptr 0

#endif



#endif


//////////////////////////////////////////////////////////////////////////


class Random

{

public:

Random();

    Random( uint32_t seed );

~Random();


//////////////////////////////////////////////////////////////////////////


int Int();

int Int( int max );

int Int( int min, int max );


float Real();

float Real( float max );

float Real( float min, float max );


//////////////////////////////////////////////////////////////////////////


uint32_t    GetSeed()   const;

    void    SetSeed( uint32_t seed );


private:

    uint32_t    _seed;


boost::random::mt19937 _generator;

};


//=====================================================================


#include "stdafx.h"


#ifndef _USING_PCH_

#   include "random.h"

#endif


//////////////////////////////////////////////////////////////////////////


Random::Random()

: _seed( static_cast< uint32_t >( ::time( nullptr ) ) ),

        _generator( _seed )

{

    

}


Random::Random( uint32_t seed )

: _seed( seed ),

        _generator( _seed )

        

{


}


Random::~Random()

{


}


//////////////////////////////////////////////////////////////////////////


int Random::Int()

{

return boost::random::detail::generate_uniform_int( _generator, 0, INT_MAX );

}


int Random::Int( int max )

{

return 0 >= max ? 0 : boost::random::detail::generate_uniform_int( _generator, 0, max );

}


int Random::Int( int min, int max )

{

return min >= max ? max : boost::random::detail::generate_uniform_int( _generator, min, max );

}


float Random::Real()

{

return boost::random::detail::generate_uniform_real( _generator, 0.f, 1.f );

}


float Random::Real( float max )

{

return 0.f >= max ? 0.f : boost::random::detail::generate_uniform_real( _generator, 0.f, max );

}


float Random::Real( float min, float max )

{

return min >= max ? max : boost::random::detail::generate_uniform_real( _generator, min, max );

}


//////////////////////////////////////////////////////////////////////////


uint32_t    Random::GetSeed()   const

{

    return  _seed;

}


void Random::SetSeed( uint32_t seed )

{

    _seed   = seed;


_generator.seed( _seed );

}


//=====================================================================


근데 저 랜덤이 언제부터 표준에 들어왔냐


이거 예전에 만들어두고 쓰던 거라 표준에 포함됬는지도 몰랐다 ㅎ