【VS开发】【C++语言】reshuffle的容器实现算法random_shuffle()的使用
假设你需要指定范围内的随机数,传统的方法是使用ANSI C的函数random(),然后格式化结果以便结果是落在指定的范围内。但是,使用这个方法至少有两个缺点。首先,做格式化时,结果常常是扭曲的,所以得不到正确的随机数(如某些数的出现频率要高于其它数) 。其次,random()只支持整型数;不能用它来产生随机字符,浮点数,字符串或数据库中的记录。
对于以上的两个问题,C++中提供了更好的解决方法,那就是random_shuffle()算法。不要着急,下面我就会告诉你如何用这种算法来产生不同类型的随机数。
产生指定范围内的随机元素集的最佳方法是创建一个顺序序列(也就是向量或者内置数组),在这个顺序序列中含有指定范围的所有值。例如,如何你需要产生100个0-99之间的数,那么就创建一个向量并用100个按升序排列的数填充向量:
#include <vector> using std::vector; int main() {vector<int> vi;for (int i = 0; i < 10; i++)vi.push_back(i); /*现在向量包含了 100 个 0-99 之间的整数并且按升序排列*/ }
填充完向量之后,用random_shuffle()算法打乱元素排列顺序。random_shuffle()定义在标准的头文件<algorithm.h>中。因为
所有的STL算法都是在名字空间std::中声明的,所以你要注意正确地声明数据类型。random_shuffle()有两个参数,第一个参数是指向序列首元素的迭代器,第二个参数则指向序列最后一个元素的下一个位置。下列代码段用random_shuffle()算法打乱了先前填充到向量中的元素:
#include <algorithm> using std::random_shuffle; random_shuffle(vi.begin(), vi.end()); /* 打乱元素 */
如果你想检查被打乱的元素,可以用如下方法看一下他们被打乱后存储的次序:
for (int i = 0; i < 100; i++)cout<<vi[i]; /* 显示被打乱顺序的元素 */
random_shuffle()是个完全通用的算法-适用于内建的数据类型和用户自定义类型。下面的例子创建了一个有7个字符串对象的向量,它包含一周的天数并使用random_shuffle()打乱他们的排列顺序:
#include <string> #include <vector> #include <algorithm> #include <iostream> using namespace std; int main() {vector<string> vs;vs.push_back(string ("Sunday"));vs.push_back (string ("Monday"));...vs.push_back (string ("Saturday"));random_shuffle(vs.begin(), vs.end()); /* 打乱顺序 */for (int i = 0; i << 7; i++)cout<<vs[i]; /* 显示打乱顺序后的元素 */ }
如何使用random_shuffle()处理内置数组
在使用容器代替内置数组时,你不要有什么负担。所有STL算法不仅适用于容器,也适用于序列。因此,你也能将random_shuffle()算法应用于内置数组。只是要注意random_shuffle()的第二个参数要指向数组上界的下一个元素位置:
char carr[4] = {''a'', ''b'', ''c'', ''d''}; /*carr+4 指向数组上界的下一个元素位置*/ random_shuffle(carr, carr+4); for (int i = 0; i < 4; i++)cout<<carr[i]; /* 显示被打乱顺序的元素 */
转载于:https://www.cnblogs.com/huty/p/8518018.html
【VS开发】【C++语言】reshuffle的容器实现算法random_shuffle()的使用相关推荐
- VC开发多语言界面支持的简单方法
VC开发多语言界面支持的简单方法 作者:成晓旭 (需要完整源代码请留言) 最近在做一个小程序,要求实现对多语言界面显示支持功能,并且,界面显示内容用户能够自己设置. 初步设计用INI文件来配置显示内容 ...
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...
本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...
- 在Linux下开发多语言软件(gettext解决方案)
最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言 ...
- 系列:iOS开发-C语言基础
#系列:iOS开发-C语言基础 之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90% ...
- python是基于什么语言开发-python是哪个国家的人开发的语言
python是Google的吉多·范罗苏姆设计的,Python是一种跨平台的计算机程序设计语言.作为一种面向对象的动态类型语言,它最初设计用于编写自动化脚本. 是Google的吉多·范罗苏姆设计的. ...
- 【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )
Android TV 开发系列文章目录 [Android TV 开发]安卓电视调试 ( 开启网络远程调试 ) [Android TV 开发]焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设 ...
- ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)
iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...
- 李洪强漫谈iOS开发[C语言-038]-if else if语句
李洪强漫谈iOS开发[C语言-038]-if else if语句
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...
本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...
最新文章
- CentOS5.6下安装Oracle10G软件 【保留报错经验】
- wordpress 内网安装插件_Wordpress安装后必做的优化操作
- SSO 认证机制对比
- 第一周作业--软件过程与项目管理
- 自动化测试|录制回放效果差异检测
- python把c语言的.h文件转为c++的.cpp和.h文件
- 大剑无锋之你了解HTTPS吗?那么它为什么安全?【面试推荐】
- Mozilla考虑支持H.264
- map std 浮点数索引_C std :: map持有任何类型的值
- 解决IDEA Maven项目无法下载依赖
- js计算字典的个数_JS数据结构与算法_集合字典
- 爱的十个秘密--3.尊重的力量
- this 自引用指针
- 苹果Mac矢量图形设计工具:Affinity Designer Beta
- 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
- 华为的服务器虚拟化软件,华为FusionSphere虚拟化软件各版本之间的功能和区别
- 优秀信息系统项目经理应该具备的技能和素质
- 三维匹配_为什么你的倾斜摄影三维建模模型效果差,都进来看看
- Halcon 汉字识别
- 【优化算法】多目标灰狼优化算法(MOGWO)【含Matlab源码 099期】
热门文章
- 迁移学习 nlp_NLP的发展-第3部分-使用ULMFit进行迁移学习
- 央行允许银行倒闭破产,那么储户的存款怎么办?
- 根据状态转移写状态机-三段式
- core webapi缩略图_netcore 图片缩略图
- 如何将另外一个表里的数据与联动_跨境电商(亚马逊)后台财务数据包
- Python 中的绘图matplotlib mayavi库
- 6 areas of artificial intelligence to watch closely 需要密切关注的六大人工智能/机器学习领域
- MATLAB – TreeBagger example
- iOS中如何优化Cell中图片的下载性能
- flutte的第一个hello world程序