Tạo Random Number Bằng Thư Viện Chuẩn Của C++ | CppDeveloper
Có thể bạn quan tâm
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 → C++ #include <iostream> #include <random> int main() { std::random_device true_random_generator; std::uniform_int_distribution<int> int_distribution(0, 9); int actual_distribution[10] = { 0,0,0,0,0,0,0,0,0,0 }; for (int i = 0; i < 10000; i++) { int result = int_distribution(true_random_generator); actual_distribution[result]++; } for (int i = 0; i < 10; i++) { std::cout << actual_distribution[i] << " "; } return 0; }1234567891011121314151617181920 | #include <iostream>#include <random> intmain(){std::random_device true_random_generator;std::uniform_int_distribution<int>int_distribution(0,9);intactual_distribution[10]={0,0,0,0,0,0,0,0,0,0}; for(inti=0;i<10000;i++){intresult=int_distribution(true_random_generator);actual_distribution[result]++;} for(inti=0;i<10;i++){std::cout<<actual_distribution[i]<<" ";} return0;} |
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 →
C++ 974 960 959 1048 1007 1038 994 1011 985 1024 # Chay lan 1 1003 986 968 1007 1015 1002 972 1032 996 1019 # Chay lan 212 | 97496095910481007103899410119851024# Chay lan 1100398696810071015100297210329961019# Chay lan 2 |
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++ #include <iostream> #include <random> int main() { std::default_random_engine pseudo_random_generator; std::uniform_int_distribution<int> int_distribution(0, 9); int actual_distribution[10] = { 0,0,0,0,0,0,0,0,0,0 }; for (int i = 0; i < 10000; i++) { int result = int_distribution(pseudo_random_generator); actual_distribution[result]++; } for (int i = 0; i <= 9; i++) { std::cout << actual_distribution[i] << " "; } return 0; }1234567891011121314151617181920 | #include <iostream>#include <random> intmain(){std::default_random_engine pseudo_random_generator;std::uniform_int_distribution<int>int_distribution(0,9);intactual_distribution[10]={0,0,0,0,0,0,0,0,0,0}; for(inti=0;i<10000;i++){intresult=int_distribution(pseudo_random_generator);actual_distribution[result]++;} for(inti=0;i<=9;i++){std::cout<<actual_distribution[i]<<" ";} return0;} |
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++ 1006 982 1042 997 1020 1063 1020 923 965 982 # Chay lan 1 1006 982 1042 997 1020 1063 1020 923 965 982 # Chay lan 212 | 10069821042997102010631020923965982# Chay lan 110069821042997102010631020923965982# Chay lan 2 |
Để 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ụ →
C++ #include <iostream> #include <random> #include <chrono> using namespace std::chrono; int main() { time_t currentTime = system_clock::to_time_t(system_clock::now()); std::default_random_engine pseudo_random_generator(currentTime); std::uniform_int_distribution<int> int_distribution(0, 9); int actual_distribution[10] = { 0,0,0,0,0,0,0,0,0,0 }; for (int i = 0; i < 10000; i++) { int result = int_distribution(pseudo_random_generator); actual_distribution[result]++; } for (int i = 0; i <= 9; i++) { std::cout << actual_distribution[i] << " "; } return 0; }123456789101112131415161718192021222324 | #include <iostream>#include <random>#include <chrono> usingnamespacestd::chrono; intmain(){time_t currentTime=system_clock::to_time_t(system_clock::now());std::default_random_engine pseudo_random_generator(currentTime);std::uniform_int_distribution<int>int_distribution(0,9);intactual_distribution[10]={0,0,0,0,0,0,0,0,0,0}; for(inti=0;i<10000;i++){intresult=int_distribution(pseudo_random_generator);actual_distribution[result]++;} for(inti=0;i<=9;i++){std::cout<<actual_distribution[i]<<" ";} return0;} |
123 | 96897798710001046104110189641015984# Chay lan 1108610221012951973100596594610151025# Chay lan 21024983101099210359789859679681058# Chay lan 3 |
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) —
Từ khóa » Thư Viện Hàm Random
-
Hàm Rand() Trong Thư Viện C Chuẩn - Hoclaptrinh
-
Hàm Rand() Trong C | Thư Viện C Chuẩn
-
Khai Báo Thư Viện Nào để Lấy Ra Hàm " Rand() " - Số Ngẫu Nhiên Trong ...
-
Random Số Trong C++ - STDIO
-
Thư Viện Winform - Hàm Random() Trong C#.net - IMIC Technology
-
Hàm Rand Trong C++
-
Hàm Rand Trong C
-
Phát Sinh Số Ngẫu Nhiên Trong C++ (Random Number Generation)
-
Phương Thức Random() Trong Thư Viện Math Java - Freetuts
-
Sinh Số Ngẫu Nhiên Trong C/C++, Sinh Số Random Trong đoạn [a,b]
-
Top 15 Hàm Random Chuỗi Trong C++
-
Top 15 Hàm Random Chuỗi Trong C
-
Cách Khởi Tạo Số Ngẫu Nhiên Trong C/C++ - Cùng Lập Trình