난수를 발생시키기 위해서는 아래 3가지가 필요하다.
난수 생성기는 std::random_device
를 사용한다. (이것밖에 없는듯)
엔진은 여러가지가 있지만 주목해야 할것은 메르센 트위스터 엔진이다.
std::mt19937
= 32비트 메르센 트위스터 엔진.std::mt19937_64
= 64비트 메르센 트위스터 엔진.일반적으로 사용하는 균등 분포에는 3가지가 있다.
uniform_int_distribution
: a,b 에서 균등한 정수값을 생성한다.uniform_real_distribution
: a,b 에서 균등한 실수값을 생성한다.generate_canonical
: 사용하지 말라고 명시됨.#include<random>
int main() {
std::random_device rd; //생성기
std::mt19937 gen(rd()); //엔진
std::uniform_real_distribution<float> rand_real(0, 1); //실수 분포기
for (int i = 0; i < 10; i++) {
std::cout << rand_real(gen) << std::endl;
}
std::uniform_int_distribution<int> rand_int(0, 100); //정수 분포기
for (int i = 0; i < 10; i++) {
std::cout << rand_int(gen) << std::endl;
}
}
만일 std::uniform_real_distribution
에서 [a,b] 를 (포함,포함) 으로 사용하고 싶다면
b 대신 b+아주작은수 를 넣어주면 된다.
0부터 1까지 뽑고싶다면 아래와 같이 하면 된다.
std::uniform_real_distribution<float> rand_real(0, 1+std::numeric_limits<float>::denorm_min());
C++ random 에 대한 자세한 내용은 https://msdn.microsoft.com/ko-kr/library/bb982398.aspx 에서 확인 할 수 있다.