[C++] srand((unsigned int) time(NULL))

유빈·2024년 3월 8일
0

C++

목록 보기
3/12
post-thumbnail

전공수업 [객체지향프로그래밍]에서의 공부내용을 기록합니다!🐯



1. Problem

문제 - code16: Gambler's Ruin Simulation (권오흠 교수님 출처)

동전을 던져서 앞면이 나오면 + $1
동전을 던져서 뒷면이 나오면 - $1

초기자본(stake)과 목표액(goal)이 주어질 때, 목표액에 도달하면 이기고, 돈을 모두 잃으면 진다
게임을 T번 반복하여 승률을 출력하는데, T와 초기자본, 목표액은 입력으로 주어진다..
게임에서 이길 확률을 계산해보자.


2. Pseudo Code

cstdlib 헤더파일을 선언한다.

cstdlib 헤더파일 속 난수 생성 함수인 srand()를 사용하여 난수 생성을 위한 
초기값을 설정한다.

변수 T, stake, goal을 차례대로 입력받는다.

for t = 0 to T-1 do
    cash = stake 
    while cash > 0 && cash < goal 
        if rand() % 2 == 0 then cash++
        else                    cash--
    endwhile
    if cash == goal then 
        wins++
    endif 
endfor

승률을 출력한다.


#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
    int stake, goal, T;
    int wins = 0;
    
    srand((unsigned int) time(NULL));  // 난수생성기

    cin >> stake >> goal >> T;  // 초기자본, 목표금액, 횟수를 입력받음

    for (int t = 0; t < T; t++) {
        int cash = stake;
        while (cash > 0 && cash < goal) {   // 파산하지 않고, 목표금액보다
            if (rand() % 2 == 0)    cash++; // 현재 금액이 적을 때 
            else                    cash--;
        }
        if (cash == goal)   // 저본이 목표금액과 같아진다면, 승리
            wins++;
    }
    cout << 100*wins/(double)T << endl;
    
    return 0;
}

3. srand()

Random Number Generator (난수생성기) : 랜덤 숫자를 출력해주는 라이브러리 함수

사실, 컴퓨터는 랜덤 숫자를 출력하는 것은 말이 안된다. 컴퓨터는 기계이므로 물리적인 동작을 하지 않는다. 그리고 같은 조건에서는 모두 같은 결과만 나오므로 deterministic(결정론적인)이라고 한다. 엄밀한 의미에서는 위와 같지만, pseudo random number generator을 사용하여 랜덤 숫자를 출력할 수 있다.

3-1. pseudo random number generator

가짜로 랜덤 숫자를 출력한다고 하여 pseudo random number generator라고 한다. 이를 사용하기 위해서는 맨 처음에 seed라는 값을 주어야 한다. 이때 주는 정수값이 같으면 출력되는 값은 항상 같게 된다. 그러므로 매번 다른 수인 seed를 주기 위해 time(NULL)을 사용한다.


srand((unsigned int) time(NULL))

time(NULL)은 현재 시각을 의미하고, 항상 시간은 다를 수 밖에 없으니 같은 값이 출력되는 것을 방지할 수 있다.


profile
🌱

0개의 댓글