std::random_shuffle, std::shuffle
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <algorithm> 中定义
|
||
template< class RandomIt > void random_shuffle( RandomIt first, RandomIt last ); |
(1) | |
template< class RandomIt, class RandomFunc > void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r ); |
(2) | (至 C++11) (C++11 起) |
template< class RandomIt, class URNG > void shuffle( RandomIt first, RandomIt last, URNG&& g ); |
(3) | (C++11 起) |
在给定的范围内进行重新排序元素
[first, last)
等,这些元素的每一个可能的排列具有相等概率的外观.原文:
Reorders the elements in the given range
[first, last)
such that each possible permutation of those elements has equal probability of appearance.1)
随机数生成器是实现定义的,但经常使用的功能std::rand.
原文:
The random number generator is implementation-defined, but the function std::rand is often used.
2)
随机数生成器的功能是对象
r
. 原文:
The random number generator is the function object
r
. 3)
随机数生成器的功能是对象
g
.原文:
The random number generator is the function object
g
.目录 |
[编辑] 参数
first, last | - | 范围内随机洗牌的元素
原文: the range of elements to shuffle randomly |
r | - | 函数对象作为
iterator_traits<RandomIt>::difference_type 如果调用返回一个随机选择的类型的值转换为r(n) 在区间[0,N) 原文: function object returning a randomly chosen value of type convertible to iterator_traits<RandomIt>::difference_type in the interval [0,n) if invoked as r(n) |
g | - | 函数对象返回一个随机选择的值的类型
URNG::result_type 在区间[g.min(),栽培大豆()]如果调用为g() (例如任何从<random> 的均匀分布的随机数发生器) 原文: function object returning a randomly chosen value of type URNG::result_type in the interval [g.min(), g.max()] if invoked as g() (e.g. any of the uniform random number generators from <random> ) |
类型要求 | ||
-RandomIt 必须满足 ValueSwappable 和 RandomAccessIterator 的要求。
| ||
-URNG 必须满足 UniformRandomNumberGenerator 的要求。
|
[编辑] 返回值
(无)
[编辑] 复杂度
线性
first
和last
之间的距离原文:
linear in the distance between
first
and last
[编辑] 可能的实现
版本一 |
---|
template<class RandomIt, class RandomFunc> void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r) { typename std::iterator_traits<RandomIt>::difference_type i, n; n = last - first; for (i = n-1; i > 0; --i) { using std::swap; swap(first[i], first[r(i+1)]); } } |
版本二 |
template<class RandomIt, class UniformRandomNumberGenerator> void shuffle(RandomIt first, RandomIt last, UniformRandomNumberGenerator&& g) { typedef typename std::iterator_traits<RandomIt>::difference_type diff_t; typedef typename std::make_unsigned<diff_t>::type udiff_t; typedef typename std::uniform_int_distribution<udiff_t> distr_t; typedef typename distr_t::param_type param_t; distr_t D; diff_t n = last - first; for (diff_t i = n-1; i > 0; --i) { using std::swap; swap(first[i], first[D(g, param_t(0, i))]); } } |
[编辑] 示例
下面的代码随机打乱整数1 .. 10
原文:
The following code randomly shuffles the integers 1..10:
#include <random> #include <algorithm> #include <iterator> #include <iostream> int main() { std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::random_device rd; std::mt19937 g(rd()); std::shuffle(v.begin(), v.end(), g); copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << "\n"; }
可能的输出
8 6 10 4 2 3 7 1 9 5
[编辑] 另请参阅
按字典顺序产生区间内元素下一个较大的排列组合 (函数模板) | |
按字典顺序产生区间内元素下一个较小的排列组合 (函数模板) |