Tạo random number bằng thư viện chuẩn của C++

Trong C++ có 2 cách để tạo random number sử dụng thư viện chuẩn (standard libraries) random.

True Random Number Generator (TRNG) – Tạo số random thật

Trong C++, để tạo số random thật (không thể biết trước) thì có thể sử dụng std::random_device trong thư viện random.

Hãy xem ví dụ bên dưới →

Mình giải thích qua một chút. Chương trình này thực hiện sinh số random kiểu int nằm trong khoảng 0 đến 9, sử dụng TRNG. Sau đó in ra kết quả để check xem mỗi số từ 0 đến 9 được sinh ra bao nhiêu lần. Khi chạy chương trình này thì mỗi lần chạy sẽ cho ra một kết quả khác nhau →

Pseudo Random Number Generator (PRNG) – Tạo số random giả

Trong C++, để tạo số random giả thì có thể sử dụng std::default_random_engine trong thư viện random. Sở dĩ gọi là số random giả là vì kết quả của PRNG là một số trông có vẻ random nhưng thực ra không phải là random, nó là kết quả xác định trước của thuật toán xác định nên hoàn toàn có thể tái hiện lại nếu biết trạng thái của PRNG.

Ví dụ →

Cũng giống như chương trình bên trên, chương trình này thực hiện sinh số random kiểu int nằm trong khoảng 0 đến 9, sử dụng PRNG. Sau đó in ra kết quả để check xem mỗi số từ 0 đến 9 được sinh ra bao nhiêu lần. Tuy nhiên điểm khác biệt ở đây là khi chạy chương trình này thì các lần chạy đều cho ra một kết quả giống nhau →

Để có thể cho ra kết quả khác nhau với mỗi lần chạy thì cần khởi tạo giá trị cho biến pseudo_random_generator khách nhau với mỗi lần chạy (giá trị này gọi là seed). Thông thường người ta hay sử dụng thời gian hiện tại truyền vào làm giá trị seed ban đầu cho pseudo_random_generator . Ví dụ →

Sau khi sửa như trên thì mỗi lần chạy sẽ cho ra kết quả khác nhau →

Recap

Trên đây mình chỉ giởi thiệu 2 phương pháp sử dụng thư viện chuẩn của C++. Ngoài ra các bạn cũng có thể sử dụng thư viện của C, đó làm hàm rand() trong stdlib.h (hoặc cstdlib). Hoặc trên Linux cũng có thể sử dụng file /dev/urandom. Tuy nhiên với các hệ thống đề cao tính portable (khả năng trên cùng một source code có thể build chương trình chạy được trên các platform, hoặc OS khác nhau mà không cần sửa hoặc sửa rất ít) thì các bạn nên sử dụng thư viện chuẩn của C/C++ bất cứ khi nào có thể.

— Phạm Minh Tuấn (Shun) —