기존에 생성하던 난수
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
for (int i = 0; i < 5; i++) {
printf("난수 : %d \n", rand() % 100);
}
return 0;
}- [!] 이 방식에는 문제가 있다!
- 시드의 값이 ‘초’ 단위로 변한다(너무 느리다는 뜻)
- 균등한 난수 생성이 되지 않는다! (1과 50의 확률이 같지 않음 :: 나머지 연산이기에)
rand()함수 자체의 성능도 좋지 못하다(연관된 난수가 나올 확률이 높음)
그렇기에 새로운 난수 함수를 사용하는 것이 좋다!
Random 라이브러리
#include <iostream>
#include <random>
int main() {
// 시드값을 얻기 위한 random_device 생성.
std::random_device rd;
// random_device 를 통해 난수 생성 엔진을 초기화 한다.
std::mt19937 gen(rd());
// 0 부터 99 까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의.
std::uniform_int_distribution<int> dis(0, 99);
for (int i = 0; i < 5; i++) {
std::cout << "난수 : " << dis(gen) << std::endl;
}
}random_device rd : 컴퓨터의 운영체제 단에서 발생하는 진짜 난수.
즉 수학적 알고리즘이 아닌 컴퓨터의 노이즈 등을 통해 발생함1
std::mt19937 gen(rd()); : 생성된 난수(rd)를 시드값으로 넣는 것2
uniform_int_distribution<int> dis(0, 99); : 0부터 99까지의 균일한 분포 생성