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

生成器generator:能够产生离散的等可能分布数值
分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson

2.分布器利用运算符()产生随机数,要传入一个generator对象作为参数

 std::default_random_engine generator;
std::uniform_int_distribution<int> dis(,);
for(int i=;i<;i++)
{
std::cout<<dis(generator)<<std::endl;
}

如果嫌每次调用都要传入generator对象麻烦,可以使用std::bind,要包含头文件functional

auto dice = std::bind(distribution,generator)以后就可以直接调用dice()产生复合均匀分布的随机数。
但是多次运行上例会发现每次产生的随机数序列都一样,因为没有设定种子(同cstdlib库中的rand和srand关系)
 std::default_random_engine generator;
std::uniform_int_distribution<int> dis(,);
auto dice= std::bind(dis,generator);
for(int i=;i<;i++)
{
std::cout<<dice()<<std::endl;
}

3.种子

        除了random_device生成器(真随机数生成器或叫f非确定性随机数生成器)以外(linux中有效,windows下其实也是伪随机),所有在库中定义的随机数引擎都是伪随机数生成器,他们都利用了特定的算法实现,这些生成器都需要一个种子。种子可以是一个数值,或者是一个带有generate成员函数的对象。简单的应用中,用time作种子即可。
说明:如果不设定种子,那么产生的随机数序列每次都一样,如上代码,产生5个1到6之间的随机数,但是每次都是82 13 91 84 12
改为如下代码,可以使每次产生的随机数序列不同:
  std::default_random_engine generator(time(NULL));
std::uniform_int_distribution<int> dis(,);
auto dice= std::bind(dis,generator);
for(int i=;i<;i++)
{
std::cout<<dice()<<std::endl;
}

4.关于生成器

        C++11标准提供了三个生成器模版类可以实例化为生成器,但需要有一定的数学功底才懂得每个模版参数的意义,可参照算法出处的论文。
这三个生成器类模版为:
linear_congruential_engine 线性同余法
mersenne_twister_engine 梅森旋转法
substract_with_carry_engine滞后Fibonacci
线性同余法举例
template <class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine;
第一个参数:生成器类型unsigned int,unsigned long等
第二到第四个参数:是线性同余法公递推公式Nj+i =(AxNj+C) (mod M)里的三个常数值A,C,M
要求:如果m不为0,a,c的值要小于m
如一会介绍的常用生成器:
 typedef linear_congruential<unsigned long, , , > minstd_rand0;  
 typedef linear_congruential<unsigned long, , , > minstd_rand;  
可见如果自己实例化模版类很麻烦,需要很强的数序知识,所以有几个常用的几个模版实例化生成器,他们都是需要一个种子参数就可以:
4.1线性同余法:
minstd_rand()
minstd_rand0
利用适配器变种后的线性同余法
knuth_b     minstd_rand0 with shuffle_order_engine
4.2梅森旋转法:
default_random_engine()
mt19937
mt19937_64
4.3滞后Fibonacci法
ranlux24_base
ranlux48_base
利用适配器变种后的滞后Fibonacci法:
ranlux24              ranlux24_base with discard_block_engine
ranlux48              ranlux48_base with discard_block_engine
 
三个适配器:discard_block_engine     shuffle_order_engine   independent_bits_engine

5.关于分布器

        易知,如果只用generator配上seed只能产生离散的等可能分布,产生的数值在generator的min和max之间,并且结果都是UIntType的值。无法很好的控制产生数值的分布区间和分布概率。如果要实现这种功能就要用到分布器。
作用1:改变生成类型,利用模版参数
作用2:改变值区间,利用实例构造函数参数。或其响应的成员函数设置参数。
作用3:改变概率分布,选用不同的分布器类型
5.1均匀分布:
uniform_int_distribution           整数均匀分布
uniform_real_distribution         浮点数均匀分布
5.2伯努利类型分布:(仅有yes/no两种结果,概率一个p,一个1-p)
bernoulli_distribution     伯努利分布
binomial_distribution      二项分布
geometry_distribution     几何分布
negative_biomial_distribution   负二项分布
5.3 Rate-based distributions:
poisson_distribution  泊松分布
exponential_distribution 指数分布
gamma_distribution 伽马分布
 weibull_distribution 威布尔分布
