随机值获取—random
如何利用 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相关推荐
- 从JavaScript数组获取随机值
考虑: var myArray = ['January', 'February', 'March']; 如何使用JavaScript从此数组中选择随机值? #1楼 假设您要选择与上次不同的随机项目(不 ...
- 集成学习-Bagging集成学习算法随机森林(Random Forest)
随机森林算法属性 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的.在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决 ...
- 【机器学习】 随机森林(Random Forest)
1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...
- [Machine Learning Algorithm] 随机森林(Random Forest)
1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...
- 使用随机森林(Random Forest)进行特征筛选并可视化
使用随机森林(Random Forest)进行特征筛选并可视化 随机森林可以理解为Cart树森林,它是由多个Cart树分类器构成的集成学习模式.其中每个Cart树可以理解为一个议员,它从样本集里面随机 ...
- 【深度学习】PyTorch 数据集随机值的完美实践
作者 | Elvanth@知乎 来源 | https://zhuanlan.zhihu.com/p/377155682 编辑 | 极市平台 本文仅作学术交流,版权归原作者所有,如有侵权请联系删除. 导 ...
- 机器学习5—分类算法之随机森林(Random Forest)
随机森林(Random Forest) 前言 一.随机森林 1.什么是随机森林 2.随机森林的特点 3.随机森林的生成 二.随机森林的函数模型 三.随机森林算法实现 1.数据的读取 2.数据的清洗和填 ...
- 随机森林实例:利用基于CART算法的随机森林(Random Forest)树分类方法对于红酒质量进行预测
随机森林实例:利用基于CART算法的随机森林(Random Forest)树分类方法对于红酒质量进行预测 1.引言 2.理论基础 2.1 什么是决策树 2.2 特征选择的算法 2.2.1 ID3:基于 ...
- 随机森林(Random Forest)算法原理
随机森林(Random Forest)算法原理 集成学习(Ensemble)思想.自助法(bootstrap)与bagging **集成学习(ensemble)**思想是为了解决单个模型或者某一组参数 ...
最新文章
- 徐科:做IC不外乎PPA,但需要成百上千的专家合作 投入数千万
- jQuery省市区三级联动插件
- Leetcode 50
- IBM MQ 使用一例
- OpenGL波浪模拟
- 游戏设计模式——面向数据编程思想
- 为什么要重写toString()方法和hashcode()方法
- python 完全背包问题_动态规划——背包问题python实现(01背包、完全背包、多重背包)...
- Linux 网络编程——UDP编程
- 时隔一年,微信发布WeUI2.0.0,各种buff加身
- 全套AI平面设计软件教程案例素材免费分享
- c语言矩阵键盘反转法扫描,行列扫描法,反转法,状态机法三种矩阵键盘扫描方法详解 带程序...
- 组合数学在软件领域的运用
- 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发
- MySQL中的极限值
- 零时科技:DeFi 项目 Lendf.Me 遭黑客攻击复盘分析
- 关于excel导入带图片
- 计算机 修改 虚拟ip,怎么样在电脑中设置虚拟IP地址?
- JavaWeb开发前景
- JQuery播放暂停HTML视频
热门文章
- 多线程(6)线程同步
- c语言学习之基础知识点介绍(十):数组
- android textView 替文字添加下划线 删除线
- 解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- Struts 学习笔记2(输入校验、国际化、异常处理)
- 13/100. Best Time to Buy and Sell Stock
- jq修改导航栏样式(选中、使用两张图片替代的是否选中效果)
- 设计模式(九)--注册树模式
- asyncio协程与并发
- Spring Boot (1) 构建第一个Spring Boot工程