Hàm rand() trong C chỉ sinh số ngẫu nhiên từ 0 đến RAND_MAX. Để sinh số trong khoảng [min, max], ta dùng công thức toán học đơn giản.
Công thức
random = (rand() % (max - min + 1)) + min;
rand() % (max - min + 1)cho giá trị0 .. (max-min).- Cộng
mindịch chuyển về khoảng[min, max].
Khởi tạo seed (hạt giống)
Dùng srand(time(0)) để seed bằng thời gian hiện tại (giây từ epoch), đảm bảo dãy số khác nhau mỗi lần chạy. Chỉ gọi srand một lần ở đầu chương trình.
Ví dụ hoàn chỉnh
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Hàm sinh 'count' số ngẫu nhiên trong [l, r]
void generate_random(int l, int r, int count) {
for (int i = 0; i < count; i++) {
int rand_num = (rand() % (r - l + 1)) + l;
printf("%d ", rand_num);
}
}
int main() {
int lower = 10, upper = 15, count = 15;
srand(time(0)); // Seed bằng thời gian hiện tại
printf("15 so ngau nhien trong [%d, %d]:\n", lower, upper);
generate_random(lower, upper, count);
printf("\n");
return 0;
}
Kết quả mẫu
15 so ngau nhien trong [10, 15]: 15 11 13 10 13 10 15 11 14 12 12 13 12 13 14
⚠️ Hạn chế của rand()
- Phân phối không đồng đều hoàn hảo (modulo bias) khi
RAND_MAXkhông chia hết cho(max-min+1). - Không phù hợp cho mật mã học (cryptography).
- Chu kỳ lặp ngắn, chất lượng ngẫu nhiên thấp.
Giải pháp tốt hơn (C++11 trở lên)
#include <random>
#include <iostream>
int main() {
std::random_device rd; // Nguồn entropy phần cứng
std::mt19937 gen(rd()); // Mersenne Twister engine
std::uniform_int_distribution<> dist(10, 15); // Phân phối đều [10,15]
for (int i = 0; i < 15; ++i)
std::cout << dist(gen) << ' ';
return 0;
}
Với C thuần, rand() vẫn đủ dùng cho bài tập, mô phỏng đơn giản. Với ứng dụng yêu cầu chất lượng ngẫu nhiên cao, hãy dùng <random> của C++.