您的位置:首页 > 编程语言 > C语言/C++

使用C++如何产生32位随机数

2011-11-14 00:16 549 查看
提到生成随机数,大多数人想到的是调用C++中的rand()函数,但是这里有个问题,rand()只能产生0~RAND_MAX(如在Visual Studio 2010上面最大为0x7FFF,即32767), 如果需要产生的随机数范围是0~232-1,则rand()函数会力不从心,需要使用其他更有效的方法来实现32位随机数的生成。

本文采用三种方法,分别为Mersenne twister算法,调用Windows API CryptGenRandom函数来生成随机数,采用三个rand()生成的数字来拼合为一个数字。本文对这三种方法分别进行了介绍,并在实验中使用这三种方法分别生成了一百万个随机数,并画出了三种生成方法的数字分布图。

一.三种方法的介绍

1. Mersenne twister号称是目前最好的随机数生成算法,它是由Takuji Nishimura 和 Makoto Matsumoto于1997年开发的一种随机数生成方法,它基于有限二进制字段上的矩阵线性再生,可以快速产生高质量的伪随机数,该算法的循环周期为219937-1。Mersenne twister这个名字来自周期长度通常取Mersenne质数这样一个事实,常见的有两个变种Mersenne Twister MT19937和Mersenne Twister MT19937-64,本文实验的就是MT19937算法。关于这种算法更详细的介绍,可以参考博客http://www.cppblog.com/Chipset/archive/2011/11/01/73177.htmlhttp://www.cppblog.com/Chipset/archive/2009/01/19/72330.html,如果对算法本身感兴趣,可以去该算法作者的页面http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html去下载代码实现,如果希望看到关于这个算法的论文,http://wenku.baidu.com/view/bd6c1209bb68a98271fefa91.html?from=related,这篇文章或许会有帮助。

使用三个rand()生成伪随机数生成一个32位随机数

bool ProduceRandomNumberCRand(UINT* RandomArray,UINT size)
{
time_t t;
srand((unsigned)time(&t));
if(RandomArray==NULL)
{
return false;
}
for(UINT i=0;i<size;i++)
{
RandomArray[i]=(rand()<<17)|(rand()<<3)|(rand());
}
return true;
}


二. 三种方法的实验结果

每种方法均进行了100万个32位随机数的生成实验,将这100万个随机数分为0xFFF个组,组之间的间隔为0xFFFFF,然后绘出各个组生成随机数的分布图。

1. MT19937算法的分布



2. CryptGenRandom函数生成随机数分布图



3. 使用三个rand()数生成一个32位随机数的分布图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: