Step By Step: Visual C++에서 난수 생성 방법

기술 자료: 983137 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

소개

Visual C++에서는 난수를 생성하기 위해 전통적으로 CRT(C Run-time Libraries) 함수인 srand()rand()를 사용하였습니다. 이 문서에서는 이와 더불어 윈도우에서 제공하는 Cryptography API의 하나인 CryptGenRandom() 함수를 이용하여 난수를 생성하는 방법에 대해 간략히 설명합니다.

방법

방법 1: CRT 함수를 이용한 난수 생성 방법

CRT 함수를 이용하여 난수를 생성하려면 rand() 함수를 사용합니다. 그런데 rand() 함수를 호출하려면 반드시 srand() 함수를 먼저 호출해야 하며, 이 때 적절한 seed 값을 매개변수로 전달해야 합니다. 이러한 seed 값으로는 time() 함수의 반환 값을 이용하는 것이 일반적인 사용 예입니다.
int randNumber;
srand(time(NULL));
randNumber = rand();

방법 2: Cryptography API를 이용한 난수 생성 방법

윈도우 환경에서 난수를 생성해야 하는 경우라면 CRT 함수 대신 Cryptography API의 하나인 CryptGenRandom() 함수를 고려해 볼 수 있습니다.
이 함수를 이용하면 주어진 버퍼의 크기만큼 난수를 생성할 수 있는 장점이 있습니다.

다음은 0부터 100의 범위 내에서 난수를 생성하는 예제 코드입니다.
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#pragma comment(lib, "crypt32.lib")
#include <Wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

int main()
{
    //--------------------------------------------------------------------
    // 변수를 선언하고 초기화 합니다.
    HCRYPTPROV   hCryptProv;
    BYTE         pbData;

    //-------------------------------------------------------------------
    // 암호 제공자의 컨텍스트 핸들을 얻습니다.

    if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) 
    {    
        printf("CryptAcquireContext succeeded. \n");
    }
    else
    {
        printf("Error during CryptAcquireContext!\n");
    }

    //--------------------------------------------------------------------
    // BYTE 범위내에서 난수를 생성합니다.

    if(CryptGenRandom(hCryptProv, 1, &pbData)) 
    {
        printf("Random number is: %d.\n", ((int)pbData) * 100 / 255);
    }
    else
    {
        printf("Error during CryptGenRandom.\n");
        exit(1);
    }

    //-------------------------------------------------------------------
    // 컨텍스트 핸들을 해제합니다.
    if(hCryptProv)
    {
        if (!CryptReleaseContext(hCryptProv, 0))
        {
            printf("Failed CryptReleaseContext\n");
        }
    }

    return 0;
}

의견 보내기

표 축소표 확대
그림 축소그림 확대
의견 보내기

Microsoft 고객지원 사이트에서는 고객님의 소리를 귀담아 듣습니다. 아래 의견 보내기로 소중한 의견 보내주시기 바랍니다.

속성

기술 자료: 983137 - 마지막 검토: 2014년 5월 23일 금요일 - 수정: 1.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 2008 Express Edition
키워드:?
kbstepbystep kbhowto KB983137

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com