[C++] 숫자 맞추기 게임

chxxrin·2024년 7월 24일
0

C++

목록 보기
8/22

1이상 99이상 숫자 맞추기 게임

#include <iostream>
#include <random> // 난수 생성

using namespace std;

int main()
{
    // 난수 생성
    // https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> distrib(1, 99); // [1, 99]

    int number = distrib(gen);

    while (1) // true 대신 숫자 1로 무한 반복도 많이 사용합니다.
    {
        int guess;
        cout << "입력: ";
        cin >> guess;

        if (guess > number)
        {
            cout << "너무 커요!" << endl;
        }
        else if (guess < number)
        {
            cout << "너무 작아요!" << endl;
        }
        else
        {
            cout << "정답이에요!" << endl;
            break;
        }
    }

    return 0;
}

난수 생성:

  • C++ 표준 라이브러리를 사용하여 난수 생성기를 초기화하고, 지정된 범위 내에서 균등 분포를 따르는 정수를 생성하는 방법
    std::random_device rd; //객체를 생성하여 난수 생성기의 시드 값을 얻습니다.
    std::mt19937 gen(rd()); //std::mt19937 객체를 생성하고, std::random_device로부터 얻은 시드 값으로 초기화합니다.
    std::uniform_int_distribution<> distrib(1, 99); // 객체를 생성하여, 1에서 99 사이의 정수를 균등하게 생성할 수 있도록 설정합니다.[1,99]

1. std::random_device rd;:

  • std::random_device는 하드웨어 엔트로피 소스를 사용하여 난수를 생성하는 클래스입니다. 이는 진정한 난수를 생성할 수 있는 하드웨어 장치를 사용하는 경우 유용합니다.
  • rd는 std::random_device 객체의 인스턴스입니다.

2. std::mt19937 gen(rd());:

  • std::mt19937는 Mersenne Twister 19937 난수 생성기 엔진입니다. 이는 매우 빠르고 품질이 높은 의사 난수를 생성하는 엔진입니다.
  • gen은 std::mt19937 객체의 인스턴스입니다. 생성자에 rd()를 전달하여 std::random_device로부터 초기 값을 받아 난수 생성기를 시드(seed)로 초기화합니다. 이렇게 하면 매번 다른 시드 값으로 초기화되어 서로 다른 난수 시퀀스를 생성할 수 있습니다.

3. std::uniform_int_distribution<> distrib(1, 99);:

  • std::uniform_int_distribution<>는 지정된 범위 내에서 균등 분포를 따르는 정수를 생성하는 분포 클래스입니다.
  • distrib은 std::uniform_int_distribution<> 객체의 인스턴스입니다. 생성자에 1과 99를 전달하여, 1에서 99 사이의 정수를 균등하게 생성하도록 설정합니다. 이는 [1, 99] 범위에 있는 정수를 생성합니다.
  • 난수 변수에 저장 : int number = distrib(gen);

이진 탐색(Binary Search)

    보충: 하나씩 다 비교하는 방법과 이진 탐색 비교
    [1,99] // 99가지 -> 98/2 = 49 : 너무 작아요~
    [51, 99] // 49가지 -> 48/2 = 24 : 
    [51, 74] // 24가지
    [63, 74]
    [69, 74]
    [72, 74]
    총 6번의 입력으로 구함!
   

전체코드

/*
    홍정모 연구소 https://honglab.co.kr/
*/

#include <iostream>
#include <random> // 난수 생성

using namespace std;

int main()
{
    // 난수 생성
    // https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> distrib(1, 99); // [1, 99]

    int number = distrib(gen);

    while (1) // true 대신 숫자 1로 무한 반복도 많이 사용합니다.
    {
        int guess;
        cout << "입력: ";
        cin >> guess;

        if (guess > number)
        {
            cout << "너무 커요!" << endl;
        }
        else if (guess < number)
        {
            cout << "너무 작아요!" << endl;
        }
        else
        {
            cout << "정답이에요!" << endl;
            break;
        }
    }

    // 보충: 하나씩 다 비교하는 방법과 이진 탐색 비교
    // [1,99] // 99가지 -> 98/2 = 49 : 너무 작아요~
    // [51, 99] // 49가지 -> 48/2 = 24 : 
    // [51, 74] // 24가지
    // [63, 74]
    // [69, 74]
    // [72, 74]
    // 총 6번의 입력으로 구함!

    return 0;
}

출처 : 홍정모 유튜브

0개의 댓글

관련 채용 정보