✅ 목표 (Goal)

임의의 수(random number)를 만들어 보자.

✅ 주사위 예제

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int dice_sides = 6; // 주사위의 면은 모두 6개이죠.
    int num_rolls = 6; // 주사위를 n번 던져보아요.

    // 난수 생성기 초기화
    srand((unsigned int)time(NULL));

    printf("주사위를 %d 번 던져보았어요.\\r\\n", num_rolls);
    for (int i = 0; i < num_rolls; i++) { // num_rolls 만큼 주사위를 던지자.
        int dice_result = (rand() % dice_sides) + 1;
        printf("[%d] %d 이(가) 나왔어요.\\n", i + 1, dice_result);
    }

    return 0;
}

image.png

srand를 함수 안에 넣을수가 없네.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <stdint.h>
#include <windows.h>

// 0~ bound 까지 랜덤 넘버를 추출한다.
//현재 srand() 함수가 get_random_number() 함수 내부에 있어, 매번 함수가 호출될 때마다 난수 생성기가 재초기화되고 있습니다.이로 인해 매우 짧은 시간 간격으로 동일한 시드값이 사용되어 같은 "랜덤" 값이 반복적으로 생성됩니다.
uint8_t get_random_number(int bound) {
    int result = 0;
    result= (rand() % bound) + 1;
    // Sleep(20); 이 방법은 좋지않다.
    return (uint8_t)result;
}
/*
비효율성: 프로그램 실행이 불필요하게 느려집니다.
의존성 : Windows 특정 함수(Sleep)를 사용하여 플랫폼 독립성이 떨어집니다.
근본적인 문제 해결 실패 : 난수 생성의 기본 원리를 올바르게 적용하지 않았습니다.
*/
int main() {
    int bound = 6;
    int num_rolls = 6; // 주사위를 n번 던져보아요.

    srand((unsigned int)time(NULL));

    printf("주사위를 %d 번 던져보았어요.\\r\\n", num_rolls);
    for (int i = 0; i < num_rolls; i++) {
        printf("[%d] %d 이(가) 나왔어요.\\n", i + 1, get_random_number(bound));
    }
    return 0;
}