本文将介绍如何使用C++ TR1(C++ 标准委员会 Technical Report 1) 提供的随机数生成功能 除了介绍基本的一致随机数生成之外,还会介绍随机样本的可能分布,包括:柏努利分布,二项分布,指数分布,伽马分布,几何分布,正态分布和泊松分布。我会指出一些针对特定分布需要注意的地方,比如参数约定,最后还会给出一些提示,比如如何使用TR1不直接支持的分布产生随机数,比如柯西分布,chi-squared分布和Student t.
Visual Studio 2008 现在通过 feature pack支持TR1扩展(orbit注:微软已经发布了Visual Studio 2008的Services Pack 1,它包含了此前发布的feature pack,以及完整的TR1支持),其它支持TR1的软件或库有 Boost和Dinkumware. GCC 从4.3版本开始支持 C++ TR1.
为了清楚起见,本文的例子代码都使用了完整的名字空间(namespace)限定,你可以使用using语句来消除这些限定。想要了解更多的例子代码可以看看这篇文章 测试 C++ TR1 随机数生成机制 ,此文还介绍了一个不太成熟的测试框架。
提纲
开始
头文件和名字空间(namespace)
核心引擎
设置种子
从均匀分布生成随机数
离散整数
实数
非均匀分布生成随机数
直接支持的分布
柏努利分布
二项分布
指数分布
伽马分布
几何分布
正态分布(Gaussian)
泊松分布
其它分布
柯西分布(Cauchy)
卡方分布(Chi squared)
T分布(Student t)
开始头
文件和名字空间(namespace)
C++ 的随机数生成类和函数都在 <random> 头文件中定义,并包含在名字空间(namespace)std::tr1中,注意在C++中 tr是小写字母,在英语文本中“TR”是大写的。
核心引擎
任何伪随机数生成软件的核心就是一个生成均匀分布的随机整数的例程,它被用在引导过程中产生均匀分布的实数,这些均匀分布的实数再通过各种变换(算法)产生其它分布,例如“接受-拒绝”算法,不过这些都需要一个原始的随机数做为起始。