기존에 생성하던 난수

#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. 시드의 값이 ‘’ 단위로 변한다(너무 느리다는 뜻)
  2. 균등한 난수 생성이 되지 않는다! (1과 50의 확률이 같지 않음 :: 나머지 연산이기에)
  3. 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까지의 균일한 분포 생성

Footnotes

  1. 의사난수로 생성하는 것에 비해 매우 느림

  2. std::mt19937은 C++ <random>에서 제공하는 난수 생성 엔진이다.