1. Giới thiệu
Trong lập trình, số ngẫu nhiên được sử dụng cho nhiều mục đích khác nhau và đặc biệt được ứng dụng rộng rãi trong ngôn ngữ C. Số ngẫu nhiên là một khái niệm quan trọng, được áp dụng trong nhiều tình huống như tạo kịch bản trò chơi, lấy mẫu ngẫu nhiên, xáo trộn dữ liệu, v.v. Bài viết này sẽ giải thích chi tiết cách tạo số ngẫu nhiên trong C và đưa ra các ví dụ minh họa cách sử dụng thực tế. Hãy cùng tìm hiểu sâu hơn về việc tạo số ngẫu nhiên trong C và mở rộng khả năng ứng dụng của bạn.
2. Số ngẫu nhiên là gì
Khái niệm số ngẫu nhiên và số giả ngẫu nhiên
Số ngẫu nhiên là các giá trị không thể dự đoán trước, thường được tạo ra ngẫu nhiên trong một phạm vi nhất định. Tuy nhiên, số ngẫu nhiên được máy tính tạo ra thực chất là “số giả ngẫu nhiên” (pseudorandom number) — chúng được tạo ra dựa trên một thuật toán, vì vậy không hoàn toàn ngẫu nhiên. Số giả ngẫu nhiên có đặc điểm là nếu sử dụng cùng một giá trị seed (giá trị khởi tạo), chúng sẽ tạo ra cùng một chuỗi số ngẫu nhiên.
3. Cách tạo số ngẫu nhiên trong C
Ngôn ngữ C cung cấp sẵn các hàm trong thư viện tiêu chuẩn để tạo số ngẫu nhiên. Phần này sẽ giải thích chi tiết về các hàm thường dùng: rand()
, RAND_MAX
và hàm thiết lập seed srand()
.
Cơ bản về hàm rand()
Hàm rand()
là hàm cơ bản để tạo số ngẫu nhiên trong C. Hàm này trả về một số nguyên ngẫu nhiên từ 0 đến RAND_MAX
. RAND_MAX
là một hằng số được định nghĩa trong thư viện, giá trị có thể thay đổi tùy hệ thống, nhưng thường là 32767.
#include <stdio.h>
#include <stdlib.h>
int main() {
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
Đoạn code trên sử dụng rand()
để tạo và hiển thị một số nguyên ngẫu nhiên từ 0 đến 32767.
Thiết lập seed với hàm srand()
Hàm rand()
tạo số dựa trên giá trị seed. Mặc định, nếu không thay đổi seed, chương trình sẽ tạo ra cùng một chuỗi số mỗi lần chạy. Để tránh điều này, có thể dùng srand()
để đặt seed khác nhau, ví dụ như sử dụng thời gian hiện tại.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL)); // Khởi tạo seed bằng thời gian hiện tại
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
Ví dụ trên sử dụng time(NULL)
để lấy thời gian hiện tại làm seed, giúp tạo ra các giá trị khác nhau mỗi lần chạy chương trình.
Tạo số ngẫu nhiên trong một phạm vi nhất định
Để tạo số ngẫu nhiên trong một phạm vi (ví dụ từ 1 đến 10), có thể làm như sau:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int min = 1;
int max = 10;
int random_number = min + rand() % (max - min + 1);
printf("Random number between %d and %d: %d\n", min, max, random_number);
return 0;
}
Đoạn code trên tạo ra một số nguyên ngẫu nhiên từ 1 đến 10, bằng cách sử dụng rand() % (max - min + 1)
để giới hạn phạm vi.

4. Ứng dụng của số ngẫu nhiên
Dưới đây là một số ví dụ ứng dụng số ngẫu nhiên.
Mô phỏng xúc xắc
Có thể mô phỏng việc tung xúc xắc bằng cách tạo số ngẫu nhiên từ 1 đến 6.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int dice_roll = 1 + rand() % 6;
printf("Dice roll: %d\n", dice_roll);
return 0;
}
Chương trình này sẽ in ra kết quả ngẫu nhiên từ 1 đến 6.
Xáo trộn mảng
Có thể xáo trộn thứ tự các phần tử trong mảng bằng cách hoán đổi ngẫu nhiên các phần tử.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *array, int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int main() {
srand((unsigned int) time(NULL));
int array[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(array) / sizeof(array[0]);
shuffle(array, size);
printf("Shuffled array: ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
Đoạn code trên sẽ xáo trộn các phần tử trong mảng một cách ngẫu nhiên.
Ứng dụng trong phát triển game
Trong phát triển game, số ngẫu nhiên được dùng để xác định vị trí xuất hiện của kẻ địch, tạo vật phẩm, hoặc các yếu tố bất ngờ khác, giúp trò chơi trở nên sinh động và khó đoán.
5. Lưu ý khi tạo số ngẫu nhiên
Giới hạn của hàm rand()
rand()
đủ tốt cho các ứng dụng cơ bản, nhưng do là số giả ngẫu nhiên nên có chu kỳ lặp lại. Khi tạo ra một lượng lớn số ngẫu nhiên, có thể xuất hiện các mẫu tuần hoàn, không phù hợp với yêu cầu ngẫu nhiên hoàn toàn.
Vấn đề trong môi trường đa luồng
Trong môi trường đa luồng, nếu nhiều luồng sử dụng cùng một seed, chúng có thể tạo ra cùng một chuỗi số ngẫu nhiên. Do đó, cần đảm bảo mỗi luồng có seed riêng.
Sử dụng bộ tạo số ngẫu nhiên chất lượng cao
C++ và các ngôn ngữ khác cung cấp nhiều bộ tạo số ngẫu nhiên chất lượng cao hơn. Trong C, có thể sử dụng random()
hoặc thuật toán Mersenne Twister (mt19937
) để có chất lượng ngẫu nhiên tốt hơn.
6. Kết luận
Bài viết đã giới thiệu cách tạo số ngẫu nhiên trong C, kèm theo các ví dụ minh họa và ứng dụng thực tế. Hàm rand()
rất hữu ích cho các chương trình cơ bản, nhưng nếu yêu cầu tính ngẫu nhiên cao, cần cân nhắc các phương pháp tạo số ngẫu nhiên tiên tiến hơn.