728x90
rand함수
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
srand(time(NULL));
for (int i = 0; i < 5; i++)
{
printf("Random Num : %d \n", rand() % 100);
}
return 0;
}
rand함수를 이용한 위 코드를 보면 srand, time, rand와 같은 함수들을 볼 수 있다.
우선 위의 코드는 실제 난수를 생성하는 코드가 아니라 난수처럼 보이도록 하는 의사 난수(pseudo random number)를
생성하는 코드이다. srand 함수로 무작위로 정해지는 첫 숫자인 seed를 설정할 수 있다. 위 코드의 경우 time(NULL)을 통해 프로그램을 실행했던 시간 초를 시드값으로 지정햇다. 그리고 rand() 함수는 호출할 때마다 시드값을 기반으로 무작위처럼 보이는 수열을 생성하게 된다. rand() % 100은 100의 나머지에 해당하는 숫자들 즉, 0에서 99까지의 난수를 생성하는 코드이다.
그러나 위의 코드를 이용하여 생성한 난수들에는 몇몇 문제가 있다. 우선 시드값이 너무 천천히 변한다는 단점과 rand()함수 자체의 성능의 문제가 있고 가장 치명적인것은 난수가 균등하게 생성되지 않는 것이다.
<random> 라이브러리
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dis(0, 99);
for (int i = 0; i < 5; i++)
{
std::cout << "Ramdom Num : " << dis(gen) << std::endl;
}
}
random_device는 운영체제에서 제공하는 진짜 난수를 사용할 수 있도록 한다. 하지만 진짜 난수는 의사 난수보다 난수를 생성하는 속도가 느리다. std::mt19937은 C++ <random> 라이브러리에서 제공하는 난수 생성 엔진 중 하나로, 메르센 트위스터라는 알고리즘을 사용한다. 메르센 트위스터는 다른 글에서 자세히 다루도록 한다. 추가적으로 uniform_int_distribution을 통해 균등 분포 난수를 추출할 수 있도록한다.
728x90
'Sketch (Programming Language) > C & C++' 카테고리의 다른 글
Quick sort (0) | 2022.12.23 |
---|---|
Merge sort (0) | 2022.12.22 |
Bubble sort, Insertion sort, Selection sort (0) | 2022.11.08 |