在C++11之前,C和C++都依赖于函数rand来生成随机数。此函数生成均匀分布的伪随机整数,每个随机数的范围在0和一个系统相关的最大值(至少为32767)之间。
rand函数有一些问题:很多程序需要不同范围的随机数,一些应用需要非均匀分布的数。而程序员为了解决这些问题而试图转换rand生成的随机数的范围、类型或分布时,常常会引入非随机性。
定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分布类。一个引擎类可以生成unsigned随机数序列,一个分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数。
C++程序不应该使用库函数rand,而应使用default_random_engine类和恰当的分布类对象。
随机数引擎和分布
标准库定义了多个随机数引擎类,区别在于性能和随机性质量不同。每个编译器都会指定其中一个作为default_random_engine类型,此类型一般具有最常用的特性。随机数引擎是函数对象类,定义了一个不接受参数的调用运算符,并返回一个随机的unsigned整数。
std::default_random_engine e;
for (size_t i = 0; i < 10; ++i)
std::cout << e() << " ";
std::cout << std::endl;
随机数引擎的操作有:
分布类型和引擎
对于大多数场合,随机数引擎的输出是不能直接使用的,问题在于生成的随机数的值范围通常与我们需要的不符。为了得到一个指定范围内的数,我们使用一个分布类型的对象:
std::uniform_int_distribution<unsigned> u(0, 9);
std::default_random_engine e;
for (size_t i = 0; i < 10;