65.9K
CodeProject 正在变化。 阅读更多。
Home

CTrueRandom - 获取真正的随机数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.68/5 (22投票s)

2003 年 10 月 14 日

3分钟阅读

viewsIcon

127687

downloadIcon

2455

CTrueRandom 类为您获取真随机数。

Sample Image - truerandom.jpg

引言

有时您需要真随机数。真随机数与由伪随机数生成器 (PRNG) 生成的数字形成对比,是真正的随机数,即没有模式,也无法预测。

伪随机数生成器是计算看起来随机的数字序列的函数。对于大多数情况,这已经足够了,但某些应用程序需要真正的随机数。

例如,您需要在密码学、游戏和各种科学计算领域中使用真随机数。

CTrueRandom 是完全免费的开源软件。您可以对它做任何您想做的事情。但是如果您在应用程序的文档中提到我(Dominik Reichl),那就太好了 :-) 但因为它完全免费,所以也没有任何形式的保证。请自担风险使用。

CTrueRandom 如何工作

CTrueRandom 使用 random.org 提供的在线服务 (感谢 random.org!)。Random.org 是一项在线真随机数生成服务。真随机数是使用大气噪声生成的。

该类使用 UrlMon.dllURLDownloadToCacheFile 函数。此 DLL 是一个与 Internet Explorer 3.0 或更高版本一起安装的库。所以必须安装 IE。 Internet Explorer 处理完整的下载:如果需要,它使用默认代理,建立与服务器的连接,创建一个文件,并将下载的流存储到其中。 URLDownloadToCacheFile 返回缓存文件的文件名。CTrueRandom 读取该文件并在完成后删除它。

由于速度原因,CTrueRandom 目前一次下载 8192 个随机字节。现在,您可以在缓存文件自动刷新之前调用 GetRandomByte 函数 8192 次,或者 4096 个字,或者 2048 个双字,或者 1024 个双字加 2048 个字等。因此,缓存文件被完全使用,并且 CTrueRandom 不会在每次 GetRandomXXX 调用时都下载随机字节。

因为我们使用在线服务,所以随机数类的速度取决于互联网连接的速度。如果您有 ADSL,您在几秒钟内获得 5 MB 随机字节没有任何问题。如果您知道最终用户只有低速互联网连接,并且需要很多随机字节,请考虑只下载几个真随机字节,并将它们用作伪随机数生成器的种子。

用法

使用 CTrueRandom 类非常容易。这是一个示例代码片段
CTrueRandom rnd;
BYTE pArray[2000];

if(rnd.Initialize() == false)
{
    MessageBox("Initialization of CTrueRandom class failed!","Error",0);
    return;
}

// Get 2000 random bytes
rnd.GetRandomBuffer(pArray, 2000);

BYTE b = rnd.GetRandomByte(); // Get a random byte
WORD w = rnd.GetRandomWord(); // Get a random word
DWORD dw = rnd.GetRandomDWord(); // Get a random dword

rnd.Close(); // We don't need true random numbers any more
公共函数摘要
bool CTrueRandom::Initialize()
在使用任何 GetRandomXXX 函数之前,您必须使用 Initialize 函数初始化该类。此函数尝试建立与 random.org 的连接,并将一些随机数获取到缓存中。如果它无法连接到服务器,则返回 false。如果它成功地将一些随机字节下载到缓存中,则返回 true。

void CTrueRandom::GetRandomBuffer(BYTE *pBuf, DWORD dwBufferSize)
此函数使用 dwBufferSize 随机字节填充缓冲区 pBuf。如果缓存中没有足够的随机字节,它会自动再次连接到服务器并获取一些新的字节。

BYTE CTrueRandom::GetRandomByte()
WORD CTrueRandom::GetRandomWord()
DWORD CTrueRandom::GetRandomDWord()
GetRandomBuffer 函数的各种包装器。应该清楚它们在做什么。

void CTrueRandom::Close()
当您不再需要随机数时,请调用 Close 函数。它将释放已分配的内存和已加载的库。

历史

  • 2003 年 10 月 14 日 - 1.0
    • 首次发布
© . All rights reserved.