Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Sinh số ngẫu nhiên trong C++ (rand, srand)

Cách truyền thống sinh số ngẫu nhiên trong C++ sử dụng rand() và srand() từ thư viện C (<cstdlib>, <ctime>).

Cơ chế

  • srand(seed): Khởi tạo seed cho bộ sinh số ngẫu nhiên
  • rand(): Trả về số pseudo-random trong khoảng [0, RAND_MAX]
  • RAND_MAX: Hằng số tối thiểu 32767

Ví dụ cơ bản: Số ngẫu nhiên 0-99

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
    int max = 100;
    srand(time(0));  // Seed bằng thời gian hiện tại
    
    cout << "So ngau nhien: " << rand() % max << endl;
}

Kết quả (mỗi lần chạy khác nhau)

So ngau nhien: 51
So ngau nhien: 29
So ngau nhien: 47

Hàm sinh số trong khoảng [min, max]


int random_in_range(int min, int max) {
    return min + rand() % (max - min + 1);
}

Nhược điểm của rand()/srand()

Vấn đềMô tả
Chất lượng thấpThường dùng Linear Congruential Generator (LCG) kém
Phân phối không đềuModulo bias khi dùng %
Không an toàn cho cryptoDễ dự đoán
Trạng thái toàn cụcKhông thread-safe, khó quản lý nhiều generator
RAND_MAX nhỏThường chỉ 32767

Cách hiện đại: C++11 <random> (Khuyến nghị)

#include <iostream>
#include <random>

using namespace std;

int main() {
    // Engine: Mersenne Twister 19937 - chất lượng cao
    random_device rd;           // Seed thật ngẫu nhiên (hardware)
    mt19937 gen(rd());          // Generator
    
    // Distribution: Phân phối đều [1, 100]
    uniform_int_distribution<> dist(1, 100);
    
    for (int i = 0; i < 5; ++i) {
        cout << dist(gen) << " ";
    }
}

Các phân phối phổ biến

Phân phốiDùng cho
uniform_int_distributionSố nguyên đều
uniform_real_distributionSố thực đều
normal_distributionPhân phối chuẩn (Gaussian)
bernoulli_distributionTrue/False với xác suất p
poisson_distributionSố sự kiện trong khoảng thời gian

Tóm tắt

  • Code cũ/đơn giản: srand(time(0)) + rand() % N
  • Code hiện đại/chuyên nghiệp: random_device + mt19937 + uniform_int_distribution
  • Luôn tách biệt engine (sinh bit ngẫu nhiên) và distribution (biến đổi phân phối)