std::shuffle-c++
2016-09-26 10:33
495 查看
在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:
[cpp] view plain copy
template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能
[cpp] view plain copy
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)]);
}
}
参数:
first, last
顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
g
唯一随机数生成器的一个实例,在头文件<random>中定义。URNG 是 uniform random number generator的缩写。
返回值:
用例:
[cpp] view plain copy
#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;
}
编译:
执行输出:
[cpp] view plain copy
template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能
[cpp] view plain copy
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
用例:
[cpp] view plain copy
#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
相关文章推荐
- C++ std::random_shuffle
- std空间声明的具体地方 和 标准C++有时间函数吗?
- 用C++ std::priority_queue 实现哈夫曼算法
- C/C++字符串处理(4):std::vector与std::StringBuilder
- 快乐C++答问:std::的意思?
- C++的std::string的“读时也拷贝”技术!
- How to use libcurl in C++ with std::string
- Sun Studio C++ - comilation error in stdexcept and iostream.
- C++ using namespace std 详解
- std C++ slot signal机制
- c++代码测试-std::string元素
- c++ 中int转换为std::string
- C/C++字符串处理:std::vector与std::StringBuilder
- C/C++字符串处理(5):std::deque与std::TextPool
- C++ std::string --- 你可能不知道的一些用法
- 关于C++中std::out语句
- C++中命名空间"std"名字由来的思考
- VS2005:C++ std::string, std::wstring转换方法
- 慎用C++ std::map 的[]运算符
- C++ using namespace std 详解