Visual C++ 7.1Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XP中级开发Visual StudioWindowsC++
CTrueRandom - 获取真正的随机数






3.68/5 (22投票s)
2003 年 10 月 14 日
3分钟阅读

127687

2455
CTrueRandom 类为您获取真随机数。
引言
有时您需要真随机数。真随机数与由伪随机数生成器 (PRNG) 生成的数字形成对比,是真正的随机数,即没有模式,也无法预测。伪随机数生成器是计算看起来随机的数字序列的函数。对于大多数情况,这已经足够了,但某些应用程序需要真正的随机数。
例如,您需要在密码学、游戏和各种科学计算领域中使用真随机数。
CTrueRandom
是完全免费的开源软件。您可以对它做任何您想做的事情。但是如果您在应用程序的文档中提到我(Dominik Reichl),那就太好了 :-) 但因为它完全免费,所以也没有任何形式的保证。请自担风险使用。CTrueRandom
如何工作
CTrueRandom
使用 random.org 提供的在线服务 (感谢 random.org!)。Random.org 是一项在线真随机数生成服务。真随机数是使用大气噪声生成的。该类使用 UrlMon.dll 的
URLDownloadToCacheFile
函数。此 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
- 首次发布