在各种程序语言中都提供了将容器元素随机排序的shuffle方法,c++也不例外。

不过c++将shuffle放在了<algorithm>中而不是像其他语言一样在random里,同时c++17删除了原先的random_shuffle新的程序应该使用c++11添加进去的std::shuffle。其中一个好处是新的函数在可以自定义随机数生成方法的同时保证了更好的安全性。

先来看下新函数的原型:

template< class RandomIt, class URBG >
void shuffle( RandomIt first, RandomIt last, URBG&& g );

其中firstlast指定需要随机排序的范围,g是一个“UniformRandomBitGenerator”,就是一个可以产生规定范围内的随机数的可调用对象。

所以g可以是std::random_device或者像std::default_random_engine这样的随机数引擎,也可以是std::mt19937这样的标准库提供的随机数生成器的对象,它们都在<random>中。

shuffle调用后目标容器内的元素排列顺序会被随机打乱,我们看个例子。

首先是两个帮助函数,避免做一些重复劳动:

// 帮助函数,打印vector的内容
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &v)
{
os << "{ ";
for (const auto &i: v) {
os << i << ", ";
}
os << "}"; return os;
} // 帮助函数,生成一个符合UniformRandomBitGenerator要求的随机数生成器;
// std::random_device虽然符合要求但是只适合于生成seed及安全要求较高的场合,因为速度可能很慢。
// 所以我们选择std::mt19937算法,你可以自己选择其他合适的算法
auto get_URBG()
{
std::random_device rd;
// 使用random_device生成seed
std::mt19937 g(rd()); return g;
}

然后我们分别打乱一个std::vector<int>std::vector<std::string>容器内元素的排列顺序:

// 随机排序容器内元素,打印随机排序前和随机排序后的容器内容
template <typename T>
void shuffle_container(std::vector<T> &container)
{
std::cout << "before shuffle: " << container << std::endl;
std::shuffle(container.begin(), container.end(), get_URBG());
std::cout << "after shuffle: " << container << std::endl;
} int main()
{
std::vector<int> ivec{1,2,3,4,5};
shuffle_container(ivec); // 分割线
std::cout << std::string(40, '-') << std::endl; std::vector<std::string> svec{"a", "b", "c", "d", "e", "f", "g"};
shuffle_container(svec);
}

我们编译写好的程序,然后运行:

可以看到元素都已经被随机排序了。

c++随机排序容器中的元素的更多相关文章

  1. ShuffleElements(随机打乱数组中的元素)

    给定一个数组,随机打乱数组中的元素,题意很简单直接上代码: package Array; import java.util.Arrays; import java.util.Collections; ...

  2. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  3. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  4. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  5. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  6. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

  7. 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  8. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  9. 删除STL容器中的元素

    有关stl容器删除元素的问题,错误的代码如下: std::vector<struct> mFriendList; ... std::vector<struct>::iterat ...

随机推荐

  1. DNS Server Centos 7

    1.安裝服務 #yum update –y #yum install bind –y #systemctl  start named             開啟服務named #systemctl ...

  2. MYSQL—— 基础入门,select 查询涉及到的关键字组合详解(进阶篇)

    SELECT查询组合使用的关键字很多,首先将最简单常用的关键字进行区分及使用,后续再继续补充............ 以下所有的关键字组合使用,主要以两个表students与students_scor ...

  3. JavaWeb学习总结(转载)

    JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件      JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件     JavaWeb学习总结(五十 ...

  4. Vue 进阶之路(六)

    上篇文章我们分析了一下 vue 中的条件渲染,本篇我们说一下 vue 中的列表渲染和 set 方法. <!DOCTYPE html> <html lang="en" ...

  5. 《前端之路》之 JavaScript 高级技巧、高阶函数(一)

    目录 一.高级函数 1-1 安全的类型检测 1-2 作用域安全的构造函数 1-3 惰性载入函数 1-4 函数绑定 1-5 函数柯里化 1-6 反函数柯里化 一.高级函数 1-1 安全的类型检测 想到类 ...

  6. WebApi管理和性能测试工具WebApiBenchmarks

    说到WebApi管理和测试工具其实已经非常多的了,Postman.Swagger等在管理和维护上都非常出色:在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等. ...

  7. WebWorker 简单使用方式

    WebWorker 一定程度上可以算得上是浏览器中的多线程技术了,在项目中适当使用 Worker 来做一些耗时的操作能大大提高页面整体流畅度. Worker的使用也是非常简单的,通过向 Worker ...

  8. Spring+SpringMVC+MyBatis的pom.xml依赖

    <!-- 集中定义依赖版本号 --> <!-- 已经依据maven仓库给出的版本兼容信息,调节好合适的spring.mybatis-spring.mybatis.pagehelper ...

  9. EIGRP 基础实验

    一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握EIGRP 的基本配置 2.掌握EIGRP 的通配符掩配置方法 3.掌握EIGRP 的自动汇总特性,理解E ...

  10. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)

    CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...