std::shuffle
#include <algorithm>
template <class RandomAccessIterator, class UniformRandomBitGenerator>
void shuffle (RandomAccessIterator first, RandomAccessIterator last,
UniformRandomBitGenerator&& g);
Xáo trộn (shuffle) ngẫu nhiên các phần tử trong một phạm vi (range) được chỉ định, sử dụng một bộ sinh số ngẫu nhiên (Uniform Random Number Generator - URNG).
Tham số
first
- Random Access Iterator trỏ đến phần tử đầu tiên trong phạm vi cần xáo trộn.
last
- Random Access Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần xáo trộn. Phạm vi là
[first, last)
.
g
- Một đối tượng Uniform Random Bit Generator (URBG), cung cấp các số nguyên không dấu ngẫu nhiên được phân phối đồng đều (uniformly distributed). Ví dụ về các URBG bao gồm std::random_device, std::mt19937 (Mersenne Twister engine), std::minstd_rand (Linear congruential engine), std::minstd_rand0 (Linear congruential engine), std::ranlux24_base (RANLUX engine), std::ranlux48_base (RANLUX engine), std::knuth_b (Knuth's subtractive engine) (trong thư viện
<random>
).
Giá trị trả về
Không có giá trị trả về
Đặc điểm
- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. shuffle()
thay đổi trực tiếp thứ tự các phần tử trong phạm vi gốc, không tạo ra một phạm vi mới.shuffle()
yêu cầu Random Access Iterator, cho phép truy cập ngẫu nhiên vào các phần tử.- Bạn cần cung cấp một bộ sinh số ngẫu nhiên (URBG) cho hàm
shuffle()
. Thư viện<random>
cung cấp nhiều bộ sinh số ngẫu nhiên khác nhau. std::mt19937 thường được khuyến nghị vì nó có chất lượng ngẫu nhiên tốt và chu kỳ dài. - Nên sử dụng std::random_device để khởi tạo (seed) cho bộ sinh số ngẫu nhiên, trừ khi bạn có lý do cụ thể để làm khác.
shuffle()
thường được sử dụng để:- Xáo trộn các phần tử trong một container (ví dụ: xáo trộn một bộ bài, tạo hoán vị ngẫu nhiên).
- Tạo thứ tự ngẫu nhiên cho các phần tử trong một mảng.
- Chọn ngẫu nhiên các phần tử từ một tập hợp (bằng cách xáo trộn và sau đó chọn một số phần tử đầu tiên).
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8};
// Tạo bộ sinh số ngẫu nhiên
std::random_device rd; // Lấy seed ngẫu nhiên từ hệ thống (nếu có thể)
std::mt19937 gen(rd()); // Sử dụng Mersenne Twister engine với seed từ rd
// Xáo trộn numbers sử dụng std::shuffle() và bộ sinh số ngẫu nhiên gen
std::shuffle(numbers.begin(), numbers.end(), gen);
std::cout << "numbers after shuffle: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
random_shuffle | Xáo trộn (shuffle) ngẫu nhiên các phần tử trong một phạm vi (range) được chỉ định |