2021. 8. 3. 19:18ㆍC++
// 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;
'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 |