Chương trình đơn giản sử dụng rand() để sinh dãy 10 số nguyên ngẫu nhiên trong khoảng [1, 100].
Mã nguồn
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
int max_n = 100;
int min_n = 1;
int num;
srand(time(nullptr)); // Seed bằng thời gian
cout << "10 so ngau nhien [1, 100]:\n";
for (int i = 0; i < 10; ++i) {
num = min_n + rand() % (max_n - min_n + 1);
cout << num << " ";
}
cout << endl;
}
Kết quả mẫu
10 so ngau nhien [1, 100]: 42 68 35 1 70 25 79 59 63 65
Cải tiến: Tránh modulo bias
rand() % N gây lệch phân phối nếu RAND_MAX không chia hết cho N. Cách khắc phục:
int rand_range(int min, int max) {
int range = max - min + 1;
int limit = RAND_MAX - (RAND_MAX % range);
int r;
do {
r = rand();
} while (r >= limit);
return min + r % range;
}
C++11: Cách hiện đại (Khuyến nghị)
#include <iostream>
#include <random>
int main() {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dist(1, 100);
cout << "10 so ngau nhien [1, 100]:\n";
for (int i = 0; i < 10; ++i) {
cout << dist(gen) << " ";
}
cout << endl;
}
Ưu điểm <random>
- Không modulo bias
- Chất lượng ngẫu nhiên tốt (Mersenne Twister)
- Thread-safe (mỗi thread dùng engine riêng)
- Hỗ trợ nhiều phân phối (normal, exponential, poisson...)
Tóm tắt
- Cách cũ:
srand(time(0))+rand() % range - Cách tốt hơn: Loại bỏ modulo bias với rejection sampling
- Cách tốt nhất (C++11+):
random_device+mt19937+uniform_int_distribution