Giới thiệu về thư viện random trong C++11
Thư viện random trong C++11 cung cấp hai thành phần chính là engine tạo số ngẫu nhiên và phân phối số ngẫu nhiên.
Random Engine (Bộ tạo số ngẫu nhiên)
- Tên lớp tiêu biểu:
default_random_engine - Cách khai báo:
TenLop doi_tuong; - Đây là bộ tạo số ngẫu nhiên độc lập, có thể hoạt động riêng biệt.
- Nó tạo ra các số ngẫu nhiên với xác suất đồng đều (uniform) thuộc một kiểu dữ liệu nhất định.
- Không thể thiết lập khoảng giá trị hay xác suất, vì vậy thường không được sử dụng trực tiếp mà phải kết hợp với các phân phối.
Distribution (Phân phối số ngẫu nhiên)
- Phân phối cần có sự hỗ trợ từ một random engine để hoạt động.
- Có thể sinh ra các số ngẫu nhiên theo yêu cầu của người dùng như trong khoảng xác định hoặc theo phân phối xác suất cụ thể.
Các lớp phân phối phổ biến
| Tên lớp | Cách khai báo | Công dụng |
|---|---|---|
uniform_int_distribution | TenLop | Tạo số nguyên trong khoảng xác định |
uniform_real_distribution | TenLop | Tạo số thực trong khoảng xác định |
bernoulli_distribution | TenLop doi_tuong(xac_suat); | Tạo giá trị boolean theo xác suất (phân phối Bernoulli) |
Các ví dụ minh họa
1. Tạo số nguyên không dấu ngẫu nhiên
#include <iostream>
#include <random>
int main() {
std::default_random_engine engine;
for (int i = 0; i < 10; ++i) {
std::cout << engine() << "\n";
}
return 0;
}
2. Tạo số nguyên trong khoảng xác định
#include <iostream>
#include <random>
int main() {
std::default_random_engine engine;
std::uniform_int_distribution<unsigned> dist(0, 9);
for (int i = 0; i < 10; ++i) {
std::cout << dist(engine) << "\n";
}
return 0;
}
3. Tạo số thực trong khoảng xác định
#include <iostream>
#include <random>
int main() {
std::default_random_engine engine;
std::uniform_real_distribution<double> dist(0.0, 9.99);
for (int i = 0; i < 10; ++i) {
std::cout << dist(engine) << "\n";
}
return 0;
}
4. Tạo giá trị boolean theo xác suất
#include <iostream>
#include <random>
int main() {
std::default_random_engine engine;
std::bernoulli_distribution dist(0.3); // 30% true, 70% false
for (int i = 0; i < 10; ++i) {
std::cout << std::boolalpha << dist(engine) << "\n";
}
return 0;
}