
1. rand函数只要产生随机数而不需要设定范围的话只要用rand()就可以了rand()会返回一随机数值范围在 0 至 RAND_MAX 间。RAND_MAX定义在stdlib.h其值为2147483647。# include iostream using namespace std; int main() { for (int i0; i10; i) { cout rand() endl; } }运行结果生成10个随机数41 18467 6334 26500 19169 15724 11478 29358 26962 244642. srand函数#include time.h #include stdlib.h srand((unsigned int)time(NULL)); //在main函数里调用srand函数以实现真正随机3. random库3.1. 头文件#include random3.2. 随机数类常⽤函数介绍default_random_engine随机⾮负数不建议单独使⽤。是⼀个随机数引擎类。它定义的调⽤运算符返回⼀个随机的 unsigned 类型的值。uniform_int_distribution指定范围的随机⾮负数。是⼀个随机数分布类也是个模板类模板参数为⽣成随机数的类型不过只能是 int、unsigned、short、unsigned short、long、unsigned long、long long、unsigned long long 中的⼀种。它的构造函数接受两个值表⽰随机数的分布范围闭区间。uniform_real_distribution指定范围的随机实数。是⼀个随机数分布类它也是模板类参数表⽰随机数类型可选类型为 float、double、long double。构造函数也需要最⼤值和最⼩值作为参数。左闭右开区间bernoulli_distribution指定概率的随机布尔值。是⼀个分布类但它不是模板类。它的构造函数只有⼀个参数表⽰该类返回 true 的概率该参数默认为 0.5即返回 true 和 false 的概率相等。3.3. 示例//随机数生成引擎 //利用了真随机数 random_device default_random_engine e{random_device{}()}; mt19937_64 eng{random_device{}()}; //随机数分布引擎 uniform_real_distributiondouble dis1(0, 20); uniform_int_distributionint dis2(20, 40); bernoulli_distribution u; for(int i 0;i 4; i){ coute() ; } coutendl; //370521601 1801455354 1835679272 1511451702 for(int i 0;i 4; i){ coutdis1(eng) ; } coutendl; //6.65994 0.0263284 0.0570728 17.9504 for(int i 0;i 4; i){ coutdis2(e) ; } coutendl; //23 36 25 30 for(int i 0;i 4; i){ coutu(e) ; } coutendl; //0 0 1 04. 随机数引擎C11提供了下面三种随机数生成算法可供选择linear_congruential_engine 线性同余法mersenne_twister_engine 梅森旋转法substract_with_carry_engine 滞后Fibonacci这三种算法在C11里面都是用模板的方式实现的。C11标准预定义了一些随机数类这些随机数类都是用比较好的参数实例化上面那三个模板类得到的。注意在C11里面把这些随机数生成器叫做引擎 (engines)。下图列出了一些实例化的随机数类当然具体用了哪些参数我们是不用管的直接用就行了。4.1. default_random_engine类上图左上角的default_random_engine的类也是一个实例化的类。之所以不归入那三种算法是因为它的实现是由编译器厂家决定的有的可能用linear_congruential_engine实现有的可能用mersenne_twister_engine实现。不过对于其他的类C11是有明确规定用哪种算法和参数实现的。default_random_engine 是⼀个随机数引擎类。它定义的调⽤运算符返回⼀个随机的 unsigned 类型的值。#includeiostream #includerandom int main(){ default_random_engine e; //也可为随机数引擎加随机数发生器的参数 //default_random_engine random(time(NULL)); //default_random_engine random{random_device{}()}; for(int i 0; i 20; i) coute() ; coutendl; return 0; } //gcc编译器需要加上 –stdc11 选项。4.2. default_random_engine类上图左上角的default_random_engine的类也是一个实例化的类。之所以不归入那三种算法是因为它的实现是由编译器厂家决定的有的可能用linear_congruential_engine实现有的可能用mersenne_twister_engine实现。不过对于其他的类C11是有明确规定用哪种算法和参数实现的。default_random_engine 是⼀个随机数引擎类。它定义的调⽤运算符返回⼀个随机的 unsigned 类型的值。#includeiostream #includerandom int main(){ default_random_engine e; //也可为随机数引擎加随机数发生器的参数 //default_random_engine random(time(NULL)); //default_random_engine random{random_device{}()}; for(int i 0; i 20; i) coute() ; coutendl; return 0; } //gcc编译器需要加上 –stdc11 选项。4.3. mt19937 随机数引擎mt19937又叫梅森旋转算法用于生成随机数的他也不是梅森发明的是俩日本人发明的。它的循环节是 2 19937 − 1 2^{19937}-1 219937−1这是一个梅森素数所以叫mt19937也就是说mt是指maxint整型int最大值的缩写19937是指常用下面的语句生成一个随机数引擎mt19937 gen{random_device {}()};mt19937是c11新特性它是一种随机数算法用法与rand()函数类似但是与其它已使用的伪随机数发生器相比mt19937具有速度快周期长的特点周期可达到。rand()在windows下生成的数据范围为0-32726mt19937所生成的数据范围大概为(-maxint, maxint)maxint整型int最大值的缩写4.4. 真随机数 random_device()random_device()函数目的就是产生生成真随机数。它并不是由某一个数学算法得到的随机序列而是通过读取文件读什么文件看具体的实现Linux可以通过读取/dev/random文件来获取。文件的内容是随机的因为文件内容是计算机系统的熵熵指的是一个系统的混乱程度。也是当前系统的环境噪声系统噪音可以通过很多参数来评估如内存的使用文件的使用量不同类型的进程数量等等。Linux的熵来自键盘计时、鼠标移动等。然而randm_device()只在Linux下有效在Windows下无效。#include random//随机数 random_device rd;//随机数发生器 mt19937 g(rd());//随机数引擎 或者写为下面一句 mt19937 g{random_device{}()}; //类似于srand()和rand()的效果 srand(time(NULL)); //初始化随机数种子参考文献C如何生成随机数_fenxinzi557的博客-CSDN博客_c生成一个随机数C11 随机数_何处微尘的博客-CSDN博客_c11 随机数