C++相关:部分标准库特殊设施
C++ tuple(元组)
声明如下
tuple<int,int,float> tp(1,2,6.2);
取值
cout << get<0>(tp) << endl; //输出1
cout << get<1>(tp) << endl; //输出2
cout << get<2>(tp) << endl; //输出6.2
tuple的基本操作
| 操作 | 说明 |
| make_tuple(v1,v2,v3,v4…vn) | 返回一个给定初始值初始化的tuple,类型从初始值推断 |
| t1 == t2 | 当俩个tuple具有相同数量的成员且成员对应相等时 |
| t1 != t2 | 与上一个相反 |
| get<i>(t) | 返回t的第i个数据成员 |
| tuple_size<tupletype>::value | 给定类型的tuple中成员的数量 |
C++随机数
default_random_engine e;
cout << "默认范围:" << e.min() <<"——" << e.max() << endl;
for(int i = 0;i < 10;++i)
{
cout << "生成的随机数(默认种子):" << e() << endl;
}
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
分布类型和引擎
为了得到一个指定范围内的数,我们需要将分布对象和引擎对象组合使用,这种组合又称为随机数发生器。
//生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution<unsigned> u(0,9);
default_random_engine engine; //生成无符号随机整数
for(int i = 0;i < 10;i++)
{
//将u作为随机数源
//每个调用返回指定范围内的服从均匀分布的值
//这里讲引擎本身传给u,原因是某些分布可能需要调用引擎多次才能得到一个值
//如果写成u(e())会导致编译错误
cout << u(e) << " ";
}
生成不同的随机数序列
一个给定的随机数发生器一直会生成相同的随机数序列,为了生成与之前不同的序列,可以将引擎和分布对象定义为static的
static uniform_int_distribution<unsigned> u(0,9);
static default_random_engine engine;
但这种方法仅适用于局部的随机数发生器,另一种方法是调用系统时间函数time来作为发生器种子,这也是C中rand函数常使用的方法。声明如下:
default_random_engine el(time(0));
time返回从特定时刻到当前经过了多少秒,它接受单个指针参数,指向用于写入时间的数据结构,如果为空则直接返回时间。
但是time返回以秒计的时间,因此这种方法仅适用于生成种子的间隔为秒级或者更长的应用,如果程序的自动过程反复运行的频率过高,则可能多次使用的都是相同的种子。
其他随机数分布
生成随机实数
在C中,从rand获得一个随机浮点数的常用方法是用rand()的结果除以RAND_MAX,但这种方法并不正确,原因是随机整数的精度通常低于随机浮点数,这样一些浮点数永远不会生成。
在C++中,可以使用uniform_real_distribution类来处理从随机整数到随机浮点数的映射。代码如下
default_random_engine e;
uniform_real_distribution<double> u(0,1);
for(int i = 0;i < 10;i++)
{
cout << u(e) << " ";
}
输出如下:

