C++11带来诸多特性,random就是其一.

随机数由生成器和分布器结合产生

  生成器generator:能够产生离散的等可能分布数值(需要种子,不然每次生存的随机数都一样)
  分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson
  种子:相当于外部传给随机数生成器的诱因,如果每次传入的种子一样,则每次生成的随机数还是一样
 
1.default_random_engine 
//std::default_random_engine engine();  //没有设置种子,每次生存的随机数都一样
std::default_random_engine engine(time(nullptr));  //设置了种子,每次种子都不一样
std::uniform_int_distribution<> dis(, );
for (int n = ; n < ; n++)
std::cout << dis(engine) << " " << std::endl;
注:default_random_engine 结合uniform_int_distribution生成的随机数是闭环[begin, end]
如果嫌每次调用都要传入generator对象麻烦,可以使用std::bind,要包含头文件functional,以后就可以直接调用dice()产生复合均匀分布的随机数。
//std::default_random_engine engine();  //没有设置种子,每次生存的随机数都一样
std::default_random_engine engine(time(nullptr));
std::uniform_int_distribution<> dis(, );
auto dice = std::bind(dis,generator);
for (int n = ; n < ; n++)
std::cout << dice() << " " << std::endl;

2. random_device

  标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下.

  random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.

#include <iostream>
#include <random>
int main()
{
  std::random_device rd;
  for(int n=; n<; ++n)
    std::cout << rd() << std::endl;
  return ;
} //结合:default_random_engine使用生成指定范围内的真随机数
int main()
{
std::random_device rd;
std::default_random_engine engine(rd());
std::uniform_int_distribution<> dis(, );
auto dice = std::bind(dis, engine);
for (int n = ; n < ; n++)
std::cout << dice() << " " << std::endl;
}

2. random number engine

  标准把随机数抽象成随机数引擎和分布两部分.引擎用来产生随机数,分布产生特定分布的随机数(比如平均分布,正太分布等).

  标准提供三种常用的引擎:linear_congruential_engine,mersenne_twister_engine和subtract_with_carry_engine.第一种是线性同余算法,第二种是梅森旋转算法,第三种带进位的线性同余算法.第一种是最常用的,而且速度也是非常快的; 第二种号称是最好的伪随机数生成器;第三种没用过....

  随机数引擎接受一个整形参数当作种子,不提供的话,会使用默认值. 推荐使用random_device来产生一个随机数当作种子.(windows下爱咋整咋整,谁叫windows的random_device是调用rand_s)

#include <iostream>
#include <random> int main()
{
std::random_device rd;
std::mt19937 mt(rd());
for(int n = ; n < ; n++)
std::cout << mt() << std::endl;
return ;
}

3. random number distributions

  标准提供各种各样的分布,不过我们经常用的比较少,比如平均分布,正太分布...使用也很简单

//平均分布
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(, );
for(int n=; n<; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
//正太分布
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
int main()
{
std::random_device rd;
std::mt19937 gen(rd()); // values near the mean are the most likely
// standard deviation affects the dispersion of generated values from the mean
std::normal_distribution<> d(5,2); std::map<int, int> hist;
for(int n=0; n<10000; ++n) {
++hist[std::round(d(gen))];
}
for(auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
 

最新文章

  1. Eclipse默认空间与工作空间的更改(转)
  2. About SOuP
  3. 4、IMS
  4. sharepoint app 开发环境配置
  5. ApplicationWindow
  6. html5新特性之音频、视频
  7. php命名空间详解
  8. Pascal 语言中二维数组:矩阵问题
  9. 设置不输入密码ssh登录
  10. js,jQuery实现可关闭悬浮框广告特效,兼容(谷歌,火狐,Ie)
  11. Linux_服务器_07_ 将用户设置为管理员
  12. Hibernate之多对多表,操作实例
  13. 高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)
  14. 你不可不知的Java引用类型【总结篇】
  15. locate语法
  16. Linux 下文件
  17. kali蓝牙连接
  18. 房间安排 (nyoj 168)
  19. [UE4]删除UI:Remove from Parent
  20. 关于IIS下字体跨域问题

热门文章

  1. Android自己定义控件:进度条的四种实现方式
  2. html-webpack-plugin插件 根据模板生成多页面
  3. iOS调试证书/公布证书制作
  4. JavaWeb get请求乱码处理
  5. 稀疏矩阵的加法(用十字链表实现A=A+B)
  6. Adaptive Thresholding &amp; Otsu’s Binarization
  7. html 链接外部css js文件
  8. set 容器 的全解(转)
  9. 网站博客更换主机空间搬家:Discuz! X2.5老鹰主机搬家全过程
  10. Linux命令-防火墙命令:iptables