코딩/C++

[C++] 난수 생성

Hun die 2022. 4. 11. 18:09

 

난수 생성

 

rand(); = 0~32767사이의 랜덤한 값을 반환한다. 

 

예시)

cout << rand() << endl;

결과)

여러번 시도를 해도 결과값은 41에서 바뀌지 않는다.

 

결과를 바꾸는 위해선?

 

난수는 함수의 내부에 있는 seed값에 의해 리턴값이 바뀌게 된다.

하지만, 아무런 설정도 안 했을 경우 기본 시드 값이 1로 세팅되어 있어 41이라는 결과 밖에 나오지 않는다.

그렇기에 seed값을 랜덤으로 바꾸는 방법이 필요하다.

 

srand(time(NULL)); = 계속 바뀌는 시간을 기준으로 seed값을 변경한다.

 

예시)

srand(time(NULL));
cout << rand() << endl;

결과)

여러번 시도를 한 결과 결과값이 바뀌는 것을 볼 수 있다.

 

랜덤 값의 범위 지정 (최대값)

 

랜덤 값을 설정할 수 있게 되었으니 랜덤값의 범위를 정해보자.

 

rand()% A = A미만의 숫자중 하나를 반환한다.

 

예시) 10 미만의 숫자를 반환하게 하는 프로그램

srand(time(NULL));
cout << rand() % 11 << endl;
왜?

rand()로 나오는 숫자에서 11(A)로 나머지를 구하게되면
rand()로 어떤 숫자가 나오든 나머지로 10이상의 숫자가 나올 수 없기에 0 ~ 10사이의 숫자가 출력된다.

 

랜덤 값의 범위 지정 (최소값)

 

랜덤 값의 최대치를 설정할수 있게 되었으니 이번엔 최소 값을 설정해보자.

 

rand()% A + B = 최대 값(A - B + 1) ~ 최소값(B) 사이의 숫자 중 하나를 반환한다.

 

예시) 3에서 7 사이의 랜덤한 숫자를 출력하는 프로그램

srand(time(NULL));
cout << rand() % 5 + 3 << endl;
왜?

나머지로 나온 숫자 A에서 +B 를 해주면 어떤 결과가 나와도 B이상의 숫자가 나오게 되기에 최소값이 된다.

ex) A =랜덤, B = 3  ->  A + 3= 최소 3이상의 숫자.

그렇기에 최대 값은 (A - B + 1) , 최소 값은 B가 되는 것이다.

 

실습
실습 1. 3 ~ 7사이의 랜덤한 숫자를 출력하는 프로그램을 작성하자.
실습 2. 가장 작은 값과 큰 값을 입력 받아서 그 사이의 임의의 값을 출력하는 프로그램을 작성
실습 3. 프로그램을 실행하면 내부적으로 1~10 사이의 숫자가 정답으로 정해진다.
1~10 사이의 숫자를 입력하면 맞으면 True 틀리면 False를 출력한다.
int main()
{   
    srand(time(NULL));
    
    //실습 1
    cout << rand()% 5 + 3 << endl;
 	
    //실습 2
    int SNum;
    int PNum;
    
    cout << "최소 수 입력 : ";cin >> SNum;
    cout << "최대 수 입력 : ";cin >> PNum;
    cout << rand() % (PNum - SNum - 1) + SNum << endl;
	
    //실습 3
    int Ran;
    int RanIn;
    
    Ran = rand()% 9 + 1; 
    cout << "정답입력" << endl;
    cin >> RanIn;
    cout << Ran << endl;
    (Ran == RanIn) ? cout << "정답" << endl : cout << "오답" << endl;
}

 

'코딩 > C++' 카테고리의 다른 글

[C++] 배열  (0) 2022.04.13
[C++] 제어문  (0) 2022.04.12
[C++]연산자  (0) 2022.04.07
[C++]변수명 이름 규칙  (0) 2022.04.07
[C++]컴퓨터 정의, 데이터 타입 정리  (0) 2022.04.07