如何利用 random 库中的组件生成符合条件的随机数。

随机数引擎类是可以独立运行的随机数发生器,它以均匀的概率生成某一类型的随机数,但无法指定随机数的范围、概率等信息。因此,它也被称为“原始随机数发生器”,由于不能指定生成随机数的范围,它通常不会被单独使用。

随机数分布类是一个需要于随机数引擎类的支持才能运行的类,但是它能根据用户的需求利用随机数引擎生成符合条件的随机数,例如某一区间、某一分布概率的随机数。

随机数引擎类都支持的操作如下:

名称 功能
Engine e 创建一个引擎。
Engine e(s) 创建一个引擎,并用 s 作为种子。
e.seed(s) 使用种子 s 充值 e 的状态。
e.min( ), e.max( ) e 能生成的最小值和最大值。
e.discard(u) 将 e 推进 u 步(u 的类型为 unsigned long long)。

随机数分布类共有的操作:

名称 功能
U u 创建一个分布类 u 。
u(e) 用随机数引擎 e 生成随机数(u 代表随机数分布类)。
u.min( ) u 能生成的最小值。
u.max( ) u 能生成的最大值。
u.reset( ) 重置 u 的状态,使随后 u 生成的值不受之前的值影响 。

随机非负数——default_random_engine


default_random_engine 是一个随机数引擎类。它定义的调用运算符返回一个随机的 unsigned 类型的值。

因此,若想生成 10 个随机非负数并输出,程序可以这么写:

#include <iostream>
#include <random> using namespace std; int main( ){ default_random_engine e; for(int i=0; i<10; ++i) cout<<e( )<<endl; return 0; } 

在我们的系统中,测试结果为:

16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709

可以看出,还是比较“随机”的。

当然,default_random_engine 也只是一个伪随机数发生器,如果在运行一次程序,得到结果将还是这几个数。

若想令每次运行程序时的生成结果不同,可以为其设置较为随机的种子,比如当前系统的时间。

特定范围的非负数——uniform_int_distribution


uniform_int_distribution 是一个随机数分布类,也是个模板类,模板参数为生成随机数的类型(不过只能是 int、unsigned、short、unsigned short、long、unsigned long、long long、unsigned long long 中的一种)。它的构造函数接受两个值,表示随机数的分布范围(闭区间)。

因此,一个生成 0 到 9 的随机数程序可以这么写:

#include <iostream>
#include <random> using namespace std; int main( ){ default_random_engine e; uniform_int_distribution<unsigned> u(0, 9); for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; } 

在我们的系统中,它的生成结果为:

0
1
7
4
5
2
0
6
6
9

随机浮点数——uniform_real_distribution


uniform_real_distribution 是一个随机数分布类,它也是模板类,参数表示随机数类型(可选类型为 float、double、long double)。构造函数也需要最大值和最小值作为参数。

下面是一个生成 10 个 0~1 之间的随机浮点数的例子:

#include <iostream>
#include <random> using namespace std; int main( ){ default_random_engine e; uniform_real_distribution<double> u(0.0, 1.0); for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; } 

在我们的系统上的结果为:

0.131538
0.45865
0.218959
0.678865 0.934693 0.519416 0.0345721 0.5297 0.00769819 0.0668422 

随机布尔值——bernoulli_distribution


bernoulli_distribution 是一个分布类,但它不是模板类。它的构造函数只有一个参数,表示该类返回 true 的概率,该参数默认为 0.5 ,即返回 true 和 false 的概率相等。

下面是一个生成 10 个随机布尔值的例子:

#include <iostream>
#include <random> using namespace std; int main( ){ default_random_engine e; bernoulli_distribution u; for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; } 

在我们的系统上的结果为:

1
1
1
0
0
0
1
0
1
1

总结


常用的随机数类如下:

  • default_random_engine:随机非负数(不建议单独使用)。
  • uniform_int_distribution:指定范围的随机非负数。
  • uniform_real_distribution:指定范围的随机实数。
  • bernoulli_distribution:指定概率的随机布尔值。

事实上,random 库的功能极其丰富,其中的随机数引擎不止有 default_random_engine 一个,分布类也远远不止上述三个。它还能进行泊松分布、正态分布、抽样分等高级的随机数功能,想详细了解这些内容请去查阅其他资料。我可能要等好久才能把这些内容补上。

C++11中的random类

random类是C++11中增加的类,该类可以用于生成随机数,具有C语言中rand生成伪随机数的功能,但其功能更强大。原生支持生成浮点数,及分布类。

随机数发生器主要由分布对象和随机数引擎对象组成。其中随机数引擎用于根据随机数种子来产生随机数,分布对象对产生的随机数根据需求进行分布。
random中定义了多种随机数引擎及分布类型,常用的引擎是默认伪随机数引擎类default_random_engine,常用的分布类有产生整型分布的uniform_int_distribution,产生浮点型的分布uniform_real_distribution

举例

该程序输出15个double类型的随机数

1234567891011121314151617181920
#include <random>#include <iostream>#include <ctime>

//该函数接受三个参数分别指定随机数范围和种子,返回doubledouble random_unint(unsigned int min, unsigned int max, unsigned int seed = 0){ static std::default_random_engine e(seed); static std::uniform_real_distribution<double> u(min, max); return u(e);}

