先决条件: Fisher-Yates算法
shuffle()是标头文件算法下的标准库函数,有助于使用生成器随机地对数组中提到的范围进行随机排序。
其内部工作与Fisher-Yates算法完全相似。
唯一增加的是,此函数需要一定的范围来随机播放整个数组。因此,用户可以将所需范围传递给shuffle()函数。另外,除了使用rand()创建用于交换的随机索引外,我们在这里使用生成器函数随机选择要与结束元素(第i个元素)交换的元素。
shuffle()的语法是,
shuffle(iterator start, iterator end, generator function)
在此,迭代器的开始和结束定义了范围。
C ++代码:
#include <bits/stdc++.h> using namespace std; int main(){ cout << "input array size\n"; int n; cin >> n; cout << "Input array elements \n"; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } //整个范围 //迭代器start = arr.begin() //迭代器end = arr.end() //生成器函数= default_random_engine shuffle(arr.begin(), arr.end(), default_random_engine(0)); cout << "After reshuffling, printing the array\n"; for (auto it : arr) cout << it << " "; cout << endl; return 0; }
输出:
input array size 6 Input array elements 12 43 52 89 5 11 After reshuffling, printing the array 52 12 5 11 43 89
random_shuffling()具有相同的目的。
shuffling()是C ++ 11中引入的,之前只有random_shuffling。默认情况下,random_shuffling()将rand()作为生成器函数,会导致未指定的随机性。这就是为什么在较新的版本中引入了改组的原因,在该版本中,生成器函数的性能优于rand()。但是,通过重载,我们可以通过用户定义的生成器函数带来与通过random_shuffling()混洗相同的性能。以下是random_shuffling()的示例。
random_shuffling的语法与完全相同shuffling()
,
1)rand()
默认情况下没有任何生成器功能
#include <bits/stdc++.h> using namespace std; int main(){ cout << "input array size\n"; int n; cin >> n; cout << "Input array elements \n"; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } //整个范围 //迭代器start = arr.begin() //迭代器end = arr.end() //默认情况下生成器function = rand() random_shuffle(arr.begin(), arr.end()); cout << "After reshuffling, printing the array\n"; for (auto it : arr) cout << it << " "; cout << endl; return 0; }
输出:
input array size 6 Input array elements 56 32 45 82 98 13 After reshuffling, printing the array 98 82 32 45 56 13
2)用户定义的生成器
#include <bits/stdc++.h> using namespace std; int myrandom(int i) { return rand() % i; } int main(){ cout << "input array size\n"; int n; cin >> n; cout << "Input array elements \n"; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } //整个范围 //迭代器start = arr.begin() //迭代器end = arr.end() //默认情况下生成器function = rand() random_shuffle(arr.begin(), arr.end(), myrandom); cout << "After reshuffling, printing the array\n"; for (auto it : arr) cout << it << " "; cout << endl; return 0; }
输出:
input array size 6 Input array elements 32 67 3 8 12 6 After reshuffling, printing the array 12 8 67 3 32 6
值得一提的是,混洗比random_shuffling更好,因为可以使用生成器函数。