先决条件: 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更好,因为可以使用生成器函数。