int main(void){ for (int i = 0; i < 15; ++i) { std::cout << random_unint(0, 15, time(NULL)) << " "; } std::cout << std::endl; return 0;}

需要注意

1.一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的,否则每次调用函数都会生成相同的序列。也就是说定义成static后每次调用还是之前那个发生器,第一次调用产生一批随机数,再次调用将产生接下来的随机数,否则每次调用产生的都是最前面的那些随机数。

2.依然需要使用time来做为种子产生每个不同时刻都不同的随机序列,但由于time默认返回的是以秒计的时间,所以有可能多次使用的都是相同的种子。

伪随机数引擎

1.随机数引擎支持的操作如下:

  • Engine e; //默认构造函数,使用该引擎类型的默认种子
  • Engine e(s); //使用整型s做为种子
  • e.seed(s); //使用整型s重置引擎状态
  • e.min(); //返回此引擎所能生成的最小和最大值
  • e.max();
  • Engine::result_type //此引擎生成的类型(unsigned)
  • e.discard(u); //将引擎推进u步,u为unsigned long long类型

2.随机数引擎使用

12
std::default_random_engine e;   //生成随机的无符号数std::cout << e(); //通过()调用对象生成下一个随机数并输出

作者:zhaosiyi
链接:https://www.jianshu.com/p/05863a00af8d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/xiaofeiIDO/p/8581178.html

随机值获取—random相关推荐

  1. 从JavaScript数组获取随机值

    考虑: var myArray = ['January', 'February', 'March']; 如何使用JavaScript从此数组中选择随机值? #1楼 假设您要选择与上次不同的随机项目(不 ...

  2. 集成学习-Bagging集成学习算法随机森林(Random Forest)

    随机森林算法属性 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的.在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决 ...

  3. 【机器学习】 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  4. [Machine Learning Algorithm] 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  5. 使用随机森林(Random Forest)进行特征筛选并可视化

    使用随机森林(Random Forest)进行特征筛选并可视化 随机森林可以理解为Cart树森林,它是由多个Cart树分类器构成的集成学习模式.其中每个Cart树可以理解为一个议员,它从样本集里面随机 ...

  6. 【深度学习】PyTorch 数据集随机值的完美实践

    作者 | Elvanth@知乎 来源 | https://zhuanlan.zhihu.com/p/377155682 编辑 | 极市平台 本文仅作学术交流,版权归原作者所有,如有侵权请联系删除. 导 ...

  7. 机器学习5—分类算法之随机森林(Random Forest)

    随机森林(Random Forest) 前言 一.随机森林 1.什么是随机森林 2.随机森林的特点 3.随机森林的生成 二.随机森林的函数模型 三.随机森林算法实现 1.数据的读取 2.数据的清洗和填 ...

  8. 随机森林实例:利用基于CART算法的随机森林(Random Forest)树分类方法对于红酒质量进行预测

    随机森林实例:利用基于CART算法的随机森林(Random Forest)树分类方法对于红酒质量进行预测 1.引言 2.理论基础 2.1 什么是决策树 2.2 特征选择的算法 2.2.1 ID3:基于 ...

  9. 随机森林(Random Forest)算法原理

    随机森林(Random Forest)算法原理 集成学习(Ensemble)思想.自助法(bootstrap)与bagging **集成学习(ensemble)**思想是为了解决单个模型或者某一组参数 ...

最新文章

  1. 徐科:做IC不外乎PPA,但需要成百上千的专家合作 投入数千万
  2. jQuery省市区三级联动插件
  3. Leetcode 50
  4. IBM MQ 使用一例
  5. OpenGL波浪模拟
  6. 游戏设计模式——面向数据编程思想
  7. 为什么要重写toString()方法和hashcode()方法
  8. python 完全背包问题_动态规划——背包问题python实现(01背包、完全背包、多重背包)...
  9. Linux 网络编程——UDP编程
  10. 时隔一年,微信发布WeUI2.0.0,各种buff加身
  11. 全套AI平面设计软件教程案例素材免费分享
  12. c语言矩阵键盘反转法扫描,行列扫描法,反转法,状态机法三种矩阵键盘扫描方法详解 带程序...
  13. 组合数学在软件领域的运用
  14. 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发
  15. MySQL中的极限值
  16. 零时科技:DeFi 项目 Lendf.Me 遭黑客攻击复盘分析
  17. 关于excel导入带图片
  18. 计算机 修改 虚拟ip,怎么样在电脑中设置虚拟IP地址?
  19. JavaWeb开发前景
  20. JQuery播放暂停HTML视频

热门文章

  1. 多线程(6)线程同步
  2. c语言学习之基础知识点介绍(十):数组
  3. android textView 替文字添加下划线 删除线
  4. 解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  5. Struts 学习笔记2(输入校验、国际化、异常处理)
  6. 13/100. Best Time to Buy and Sell Stock
  7. jq修改导航栏样式(选中、使用两张图片替代的是否选中效果)
  8. 设计模式(九)--注册树模式
  9. asyncio协程与并发
  10. Spring Boot (1) 构建第一个Spring Boot工程