random 한 데이터를 추출하기 위해서는
아래와 같은 방법을 자주 사용한다
#include <iostream>
int main()
{
srand(time(nullptr));
int radNum = rand() % 100;
}
하지만,
이는 사실 균등한 랜덤이 아니다
예를 들어, 랜덤함수가 0부터 9까지 나오는 것이 기본이라는 가정을 한다면
이 함수를 가지고 0 ~ 3까지 나오게 하기 위해서
rand() % 4 를 하게 된다
실제로 0, 1, 2, 3의 비율이 균등하게 나오는 것이 아니라
랜덤함수를 열어보면
0, 1, 2, 3 을 통해 0, 1, 2, 3
4, 5, 6, 7 을 통해 0, 1, 2, 3
8, 9 에서는 0, 1
이처럼 균등하게 나오지 않고 0, 1의 비율이 높은 상태가 된다
따라서 모듈레이션을 통해 랜덤함수를 뽑는 것은 랜덤 하지 않다
이를 해결하기 위해
C++ 11부터 random library를 제공한다
아래를 통해 알 수 있다
#include <iostream>
#include <random>
int main()
{
std::mt19937 mt(1234);// 동일한 시드를 넣으면 다른 머신에서도 동일한 랜덤숫자가 뽑힘
std::uniform_int_distribution<int> dist(0, 99);
int randNum = dist(mt);
std::cout << randNum << std::endl;
}
하지만 위의 주석처럼 동일한 시드를 넣으면
항상 동일한 랜덤 숫자가 뽑히게 되니
이를 안전하고 완전한 랜덤으로 구현하기 위해서는 아래와 같이 사용하면 된다
하지만, 위의 과정보다 처리시간이 매우 많이 길어진다는점은 유의해야 한다
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 mt(rd());// 완전한 랜덤을 구현하려면 이렇게 하면된다 하지만 위보다 처리시간이 많이 길어짐
std::uniform_int_distribution<int> dist(0, 99);
int randNum = dist(mt);
std::cout << randNum << std::endl;
}
'C++ > [노코프] Tips' 카테고리의 다른 글
[C++ Tips] 클래스/구조체 멤버 정렬 (0) | 2024.04.05 |
---|---|
[C++ Tips] switch case (0) | 2024.04.05 |
[C++ Tips] Unit Test (0) | 2024.04.05 |
[C++ Tips] 생성자 리스트 (0) | 2024.04.04 |
[C++ Tips] const, constexpr (0) | 2024.04.04 |