C++ 랜덤시드

2021. 8. 3. 19:18C++

728x90

// C언어 스타일의 랜덤시드 (난수 생성)

1. 난수의 정의

- 특정한 순서나 규칙을 가지지 않는 수

2. 생성 방법

1) #include <time.h> 입력하여

시간 관련 요소를 사용하겠다고 고지한다.

2) srand()와 time()을 사용하여 초기화

(1) srand() : 전달받는 요소를 기반으로 난수 초기화를 실시함

보통 main() 함수 첫부분에 기입.

(2) time() : 현재 시간을 가져온다.

[예시]

srand(time(NULL));

time(NULL)을 하면 1970.01.01 00:00 부터

현재까지 흐른 초단위 시간을 리턴 (유닉스 타임 리턴)

(3) rand() 함수를 사용하여 난수를 추출

rand() : 호출할 때마다 지정된 시드값을 기반으로

무작위처럼 보이는 난수 열을 생성한다.

[예시]

rand() % n : 0 ~ n-1 범위의 난수를 생성

rand() % n + 1 : 1 ~ n 범위의 난수를 생성

3. 사용처

- 강화나 뽑기 같은 랜덤요소에서 사용

4. 범위값 지정

- 랜덤 범위값을 특정하고 싶은 경우

- rand() % (최대값 - 최소값 + 1) + 최소값

- 10 ~ 20 사이의 값을 정하고싶으면

rand() % (20 - 10 + 1) + 10

5. 단점

- 시드 값을 유닉스 타임으로 지정해놨기 때문에,

같은 시간대에 시작된 프로그램이 존재할 경우

모두 같은 의사 난수열을 생성한다.

- 생성 범위가 [ 0 ~ 32,767 ] 로 한정되어 있다.

// C++ 스타일의 랜덤시드

- C++11 표준부터 새로운 방식의 난수 생성이 표준 재정됨

- #include <random> 한 후에 난수를 만든다.

[예시]

// std::random_device : 내부적으로 하드웨어의 현재 상태나 시간과 같은 리소스를 받아온다(ex : OS가 기동된 시간, 마우스 클릭시 생성된 난수 등등...etc)

random_device generator;

// std:mt19937

// 메르센 트위스터 32비트 버전을 사용, 인수는 초기 시드값(random_device)

mt19937 engine(generator());

// 난수의 범위를 지정 -> 균등분포(uniform distribution)

rand() % n 연산보다 더 정확한 범위의 난수를 얻을 수 있다.

uniform_int_distribution<> random(0, 99);

-> 0 ~ 99까지의 수를 반환

cout << random(engine) << endl;

728x90

'C++' 카테고리의 다른 글

C++ String  (0) 2021.08.04
C++ 구조체  (0) 2021.08.04
C++ 반복문 사용하기  (0) 2021.08.03
C++ 반복문 응용하기  (0) 2021.08.03
C++ 반복문 배열 사용하기  (0) 2021.08.02