extreme_value_distribution 极值分布
5.4正态分布相关:
normal_distribution         正态分布
chi_squared_distribution 卡方分布
cauchy_distribution        柯西分布
fisher_f_distribution       费歇尔F分布
student_t_distribution  t分布
5.5分段分布相关:
discrete_distribution 离散分布
piecewise_constant_distribution 分段常数分布
piecewise_linear_distribution 分段线性分布

C++中随机数的生成的更多相关文章

  1. C语言中随机数的生成

    刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到. 在C语言中,可以通过rand函数得到一个“伪随机数”.这个数是一个整数,其值大于等于0且小于等于RAND_MAX.ran ...

  2. Python中随机数的生成

    在Python中要实现随机数的生成,需要使用random模块中randint方法. 其具体实现方法如下: import random a = random.randint(1,20) #(1,20)为 ...

  3. js中Math.random()生成指定范围数值的随机数

    http://www.111cn.net/wy/js-ajax/57062.htm Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法 ...

  4. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  5. objective-c 中随机数的用法 3种:arc4random() 、random()、CCRANDOM_0_1()

    oc 中随机数的用法(arc4random() .random().CCRANDOM_0_1() 1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() ...

  6. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

  7. Linux真随机数的生成

    今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...

  8. 将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成

    将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成. 代码比较乱,但是方法还是对的,大家又需要的选择看,希望对博友 有帮助,欢迎留言分享! public class s ...

  9. 总结 Swift 中随机数的使用

    在我们开发的过程中,时不时地需要产生一些随机数.这里我们总结一下Swift中常用的一些随机数生成函数.这里我们将在Playground中来做些示例演示. 整型随机数 如果我们想要一个整型的随机数,则可 ...

随机推荐

  1. poj 1041(欧拉回路+输出字典序最小路径)

    题目链接:http://poj.org/problem?id=1041 思路:懒得写了,直接copy吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...

  2. spoj 10628

    http://www.spoj.com/problems/COT/ 树上第k小元素 LCA + 可持久化线段树 每个新的版本都是由其父亲版本转化而来. #include <cstdio> ...

  3. 关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了

    关东升的<iOS实战:图形图像.动画和多媒体卷(Swift版)>上市了 承蒙广大读者的厚爱我的<iOS实战:图形图像.动画和多媒体卷(Swift版)>京东上市了,欢迎广大读者提 ...

  4. EasyNVR摄像机网页无插件直播使用过程中问题的自我排查-设备不在线问题的自我排查

    系列背景 由于EasyNVR的受众越来越多,时长会遇到很对类似的问题咨询,之前虽然有写过很多的博文进行技术的或者使用问题的解答,随着客户询问的增多,我发现,要想然客户了解问题和解决问题,往往引导和给一 ...

  5. IDEA错误的将所有代码文件都加入版本控制

    1.问题: IDEA将从Git上拉取的所有代码文件都加入版本控制里,而这些文件和远程服务器没有任何区别: 2.原因: 后来发现,虽然项目使用的是Git的版本控制,但是异常模块都是使用SVN的版本控制: ...

  6. SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)

    (五)列表条目(SPListItem) SharePoint中数据的存储基本上都是通过列表条目来完成(文档库中的文档也是一种特殊的列表条目),因此在SharePoint应用开发中,最终是要和列表条目打 ...

  7. grafana-----Time Range Controls

    Grafana提供了许多方法来管理时间的可视化数据的范围,在Dashboard-level和Panel-level都有. 在右上角,您有主仪表板时间选择器(它位于“Zoom out”和“Refresh ...

  8. mysql_用户_操作

    一. 创建用户 登录MySQL mysql -u root -p 添加新用户 create user 'username'@'host' identified by 'password'; usern ...

  9. 约束、自定义异常、hashlib模块、logging日志模块

    一.约束(重要***) 1.首先我们来说一下java和c#中的一些知识,学过java的人应该知道,java中除了有类和对象之外,还有接口类型,java规定,接口中不允许在方法内部写代码,只能约束继承它 ...

  10. [Erlang危机](5.1.3)进程

    原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:cto@188.com Processes Trying to ge ...