locked
FAQ:2.18 我们在VC++中如何产生一个随机数? RRS feed

答案

  • 我们可以使用CRT中的rand函数来产生一个随机数。在调用rand前,请使用srand()函数设置种子,这个函数能触发随机数发生器(RNG)产生一个相对特定的值(主要是根据当前的时间)。

    代码:

    int randNumber;

    srand(time(NULL));

    randNumber = rand();

     

    Windows里,我们还可以选择使用Cryptography中的CryptGenRandom函数,这函数可以在缓冲区中填入cryptographically随机字节。

    一个产生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()

    {

        //--------------------------------------------------------------------

        // Declare and initialize variables.

        HCRYPTPROV   hCryptProv;

        BYTE         pbData;

     

        //-------------------------------------------------------------------

        // Acquire a cryptographic provider context handle.

     

        if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))

        {   

            printf("CryptAcquireContext succeeded. \n");

        }

        else

        {

            printf("Error during CryptAcquireContext!\n");

        }

     

        //--------------------------------------------------------------------

        // Generate a random BYTE.

     

        if(CryptGenRandom(hCryptProv, 1, &pbData))

        {

            printf("Random number is: %d.\n", ((int)pbData) * 100 / 255);

        }

        else

        {

            printf("Error during CryptGenRandom.\n");

            exit(1);

        }

     

        //-------------------------------------------------------------------

        // Clean up

        if(hCryptProv)

        {

            if (!CryptReleaseContext(hCryptProv, 0))

            {

                printf("Failed CryptReleaseContext\n");

            }

        }

     

        return 0;

    }

     

    相关英文论坛的帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/be9f4cb2-77f1-4a99-8a90-b8fcfb1bd5ac

     

    Related Thread:

    http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/be9f4cb2-77f1-4a99-8a90-b8fcfb1bd5ac


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 3:10