std::shuffle-c++

在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:

[cpp] view plain copy

  1. template <class RandomAccessIterator, class URNG>
  2. void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);

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

[cpp] view plain copy

  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 plain copy

  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

时间: 2024-12-07 05:07:25

std::shuffle-c++的相关文章

c++ STD Gems07

reverse.rotate.permutation #include <iostream> #include <vector> #include <string> #include <iterator> #include <algorithm> #include <numeric> #include <random> template<class Container> void write_to_cout(C

C++11新特性应用--介绍几个新增的便利算法(更改容器中元素顺序的算法)

昨天罗列了C++11中新增的几个算法,包括 find_if_not.all_of.any_of.none_of四个算法,这四个算法的共同点就是Non-modifying sequence operations. 所以,今天就来八一八C++11中新增的算法,而这些算法的特点是:Modifying sequence operations. copy算法我们很熟悉,这里介绍一下C++11新增的copy_n. copy_n 原型: template <class InputIterator, class

fasttext源码剖析

fasttext源码剖析 目的:记录结合多方资料以及个人理解的剖析代码: https://heleifz.github.io/14732610572844.html http://www.cnblogs.com/peghoty/p/3857839.html 一:代码总体模块关联图: 核心模块是fasttext.cc以及model.cc模块,但是辅助模块也很重要,是代码的螺丝钉,以及实现了数据采取什么样子数据结构进行组织,这里的东西值得学习借鉴,而且你会发现存储训练数据的结构比较常用的手段,后期可

STL(14)变动型算法

Modifying sequence operations: (修改容器操作) copy Copy range of elements (function template ) copy_n Copy elements (function template ) copy_if Copy certain elements of range (function template ) copy_backward Copy range of elements backward (function tem

c++中的 Stl 算法(很乱别看)

1 #include <iostream> 2 #include <vector> 3 #include <functional> 4 #include <algorithm> 5 #include <string> 6 #include <array> 7 #include <ctime> 8 #include <cstdlib> 9 #include <random> 10 #include &

C++算法库 测试代码

// STL算法.cpp : 定义控制台应用程序的入口点. //最后修改时间:2018/02/13,测试平台 vs2017 /* STL六个部分 容器:见相关工程,学习上有两个难点:双端队列的实现细节,RBtree实现细节 分配器:allocator,学习版本是侯捷的书,sgi新版本增了继承层次.内存学习的高级主题 算法:本工程,容器无关的算法 适配器:容器/仿函数.基于容器实现的栈,单链表等 迭代器:最好是参考网站内容http://zh.cppreference.com/w/cpp/itera

c++随机排序容器中的元素

在各种程序语言中都提供了将容器元素随机排序的shuffle方法,c++也不例外. 不过c++将shuffle放在了<algorithm>中而不是像其他语言一样在random里,同时c++17删除了原先的random_shuffle新的程序应该使用c++11添加进去的std::shuffle.其中一个好处是新的函数在可以自定义随机数生成方法的同时保证了更好的安全性. 先来看下新函数的原型: template< class RandomIt, class URBG > void shu

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

POJ 3087 Shuffle&#39;m Up(模拟退火)

Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several