Cách sử dụng hàm rand trong c++

Trong quá trình kiểm thử chương trình, vấn đề nhập số liệu có thể làm bạn cảm thấy vô cùng nhàm chán, mất thời gian và thậm chí là khiến bạn căng thẳng. Đặc biệt, điều này càng dễ dàng xảy ra hơn nếu bạn gặp phải lỗi phải sửa đi sửa lại nhiều lần hoặc số lượng số liệu cần nhập quá nhiều. Bài viết này hướng dẫn sử dụng 1 hàm tiện ích rand() để sinh ra các số ngẫu nhiên.

Tạo 1 số ngẫu nhiên

Để tạo ra một số ngẫu nhiên, cstdlib hỗ trợ hàm rand(). Hàm này trả về cho chúng ta kết quả là một giá trị nguyên có giá trị từ 0 đến RAND_MAX, với RAND_MAX là một hằng số được định nghĩa trong thư viện . Để sử dụng cần khai báo thư viện .

Ví dụ:

#include #include int main() { srand(time(NULL)); int res = rand(); return 0; }

Lưu ý: Giá trị RAND_MAX trên từng trình biên dịch là không giống nhau. Chẳng hạn như với trình biên dịch của Visual Studio 2019 cho C++, giá trị RAND_MAX là ‭32767‬. Kiểm tra giá trị này một cách dễ dàng bằng đoạn code ngắn gọn sau.

#include #include using namespace std; int main() { cout << RAND_MAX; return 0; }

Tạo số ngẫu nhiên thay đổi theo thời gian

Khi sử dụng hàm rand() để tạo ra một số ngẫu nhiên bất kì như trên. Ở bất kỳ lần chạy nào các kết quả ở mỗi lần chạy đều giống nhau theo thứ tự. Để mỗi lần chạy cho ra 1 chuỗi kết quả khác nhau, thay đổi random seed bằng cách sử dụng hàm srand() và truyền vào 1 con số có thể thay đổi được (thông thường sử dụng đơn vị thời gian hiện tại time(NULL) ở mỗi lần chạy - thư viện ). Đặt dòng code srand(time(NULL)) khi chương trình bắt đầu trước khi hàm rand() được sử dụng.

#include #include int main() { srand(time(NULL)); int res = rand(); return 0; }

Tạo số ngẫu nhiên với một khoảng xác định

Hai cách sử dụng trên đều cho kết quả giá trị ngẫu nhiên là những giá trị trong khoảng từ 0 đến RAND_MAX. Để tạo ra một giá trị ngẫu nhiên trong khoảng xác định, sử dụng công thức rand() % (max – min + 1) + min để nhận kết quả trong khoảng từ min đến max.

Ví dụ: random giá trị trong khoảng [3, 50]

#include #include int main() { srand(time(NULL)); int res = rand() % (50 - 3 + 1) + 3; return 0; }

Các bài hữu ích tương tự

Giải Thuật Sinh Chuỗi Ngẫu Nhiên

Làm sao để sinh số ngẫu nhiên trong C/C++? Hãy cùng Techacademy đi tìm cách để khởi tạo các số ngẫu nhiên sử dụng C/C++ nhé. Mình sẽ hướng dẫn các bạn khởi tạo các số ngẫu nhiên. Không chỉ sinh số nguyên ngẫu nhiên, mình sẽ hướng dẫn tạo 1 số ngẫu nhiên trong C ++ và cả cách phân biệt hàm rand và hàm srand () dùng để sinh số ngẫu nhiên nữa nhé. Các bạn cùng tìm hiểu với mình nhé.

I. Srand C++ Là Gì ?

Hàm srand() trong C

Hàm void srand(unsigned int seed) cung cấp seed cho bộ sinh số ngẫu nhiên được sử dụng bởi hàm rand.

Khai báo hàm srand() trong C

Dưới đây là phần khai báo cho srand() trong C:

void srand(unsigned int seed)

