旧式的随机数发生器沿用C的Rand()函数,这个函数会产生区间在[0,RAND_MAX]的伪随机数,且随机数近似可以看做符合均匀分布。
传统做法的弊端大致有两个:
1、经常需要做人肉变换随机数产生区间,且人肉变换过程中极易破坏原有的分布性质;
2、难以产生符合制定分布的随机数;
rand()函数的一些问题:
很多程序需要不同范围的随机数;
一些应用需要随机浮点数;
一些程序需要非均匀分布的数;
而程序员为了解决这些问题而试图转换rand生成的随机数的范围、类型或分布时,常常会引入非随机性。
一、C++ 11新标准针对这两点做了很大的改进——随机数发生器(定义在头文件random)。
新设施利用两部分来生成随机数:
(1)、random number engines(引擎类):负责生成原始随机数
(2)、random number distributions(分布类): 迫使生成的随机数在统计上满足指定的概率分布
STL预先指定了一系列的生成引擎,并且提供一个default_random_engine。default_random_engine会使用某个预定义的引擎,且不同编译器、不同平台的实现可能不同。
PS:有关详细的预定义引擎及分布类列表:
例子1:
std::default_random_engine e;
for (size_t i = 0; i < 10; i++) {
cout << e() << endl;
}
默认情况下,引擎产生的随机数范围在default_randm_engine::min和default_random_engine::max之间。
例子2&#