C++ 11中的随机排列函数shuffle
2014-01-07 14:44
253 查看
在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:
函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能
参数:
first, last
顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
g
唯一随机数生成器的一个实例,在头文件<random>中定义。URNG 是 uniform random number generator的缩写。
返回值:
None
用例:
编译:
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
template <class RandomAccessIterator, class URNG> void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能
template <class RandomAccessIterator, class URNG> void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g) { for (auto i = (last-first) - 1; i > 0; --i) { std::uniform_int_distribution<decltype(i)> d (0,i); swap (first[i], first[d (g)]); } }
函数必须与标准库默认的随机生成器一起使用,随机生成器的头文件是<random>。如果要使用不需要传入随机生成器函数可以参照random_shuffle函数。
参数:
first, last
顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
g
唯一随机数生成器的一个实例,在头文件<random>中定义。URNG 是 uniform random number generator的缩写。
返回值:
None
用例:
#include <iostream> #include <vector> #include <algorithm> // std::move_backward #include <random> // std::default_random_engine #include <chrono> // std::chrono::system_clock int main (int argc, char* argv[]) { std::vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back (i); } // obtain a time-based seed: unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count (); std::shuffle (v.begin (), v.end (), std::default_random_engine (seed)); for (auto& it : v) { std::cout << it << " "; } std::cout << "\n"; return 0; }
编译:
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
相关文章推荐
- win7下用VS2010和Intel C++ 11编译Boost
- C++ 基础 类和对象 2017_11_13下午(续)
- C++ 11和C++98相比有哪些新特性
- 学习C++ 11
- C++ 11 在 Qt 5 中的应用
- C++ 11中使用lambda表达式实现回调
- C++ 11 学习3:显示虚函数重载(override)
- C++ 11之lambda表达式
- C++实现11平台魔兽全图外挂
- c++ 11 多线线程系列-----thread
- C++入门(11):高级OOP技术:虚方法和抽象方法
- 复杂的数据类型5 - C++快速入门11
- C++ 11
- leetcode之11. Container With Most Water(C++解法)
- c++之STL(11) 算法- 元素计数
- c++ 11 新特性
- c++ 11 override final
- 使用 C++ 11 编写 Linux 多线程程序
- c++ 11 新特性
- 【cocos2d-x从c++到js】11:JS与C++的交互3——C++和JS类型转换