Tham số

seed: là một giá trị nguyên, được sử dụng như là seed bởi giải thuật sinh số ngẫu nhiên.

Trả về giá trị

Hàm này không trả về bất cứ giá trị nào.

Ví dụ

Chương trình C sau minh họa cách sử dụng của srand() trong C:

#include #include #include int main() { int i, n; time_t t; n = 5; /* Khoi tao bo sinh so ngau nhien */ srand((unsigned) time(&t)); /* in 5 so ngau nhien trong day tu 0 toi 50 */ for( i = 0 ; i < n ; i++ ) { printf("%d\n", rand() % 50); } return(0); }

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Cách sử dụng hàm rand trong c++
Srand C++ Là Gì ?

II. Tạo 1 Số Ngẫu Nhiên Trong C++

Để tạo ra các số ngẫu nhiên khác nhau tại tất cả thời điểm chạy code, chúng ta sẽ thêm hàm srand() và truyền vào 1 tham số seed kiểu int. Tham số này đổi thay thì hàm srand() sẽ sinh ra các số khác nhau.

Ví dụ:

srand(123456);

Trong trường hợp này, giá trị a vẫn sẽ không đổi ở các lần chạy do 123456 là một hằng số. Vậy, chúng ta sẽ cần truyền vào một giá trị động chứ không phải giá trị tĩnh 😀

Có một giải pháp tốt nhất là chúng ta sẽ truyền cho seed thời gian hiện tại. Bằng phương pháp sử dụng hàm time() trong thư viện time.h. Hàm time() trả về kiểu time_t nhưng chúng ta có thể convert về int.

srand((int) time(0));

Bằng cách thêm hàm này trước lúc gọi hàm rand(), chúng ta đã có thể sinh số ngẫu nhiên khác nhau.

Một thí dụ cụ thể:

#include #include #include int main(){ int r; srand((int)time(0)); for(int i = 0; i < 5; ++i){ r = rand(); printf("Rand %d is %d\n",i, r); } }

Kết quả chạy thử:

// Lần 1 Rand 0 is 5113 Rand 1 is 26832 Rand 2 is 11368 Rand 3 is 11635 Rand 4 is 20552 // Lần 2 Rand 0 is 5168 Rand 1 is 12947 Rand 2 is 20147 Rand 3 is 27496 Rand 4 is 32060

Ok, đã giải quyết được bài toán sinh số ngẫu nhiên cơ bản. Nhưng nếu tôi muốn sinh số ngẫu nhiên trong đoạn [min, max] thì phải làm thế nào?

Cách sử dụng hàm rand trong c++
Tạo 1 Số Ngẫu Nhiên Trong C++

III. Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Để tạo một số ngẫu nhiêu sau thay đổi khác nhau trong các lần chạy, bạn dùng hàm time (có trong #include). Theo như thư viện MSDN (Microsoft Developers Network) đề cập rằng: time trả về số của giây được trôi qua được tính từ nữa đêm (00:00:00), ngày 1, tháng 1, năm 1970 theo UTC . (“The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time (UTC), according to the system clock”).

– Các số ngẫu nhiên giả được tạo ra bắt đầu từ thời khắc bạn thiết lập sử dụng hàm srand. Dòng code dưới đây thiết lập điểm bắt đầu của thời gian hiện hành.

srand(time(0));

– Giá trị được trả về từ time là qua srand. Lưu ý rằng số ngẫu nhiên được tạo ra trước lời gọi rand.

Ví dụ với chương trình đầu tiên: chúng ta thêm srand(time(0)) trước lời gọi rand().

// Second example #include #include #include using namespace std; int main() { srand(time(0)); int r0 = rand(); int r1 = rand(); int r2 = rand(); int r3 = rand(); int r4 = rand(); cout<< "r0 = "<< r0 << endl; cout<< "r1 = "<< r1 << endl; cout<< "r2 = "<< r2 << endl; cout<< "r3 = "<< r3 << endl; cout<< "r4 = "<< r4 << endl; system("pause"); return 0; }

– Output lần đầu:

Cách sử dụng hàm rand trong c++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Output lần 2:

Cách sử dụng hàm rand trong c++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Output lần 3:

Cách sử dụng hàm rand trong c++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

IV. Tạo Số Ngẫu Nhiên Với Một Khoảng Xác Định Trong C++

Hai cách dùng trên đều cho kết quả giá trị ngẫu nhiên là những giá trị trong khoảng từ 0 đến RAND_MAX. Để tạo ra một giá trị ngẫu nhiên trong khoảng xác định, sử dụng công thức rand() % (max – min + 1) + min để nhận kết quả trong khoảng từ min đến max.

Ví dụ: random giá trị trong khoảng [3, 50]

#include #include int main() { srand(time(NULL)); int res = rand() % (50 - 3 + 1) + 3; return 0; }

Cách sử dụng hàm rand trong c++
Tạo Số Ngẫu Nhiên Với Một Khoảng Xác Định Trong C++

V. Phân Biệt Hàm Rand Và Hàm Srand() Dùng Để Sinh Số Ngẫu Nhiên

Để sinh số nguyên trong lập trình C/C++. Chúng ta có thể sử dụng hàm rand(). Hàm này trả về một số nguyên có kiểu dữ liệu là int

Ví dụ:

#include #include int main(){ int r; for(int i = 0; i < 5; ++i){ r = rand(); printf("Rand %d is %d\n",i, r); } }

Kết quả chạy thử:

Rand 0 is 41 Rand 1 is 18467 Rand 2 is 6334 Rand 3 is 26500 Rand 4 is 19169

Tuy nhiên, hàm rand() này sẽ không hề random ra những số mới lúc bạn chạy code ở các lần sau. Nghĩa là, kết quả của code trên ở tất cả lần chạy sẽ đều random ra 5 số giống nhau. Bạn có thể thử chạy đoạn code trên nhiều lần để kiếm chứng.
Vậy làm sao để random các số ngẫu nhiên tại mọi thời điểm? Hãy đọc phần tiếp theo nào.

Sinh số ngẫu nhiên trong C/C++ với srand()

Để tạo ra các số ngẫu nhiên khác nhau tại mọi thời điểm chạy code, chúng ta sẽ thêm hàm srand() và truyền vào 1 tham số seed kiểu int. Tham số này đổi thay thì hàm srand() sẽ sinh ra các số khác nhau.

Ví dụ:

srand(123456);

Trong trường hợp này, giá trị a vẫn sẽ không đổi ở các lần chạy do 123456 là một hằng số. Vậy, chúng ta sẽ cần truyền vào một giá trị động chứ không phải giá trị tĩnh

Có một giải pháp tốt nhất là chúng ta sẽ truyền cho seed thời gian hiện tại. Bằng cách sử dụng hàm time() trong thư viện time.h. Hàm time() trả về kiểu time_t nhưng chúng ta có thể convert về int.

srand((int) time(0));

Bằng cách thêm hàm này trước khi gọi hàm rand(), chúng ta đã có thể sinh số ngẫu nhiên khác nhau.

Một ví dụ cụ thể:

#include #include #include int main(){ int r; srand((int)time(0)); for(int i = 0; i < 5; ++i){ r = rand(); printf("Rand %d is %d\n",i, r); } }

Kết quả chạy thử:

// Lần 1 Rand 0 is 5113 Rand 1 is 26832 Rand 2 is 11368 Rand 3 is 11635 Rand 4 is 20552 // Lần 2 Rand 0 is 5168 Rand 1 is 12947 Rand 2 is 20147 Rand 3 is 27496 Rand 4 is 32060
Cách sử dụng hàm rand trong c++
Phân Biệt Hàm Rand Và Hàm Srand() Dùng Để Sinh Số Ngẫu Nhiên