C++/Library 2021. 3. 11. 16:32

난수 생성 (Random Number Generation)

Linear congruential generator

  • 선형 합동 생성기

    • 널리 알려진 유사난수 생성기이다.
    unsigned int    PRNG()  // Pseudo Random Number Generator
    {
        static unsigned int seed = 5523;  // seed number
    
        seed = 8253729 * seed + 2396403;
        return (seed % 32768);
    }

std::rand

  • std::rand() 함수로 나올 수 있는 최댓값인 RAND_MAX를 이용하여 범위를 제한한다.

    • 고르게 분포되지는 않는다.
    #include <iostream>
    
    int getRandomNumber(int min, int max)
    {
        static const double fraction = 1.0 / (RAND_MAX + 1.0);
    
        return (min + static_cast<int>((max - min + 1) * \
                                        std::rand() * fraction));
    }
    
    int main()
    {
        using namespace std;
    
        for (int i = 0; i < 10; ++i)
            cout << getRandomNumber(5, 8) << '\n';
    }

<random>

  • C++11

  • 위의 경우들보다 더 정교하다.

  • Mersenne Twister

    • 난수 발생 속도가 빠르고 메모리를 적게 차지한다.

    • 난수 발생 주기(똑같은 숫자가 발생하는 주기)가 메르센 소수인 2^19937 - 1이라서 이름이 mt19937이다.

    • 참고 : 케이플러스

    #include <iostream>
    #include <random>
    
    int main()
    {
        using namespace std;
    
        random_device   rd;
        mt19937         mersenne(rd());
        uniform_int_distribution<> dice(1, 6);
    
        for (int i = 0; i < 10; ++i)
            cout << dice(mersenne) << endl;
    }

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

C++ cin.ignore  (0) 2021.03.11
C++ cin  (0) 2021.03.11
C++ 입력 버퍼 무시하기  (0) 2021.03.10
C++ typeinfo  (0) 2021.03.10
C++ 출력 버퍼 비우기  (0) 2021.03.10