假设你需要指定范围内的随机数,传统的方法是使用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()的使用相关推荐

  1. VC开发多语言界面支持的简单方法

    VC开发多语言界面支持的简单方法 作者:成晓旭 (需要完整源代码请留言) 最近在做一个小程序,要求实现对多语言界面显示支持功能,并且,界面显示内容用户能够自己设置. 初步设计用INI文件来配置显示内容 ...

  2. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

  3. 在Linux下开发多语言软件(gettext解决方案)

    最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言 ...

  4. 系列:iOS开发-C语言基础

    #系列:iOS开发-C语言基础 之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90% ...

  5. python是基于什么语言开发-python是哪个国家的人开发的语言

    python是Google的吉多·范罗苏姆设计的,Python是一种跨平台的计算机程序设计语言.作为一种面向对象的动态类型语言,它最初设计用于编写自动化脚本. 是Google的吉多·范罗苏姆设计的. ...

  6. 【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

    Android TV 开发系列文章目录 [Android TV 开发]安卓电视调试 ( 开启网络远程调试 ) [Android TV 开发]焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设 ...

  7. ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)

    iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...

  8. 李洪强漫谈iOS开发[C语言-038]-if else if语句

    李洪强漫谈iOS开发[C语言-038]-if else if语句

  9. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...

最新文章

  1. CentOS5.6下安装Oracle10G软件 【保留报错经验】
  2. wordpress 内网安装插件_Wordpress安装后必做的优化操作
  3. SSO 认证机制对比
  4. 第一周作业--软件过程与项目管理
  5. 自动化测试|录制回放效果差异检测
  6. python把c语言的.h文件转为c++的.cpp和.h文件
  7. 大剑无锋之你了解HTTPS吗?那么它为什么安全?【面试推荐】
  8. Mozilla考虑支持H.264
  9. map std 浮点数索引_C std :: map持有任何类型的值
  10. 解决IDEA Maven项目无法下载依赖
  11. js计算字典的个数_JS数据结构与算法_集合字典
  12. 爱的十个秘密--3.尊重的力量
  13. this 自引用指针
  14. 苹果Mac矢量图形设计工具:Affinity Designer Beta
  15. 【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
  16. 华为的服务器虚拟化软件,华为FusionSphere虚拟化软件各版本之间的功能和区别
  17. 优秀信息系统项目经理应该具备的技能和素质
  18. 三维匹配_为什么你的倾斜摄影三维建模模型效果差,都进来看看
  19. Halcon 汉字识别
  20. 【优化算法】多目标灰狼优化算法(MOGWO)【含Matlab源码 099期】

热门文章

  1. 迁移学习 nlp_NLP的发展-第3部分-使用ULMFit进行迁移学习
  2. 央行允许银行倒闭破产,那么储户的存款怎么办?
  3. 根据状态转移写状态机-三段式
  4. core webapi缩略图_netcore 图片缩略图
  5. 如何将另外一个表里的数据与联动_跨境电商(亚马逊)后台财务数据包
  6. Python 中的绘图matplotlib mayavi库
  7. 6 areas of artificial intelligence to watch closely 需要密切关注的六大人工智能/机器学习领域
  8. MATLAB – TreeBagger example
  9. iOS中如何优化Cell中图片的下载性能
  10. flutte的第一个hello world程序