C++ 랜덤?


(바보털) #1

랜덤 수를 생성하는 함수를 리턴하는 함수입니다.

template< typename T >
auto make_random(T start, T end);

template<>
auto make_random< int >(int start, int end)
{
      std::bind(std::uniform_int_distribution(start, end), std::mt19937(time(0)));
}

//short, long long...

template<>
auto make_random< float >(float start, float end)
{
      std::bind(std::uniform_real_distribution(start, end), std::mt19937(time(0)));
}

//double, long double

타입별로 함수를 모두 쓰기는 귀찮아서 몇 가지 방법을 생각해 보았지만, C++에서는 불가능한 것처럼 보였습니다.

처음 떠올린 방법은 random메서드를 가진 integral클래스와 float_point클래스를 만들어 int, char, float 등이 이것들을 적절하게 상속해 주도록 클래스를 수정해 주는 것입니다. 하지만, int, char등은 클래스가 아닐 뿐더러 클래스 수정도 불가능하기 때문에 포기했습니다(되면 좋겠다).

두 번째 방법은
struct i32: int, integral{};인데, 이것도 int를 상속할 수 없어서 포기했습니다. 비아네쉒…

좋은 방법이 없을까요?


(바보털) #2
assert((std::is_integral< T >::value || std::is_floating_point< T >::value) && "It is not a default type...");

return std::is_integral< T >::value ? std::bind(std::uniform_int_distribution(start, end), std::mt19937(time(0))) : std::bind(std::uniform_int_distribution(start, end), std::mt19937(time(0)));

현실과 타협했읍니다 감사합니다


(outersky) #3

mt19937에는 타임 넣어주어도 좋지만 같은 random 헤더의 device_random도 마찬가지로 완전난수 니까 사용하셔도 좋을것 같네요 굳이 이유 만들자면 일단 time()은 리턴타입이 정의 안되있어요 time_t가 컴파일러 맘대로 정의하는 거라서요.

여담인데 c++ random헤더 참 좋은것 같습니다.
슈도랜덤 엔진만 좋은게 아니라.
유니폼 디스트리뷰션
정규분포
카이제곱분포
t분포
F분포(이건 있나 햇갈리네요)
등등 통계하면써 쓸일 많은 분포들이 다 있으니깐요.


(L) #4

STL이 더 풍부해지면 풍부해질수록 더 좋죠
파이썬 정말 쓰기 싫다…


(프로책팔이) #5

꽈이선을 쓰는 이유는 그냥 쓰는 사람이 많고 꽈이썬 지원하는 것들이 많아서라 그렇다더라