生成非均匀分布的随机数
标准库提供了20余种分布类型,具体可参考C++ Random 。
这里以伯努利分布为例,以下代码模拟了一个游戏中决定玩家和电脑谁先行动的情景,不停输入y可以看到随机生成两种结果的一种——电脑先走或者玩家先走。
string resp;
default_random_engine e; //e应保持状态,所以必须在循环外定义
bernoulli_distribution b; //默认对半的机会
do
{
bool first = b(e); //如果为true程序先走
cout << (first?"We go first":"You go first") << endl;
cout << "Gaming............" << endl;
cout << "Game over.Input y to restart or exit" << endl;
}while(cin >> resp && resp[i] == 'y')
如果想给玩家一点作弊的小后门,可以调整先行一方的概率
bernoulli_distribution b(.45); //减少程序先行的概率
这样分布情况就为(0.45/0.55)
参考资料
《C++ Primer 第5版》 电子工业出版社 作者:【美】 Stanley B. Lippman && Josee Lajoie && Barbara E.Moo
C++相关:部分标准库特殊设施的更多相关文章
- 【c++ Prime 学习笔记】第17章 标准库特殊设施
17.1 tuple类型 tuple是类似pair的模板: pair和tuple的成员类型都可以不相同 pair恰好有两个成员,tuple可有任意数量的成员 按照不同参数数量和类型实例化出的tuple ...
- C++ Primer 5th 第17章 标准库特殊设施
C++新标准库提供了很多新功能,它们更加强大和易用. tuple类型 tuple是一种类似pair的模板,pair可以用来保存一对逻辑上有关联的元素对.但与pair不同的是,pair只能存储两个成员, ...
- python——模块、标准库、第三方模块安装
模块(module)简介 模块化--指将一个完整的程序分解为一个一个小的模块,通过将模块组合,来搭建出一个完整的程序. 模块化的特点: ① 方便开发 ② 方便维护 ③ 模块可以复用! 在Python中 ...
- Go 字符串相关-标准库
标准库中有四个包对字符串处理尤为重要: bytes strings strconv unicode strings包提供了许多如字符串的查询.替换.比较.截断.拆分和合并等功能. bytes包也提供了 ...
- 走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数
我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) ...
- C++著名类库和C++标准库介绍
C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
- C++ 标准库概览(一分钟就看完了)
C++ 标准库以若干头文件的方式提供. 下面简单介绍一个各头文件的内容. 第一部分 容器 Containers <array> C++11 新增.提供了容器类模板 std::array,固 ...
- PHP SPL(PHP 标准库)
一.什么是SPL? SPL是用于解决典型问题(standard problems)的一组接口与类的集合.(出自:http://php.net/manual/zh/intro.spl.php) SPL, ...
随机推荐
- 一个 redis 异常访问引发 oom 的案例分析
「推断的前提是以事实为依据.」 这两天碰到一个线上系统的偶尔出现突然堆内存暴涨,这倒不是个什么疑难杂症, 只是过程中有些思路觉得可以借鉴参考,故总结下并写下来. 现象 内存情况可以看看下面这张监控图. ...
- Java集合之Hashtable
和HashMap一样,Hashtable也是一个散列表,存储的内容也是键值对key-value映射.它继承了Dictionary,并实现了Map.Cloneable.io.Serializable接口 ...
- 一个操作cvs格式的c++类
经常需要使用excel,或者把有的数据用excel打开,程序可以生成cvs格式的文件,这样就可以excel打开并处理了,于是找了一个处理cvs的c++类跟大家分享 代码出处找不到了: 代码如下: St ...
- 如何写好一个UITableView(完整版)
本文是直播分享的简单文字整理,直播共分为上.下两部分.第一部分:优酷 Or YouTube,第二部分:优酷 Demo 地址:KtTableView 如果你觉得UITableViewDelegate和U ...
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- 安卓TV开发(前言)— AndroidTV模拟器初识与搭建
原文:http://blog.csdn.net/sk719887916/article/details/39612577skay 前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居 ...
- cocos2d-x 控制台输出日志
在2dx中用CCLog输出日志,但是在vs的控制台中由于信息很多,很难发现.可以用下面方法,会重新启动一个黑色的控制台来输出日志 修改main.c文件,如下: #include "main. ...
- 图片验证码demo示例
1.首先我们需要一个生成图片验证码图片的一个工具类(下方会有代码示例) 代码如下: package com.util; import java.awt.BasicStroke; import java ...
- IT咨询顾问:一次吐血的项目救火
年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登录,对方技术人员一头雾水不知道什么原因 ...
- 升级Centos 7/6内核版本到4.12.4的方法
一.查看那系统内核版本 二.升级内核 三.修改grub中默认的内核版本 四.重启系统并查看系统内核 公司打算上Docker服务,目前需要安装运行环境,Docker新的功能除了需要Centos 7系统之 ...