在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:
[cpp] view plaincopy
  1. template <class RandomAccessIterator, class URNG>
  2. void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);

函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能

[cpp] view plaincopy
  1. template <class RandomAccessIterator, class URNG>
  2. void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g)
  3. {
  4. for (auto i = (last-first) - 1; i > 0; --i) {
  5. std::uniform_int_distribution<decltype(i)> d (0,i);
  6. swap (first[i], first[d (g)]);
  7. }
  8. }
函数必须与标准库默认的随机生成器一起使用,随机生成器的头文件是<random>。如果要使用不需要传入随机生成器函数可以参照random_shuffle函数。
参数:
first, last
顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
g
唯一随机数生成器的一个实例,在头文件<random>中定义。URNG 是 uniform random number generator的缩写。
返回值:

None

用例:

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm> // std::move_backward
  4. #include <random> // std::default_random_engine
  5. #include <chrono> // std::chrono::system_clock
  6. int main (int argc, char* argv[])
  7. {
  8. std::vector<int> v;
  9. for (int i = 0; i < 10; ++i) {
  10. v.push_back (i);
  11. }
  12. // obtain a time-based seed:
  13. unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count ();
  14. std::shuffle (v.begin (), v.end (), std::default_random_engine (seed));
  15. for (auto& it : v) {
  16. std::cout << it << " ";
  17. }
  18. std::cout << "\n";
  19. return 0;
  20. }
编译:

g++ main.cpp -o shuffle -std=c++0x

执行输出:

6 4 2 3 7 8 5 1 9 0

4 7 3 6 8 0 2 9 5 1

转载于:https://www.cnblogs.com/lx-hhxxttxs/p/5908213.html

std::shuffle-c++相关推荐

  1. C++11新式洗牌std::shuffle与老式洗牌函数std::random_shuffle的区别

    文章目录 前言 洗牌算法 std::random_shuffle rand 和 srand 随机数生成器和分布器 std::shuffle randint 总结 前言 洗牌算法是项目开发中常用的一种算 ...

  2. 【c++】映射表std::map

    文章内容为网络搜集内容 std::map 映射表(Map)容器是一个按特定顺序存储以键值对组合而成的元素的关联容器 // <map> template < class Key,cla ...

  3. 如何 shuffle 一个 vector 以及 vectorvector

    Shuffle 是一种特殊的 permutation,是从所有 permutations 的随机等概率挑选其中之一. shuffle 一个容器([first, last)),也即将 [first, l ...

  4. C++拾取——使用stl标准库实现排序算法及评测

    今天看了一篇文章,讲各种语言的优势和劣势.其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义.这让它在专心研究算法的人中非常受欢迎.所以很多时候,语 ...

  5. C++/C++11中头文件algorithm的使用

    <algorithm>是C++标准程序库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板).<algorithm>定义了设计用于元素范围的函数集合.任何对 ...

  6. 【C++】C++11 STL算法(七):排列操作(Permutation operations)、数值操作(Numeric operations)

    排列操作(Permutation operations) 一.is_permutation 1.原型: template< class ForwardIt1, class ForwardIt2 ...

  7. 【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)

    目录 最小/最大操作(Minimum/maximum operations) 一.max 1.原型: 2.说明: 3.官方demo 二.max_element 1.原型: 2.说明: 3.官方demo ...

  8. 【C++】C++11 STL算法(三):分隔操作(Partitioning operations)、排序操作(Sorting operations)

    目录 分隔操作(Partitioning operations) 一.is_partitioned 1.原型: 2.说明: 3.官网demo 二.partition 1.原型: 2.说明: 3.官方d ...

  9. 【C++】C++11 STL算法(二):修改序列的操作(Modifying sequence operations)

    目录 一.copy.copy_if 1.原型: 2.说明: 3.官方demo 二.copy_n 1.原型: 2.说明: 3.官方demo 三.copy_backward 1.原型: 1.说明: 1.官 ...

最新文章

  1. pytorch 笔记:DataLoader 扩展:构造图片DataLoader
  2. python 作用with_即使__init__方法有效,Python中的With语句仍返...
  3. Android 5中不同效果的Toast
  4. java文件异步上传_[Java教程]原生javascript实现文件异步上传
  5. SAP UI5 初学者教程之十五 - 对话框和 Fragments 的使用方式试读版
  6. DjangoORM字段介绍
  7. python按位翻转_Python成为专业人士笔记-位操作符
  8. 中国武侠片的50条爆笑定律
  9. Vue之代码自动格式化
  10. 云计算具有什么平台_工业云平台具有哪些功能?
  11. 相分离相关文章阅读Liquid–liquid phase separation in cellular signaling systems
  12. pip install -r requirements.txt 超时解决方案
  13. 一般纳米材料是指尺度为_水溶性单分散纳米材料的开发意义
  14. TensorFlow 强化学习快速入门 -- Kaushik Balakrishnan 读后感
  15. 软件工程毕业设计选题java_软件工程毕业设计选题
  16. 苹果铃声制作(流水是操作记录)
  17. 使命召唤 高级战争 闪退_使命召唤:现代战争进入第5季
  18. 查看系统架构是32位还是64位--用Enki学Linux系列(15)
  19. RN8215芯片 32768Hz晶体停振案例分析
  20. 【原创纯手打】如何使用Vue写微信朋友圈中的留言回复功能(附源码)

热门文章

  1. Asp.NET 中 Ajax 的配置使用
  2. 成为软件架构师的4个过程
  3. 图像处理之基于NCC模板匹配识别
  4. DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...
  5. Spring:源码解读Spring IOC原理
  6. Iocomp控件教程之Pie Chart——饼状图控件
  7. jQuery插件开发的两种方法及$.fn.extend的详解
  8. SESSION跟COOKIE
  9. Servlet第一个示例
  10. JavaScript Object对象