Sử dụng thư viện random trong C++11 để tạo số ngẫu nhiên

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ớpCách khai báoCông dụng
uniform_int_distributionTenLop doi_tuong(min, max);Tạo số nguyên trong khoảng xác định
uniform_real_distributionTenLop doi_tuong(min, max);Tạo số thực trong khoảng xác định
bernoulli_distributionTenLop 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;
}

Thẻ: C++ c++11 random uniform_int_distribution uniform_real_distribution

Đăng vào ngày 12 tháng 10 lúc 13:39