NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
shuffle.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_SHUFFLE_HPP__
2#define NEFORCE_CORE_ALGORITHM_SHUFFLE_HPP__
3
10
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
40template <typename Iterator>
41void shuffle(Iterator first, Iterator last) {
42 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterators must be random_access_iterator");
43
44 if (first == last) {
45 return;
46 }
47 random_lcd rand;
48 for (Iterator i = _NEFORCE next(first); i != last; ++i) {
49 auto distance = _NEFORCE distance(first, i);
50 Iterator j = _NEFORCE next(first, rand.next_int(0, static_cast<int>(distance)));
51 _NEFORCE iter_swap(i, j);
52 }
53}
54
73template <typename Iterator, typename Generator>
74void shuffle(Iterator first, Iterator last, Generator& rand) {
75 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterators must be random_access_iterator");
76
77 if (first == last) {
78 return;
79 }
80 for (Iterator i = _NEFORCE next(first); i != last; ++i) {
81 Iterator j = _NEFORCE next(first, rand(i - first + 1));
82 _NEFORCE iter_swap(i, j);
83 }
84}
85 // ShuffleAlgorithms
87 // StandardAlgorithms
89
90NEFORCE_END_NAMESPACE__
91#endif // NEFORCE_CORE_ALGORITHM_SHUFFLE_HPP__
线性同余随机数生成器
T next_int(T max) noexcept
生成 [0, max) 范围内的随机整数
constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
void shuffle(Iterator first, Iterator last)
随机重排序列
随机数生成器
移位和修改算法